Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用工厂模式创建连接字符串_C# - Fatal编程技术网

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

C# 使用工厂模式创建连接字符串,c#,C#,我有以下代码 public static DatabaseFactory { public DatabaseProvider Create(dataSource, ProviderType provider type){ //dataSource = "Server\Instance", "MyOracleDB" if (type == ProviderType.Sql) return new SqlDatabaseProvi

我有以下代码

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

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

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

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

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"); 
    }
}
那么您的工厂可能是这样的:

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


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

请定义“更好”。@Quality Catalyst更新了我的回答。为什么这是错误的?在某些时候,您需要了解每个连接的细节。这几乎就是工厂的定义——了解具体案例并返回一般案例的中心位置,这样客户就不必这样做。之后,字符串的来源就是编程。尝试一个配置文件?@LoztInSpace配置文件听起来比用代码硬编码更好。