使用不同初始化配置的实现来实现IOC的设计模式

时间:2014-06-12 14:13:26

标签: design-patterns

这是我想要构建的设计:

  1. 包含用于存储数据的合同的IStorage接口。这将包含Save,Retrieve等方法
  2. 将数据存储在文件系统中的接口的一种实现。
  3. 将数据存储在某个数据库中的接口的另一种实现。
  4. 现在我想使用像Castle这样的东西来实现IOC,这样我就可以插入我想要的任何行为。 但问题是两个实现的初始化配置参数会有所不同。例如,文件系统实现将采用目录路径,凭据等。作为配置和数据库,可能会采用连接字符串。

    因此,如果我创建一个公共配置接口,假设可以在两个实现(和接口)中使用的IConfiguration,它将包含与一个或其他实现无关的属性。

    那我应该如何设计呢?我的方法是否适合设计这样一个系统,如果不是,那么更好的方法或模式是什么?

2 个答案:

答案 0 :(得分:1)

您似乎假设拥有一个配置界面意味着您只有一个配置部分。

但只有当你只有一个实现时才会这样!

换句话说,允许不同的实现具有自己的特定配置部分。

答案 1 :(得分:1)

特定于实现的配置在具体类的构造函数中,并且不是接口的一部分:

public class FileStorage : IStorage
{
    private readonly DirectoryInfo directory;
    private readonly Credentials credentials;

    public FileStorage(DirectoryInfo directory, Credentials credentials)
    {
        this.directory = directory;
        this.credentials = credentials;
    }

    // implement Save, Retrieve, etc. methods here...
}

public class SqlStorage : IStorage
{
    private readonly string connectionString;

    public SqlStorage(string connectionString)
    {
        this.connectionString = connectionString;
    }

    // implement Save, Retrieve, etc. methods here...
}