我有以下代码
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");
}
}
这样做我必须为我实现的每个提供者硬编码连接字符串。我想知道是否有动态方法来检索连接字符串或基于值构建它。
答案 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");
}
}
现在,您需要编写GetProviderTypeFromConfig
和GetConnectionFromConfig
的代码,这些代码将转到某些XML / JSON文件,甚至自己启动数据库连接,以获取实际使用的值。
这种类型的代码也变得更容易测试,因为每个部分都可以进行单元测试。