我有以下代码
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");
}
}
现在您需要为 GetProviderTypeFromConfig
和 GetConnectionFromConfig
编写代码,它们将转至某个 XML/JSON 文件,甚至自行启动数据库连接,以获取实际使用的值。
这种类型的代码也变得更容易测试,因为每个部分都可以进行单元测试。
关于c# - 使用工厂模式创建连接字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36144681/