C# 在没有引用的情况下持久化数据

C# 在没有引用的情况下持久化数据,c#,C#,我在C语言中遇到了一个问题,当我想查询数据库时,我创建了我的dbqueryer()的一个新实例,并对其调用Run()方法 dbqueryer可以连接到多个数据库中的一个,具体取决于传递给run方法的内容-例如newdbqueryer().run(DBEnum.CatDatabase) dbqueryer是库的一部分,因为各种解决方案都使用它 我有一个配置文件,可以加载和解析它,以将所有连接加载到内存中,用于枚举查找。但是,我不确定如何保存这些信息。它看起来像一个依赖项注入作业: newdbque

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

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

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

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

newdbqueryer(newmyconnectionstringloader())。运行(…)

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

如果我创建了一个ConnectionStringManager类,如果它是静态的,那么我就不能将MyConnectionStringLoader干净地注入依赖项,这会使单元测试变得更加困难。如果我让它成为单身,我会有一些类似的问题


有解决这个问题的好办法吗?通过谷歌搜索发现,有无数帖子说“永远不要使用静态类或单例”,所以我很困惑。

在你的情况下,单例(支持DI)是一条有效的途径

在您的情况下,单例(支持DI)是一条有效的途径

似乎
dbqueryer
对任何数据库的作用都完全相同。唯一改变的是连接字符串

我会这样做:

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
}

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

似乎
dbqueryer
对任何数据库都完全相同。唯一改变的是连接字符串

我会这样做:

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
}

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

永不说不!我想说,在这种情况下,单例和静态是可以的。但是为什么不在DBQuerier周围创建一个类来保存您需要的附加信息,比如ConnectionString呢?千万不要说永不!我想说,在这种情况下,单例和静态是可以的。但是为什么你不围绕DBQuerier创建一个类来保存你需要的附加信息,比如ConnectionString呢?谷歌的搜索模式揭示了很多网站说Singleton和DI不好。。。但我认为你是对的,我必须忽视他们@SLC观点就像人体的一个特定区域……每个人都有一个。只要界面有意义,它有很好的文档记录,并且与系统的其他部分具有类似的操作启发模式,就应该使用它。。。但我认为你是对的,我必须忽视他们@SLC观点就像人体的一个特定区域……每个人都有一个。只要这个接口有意义,它有很好的文档记录,并且与系统的其他部分具有类似的操作启发式模式,就应该使用它。看起来很棒,我将尝试这种方法。非常感谢。看起来很棒,我要试试这个方法。非常感谢。