在没有引用的情况下保留数据

本文关键字:情况下 保留 数据 引用 | 更新日期: 2023-09-27 17:56:03

我在 C# 中遇到了一个问题,当我想对数据库进行查询时,我会创建一个DBQuerier()的新实例并对其调用 Run() 方法。

DBQuerier可以连接到多个数据库之一,具体取决于传递给 run 方法的内容 - 例如新DBQuerier().Run(DBEnum.CatDatabase);

DBQuerier是库的一部分,因为各种解决方案都使用它。

我有一个配置文件,我可以加载和解析它,将所有连接加载到内存中,用于枚举查找。但是,我不确定如何保留此信息。它看起来像一个依赖注入的工作:

new DBQuerier(new MyConnectionStringLoader()).Run(...)

但是,我不希望它每次以这种方式运行数据库查询时加载文件并解析它。我无法将其存储在 DBQuerier 中,因为每次都会创建并丢弃此对象。

如果我创建一个 ConnectionStringManager 类,如果它是静态的,那么我就不能将 MyConnectionStringLoader 完全依赖注入其中,这使得单元测试变得更加困难。如果我把它变成一个单例,我有一些类似的问题。

这个问题有好的解决方案吗?谷歌搜索它揭示了无数的帖子,说"永远不要使用静态类或单例",所以我很卡住。

在没有引用的情况下保留数据

似乎DbQuerier对任何数据库都做完全相同的事情。唯一更改的是连接字符串。

我会做这样的事情:

public interface IDbQuerier
{
    void Run();
}
public abstract class BaseDbQuerier : IDbQuerier
{
    private static IDictionary<DbEnum, string> _connections;
    static BaseDbQuerier()
    {
        _connections = // Load connection strings from configuration
    }
    protected abstract DbEnum Database { get; }
    public void Run()
    {
        string connectionString = _connections[Database];
        // DbQuerier logic
    }
}
public enum DbEnum
{
    CatDatabase,
    DogDatabase,
    TurtleDatabase
}

然后是不同的实现:

public class CatDbQuerier : BaseDbQuerier
{
    protected override DbEnum Database { get { return DbEnum.CatDatabase; } }
}
public class DogDbQuerier : BaseDbQuerier
{
    protected override DbEnum Database { get { return DbEnum.DogDatabase; } }
}
public class TurtleDbQuerier : BaseDbQuerier
{
    protected override DbEnum Database { get { return DbEnum.TurtleDatabase; } }
}

为每个数据库提供不同的实现将允许您使用您选择的 DI 框架轻松地将其注入到需要它的任何类中。

在您的情况下,单例(支持 DI)是有效的路线。