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

Design patterns 使用采用不同初始化配置的实现实现IOC的设计模式,design-patterns,Design Patterns,以下是我希望构建的设计: 包含数据存储契约的接口历史记录。这将包含诸如Save、Retrieve等方法 在文件系统中存储数据的接口的一种实现 将数据存储在某个数据库中的接口的另一个实现 现在我想用Castle之类的东西实现IOC,这样我就可以插入任何我想要的行为。 但问题是两种实现的初始化配置参数会有所不同。例如,文件系统实现将以目录路径、凭据等作为配置,数据库实现可能采用连接字符串 因此,如果我创建一个公共配置接口,比如IConfiguration,它可以在两个实现(以及接口)中使用,它将包含

以下是我希望构建的设计:

  • 包含数据存储契约的接口历史记录。这将包含诸如Save、Retrieve等方法
  • 在文件系统中存储数据的接口的一种实现
  • 将数据存储在某个数据库中的接口的另一个实现
  • 现在我想用Castle之类的东西实现IOC,这样我就可以插入任何我想要的行为。 但问题是两种实现的初始化配置参数会有所不同。例如,文件系统实现将以目录路径、凭据等作为配置,数据库实现可能采用连接字符串

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


    那么我应该如何设计这个呢?我的方法对设计这样一个系统正确吗?如果不正确,还有什么更好的方法或模式呢?

    您似乎认为拥有一个配置接口意味着您只有一个配置部分

    但是,只有在只有一个实现的情况下,情况才会如此


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

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

    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...
    }
    

    谢谢Wiktor!按配置部分,您是指我们在.config文件中的部分还是相应的配置对象?如果需要,两者都指。配置是特定于实现的,您试图使其始终保持不变,这是错误的。好的。。这是有道理的。。因此..一种方法是,如果配置不是我希望实现的配置,则引发错误。但是有没有办法通过引入某种契约来强迫消费者提供一些特定的配置呢?如果我试图做的事情没有多大意义,我很抱歉。强制消费者提供任何配置都是不可能的。您可以验证并引发错误。