2016-03-22 117 views
2

我有以下代码同工厂模式

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

@Quality Catalyst更新了我的回复。 –

+1

为什么这是错的?在某些时候,您需要了解每个连接的具体情况。这几乎是工厂的定义 - 理解具体案例并返回一般情况的中心位置,客户不必这样做。之后,你从哪里获取字符串就只是编程。尝试一个配置文件? – LoztInSpace

回答

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

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