在没有引用的情况下保留数据
本文关键字:情况下 保留 数据 引用 | 更新日期: 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)是有效的路线。