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

时间:2016-03-22 01:28:38

标签: 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"); 
    }
}

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

1 个答案:

答案 0 :(得分:1)

工厂的目的是抽象对象的创建,以便调用代码不需要知道具体细节,并且您可以在构造之后执行添加操作,并且您可以返回工厂的返回类型的子类。

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

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文件,甚至自己启动数据库连接,以获取实际使用的值。

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