c# - 使用工厂模式创建连接字符串

标签 c#

我有以下代码

public static DatabaseFactory {
    public DatabaseProvider Create(dataSource, ProviderType provider type){
        //dataSource = "Server\Instance", "MyOracleDB" 

        if (type == ProviderType.Sql) 
            return new SqlDatabaseProvider("$data source = {dataSource}; integrated security = True; MultipleActiveResultSets = True;");

        throw new NotImplementedException("Provider not found"); 
    }
}

这样做时,我必须为我实现的每个提供程序硬编码一个连接字符串。我想知道是否有一种动态方法来检索连接字符串或基于值构建它。

最佳答案

工厂的目的是抽象一个对象的创建,这样调用代码就不需要知 Prop 体细节,可以在构造完成后进行加法操作,还可以返回一个子类工厂的返回类型。

因此更典型的情况是您的调用代码甚至不知道数据库类型。您的代码可能看起来更像这样:

var mainProvider = DatabaseFactory.Create("main");
var backupProvider =  DatabaseFactory.Create("backup");

那么你的工厂可能看起来像这样:

public static DatabaseFactory
{
    public static DatabaseProvider Create(string key)
    {
        var providerType = GetProviderTypeFromConfig(key);
        var connectionString = GetConnectionFromConfig(key);

        if (providerType == ProviderType.Sql) 
            return new SqlDatabaseProvider(connectionString);

        if (providerType == ProviderType.Oracle) 
            return new OracleDatabaseProvider(connectionString);

        throw new NotImplementedException("Provider not found"); 
    }
}

现在您需要为 GetProviderTypeFromConfigGetConnectionFromConfig 编写代码,它们将转至某个 XML/JSON 文件,甚至自行启动数据库连接,以获取实际使用的值。

这种类型的代码也变得更容易测试,因为每个部分都可以进行单元测试。

关于c# - 使用工厂模式创建连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36144681/

相关文章:

c# - 无法理解 C# 中的用户控件

c# - Azure 上的 Google Analytics API

c# - .NET Singleton 长时间运行的秒表实例

c# - 如何在转发器控件中查找控件?

c# - Process.OutputDataReceived 在哪个线程上引发和处理?

javascript - 在 foreach 语句中分别隐藏/取消隐藏每张照片

c# - 当我给 MyObject obj = new MyObject() 时发生了什么

c# - NancyFx 动态词典

c# - 将字节数组程序集加载到新的 AppDomain 会引发 FileNotFound 异常

c# - EventLog 记录在应用程序中,即使设置为另一个日志