如何配置对象并覆盖该配置

本文关键字:配置 覆盖 对象 何配置 | 更新日期: 2023-09-27 18:04:25

我有以下接口和类:

public interface ILoggingService { ... }
public class LoggingService {
    public LoggingService(ILoggingRepository loggingRepository) { ... }
    ...
}
public interface ILoggingRepository { ... }
public class DatabaseLoggingRepository {
    public DatabaseLoggingRepository(string ConnectionString) { ... }
    ...
}
public class FileLoggingRepository {
    public FileLoggingRepository(string LogFilePath) { ... }
    ...
}

我正在重构我的软件,以使用Unity IoC框架,我正在寻找一种方法来传递特定的配置到每个ILoggingRepository实现。

我认为最好的方法是改变DatabaseLoggingRepository和FileLoggingRepository的构造函数,使其没有任何参数,并通过一些配置文件配置它们。但是,由于我的验收测试,我需要一种简单的方法来在运行测试时覆盖这些设置。

我是否在正确的轨道上,如果我是,我应该使用哪些配置文件?

如何配置对象并覆盖该配置

我们决定要做的是创建一个类,在您的示例中是LoggingConfiguration,并将其传递给存储库的构造。如果你使用Unity解析,它将使用Activator实例化这个类,而不必注册它。但是,在测试中,您只需创建派生配置类的新实例,并提供不同的值。

有意义吗?我还需要进一步说明吗?

更新:我决定提供一些额外的澄清。因此,您已经有了两个实现,现在您希望每个配置查询其适当的配置设置。

我将扩展ILoggingRepository的构造函数,看起来像这样:

   public ILoggingRepository(ILoggingConfigurationProvider confProvider);

你可以为你的正常操作创建一个实现,它有两个属性:

public LoggingConfigurationProvider : ILoggingConfigurationProvider {
 public LoggingConfigurationProvider() {
   // load both values from configuration file
 }
 public string LogPath { get; set; }
 public string ConnectionString { get; set; }
}

当你通过正常的IoC操作实例化你的类时,这将由容器解决,你的配置选项将从配置文件中加载。但是,当您想要进行单元测试时,您可以:

1)创建一个新的"Mock"实现

public class MockLoggingConfigurationProvider : ILoggingConfigurationProvider  {
   public MockLoggingConfigurationProvider() {
      // set both values to a test value
   }
   public string LogPath { get; set; }
   public string ConnectionString { get; set; }
}

现在您可以使用构造函数创建存储库:

new LoggingRepository(new MockLoggingConfigurationProvider());

或者如果您希望使用整个IoC机制,您只需(在设置容器时)注册接口的这个实现。因为单元测试是分开的,所以不会共享注册,对吧?因此,这应该给你你所需要的,改变这个设置的能力取决于他们是否被执行作为一个单元测试。

在现实生活中,我甚至不会为此烦恼,只是创建一个模拟日志存储库,并将其写在其他地方。除非您想要将存储库测试为测试数据库/文件。在这种情况下,我会按照指定的去做。

希望能有所帮助。

作为设计建议并不强制IoC处理配置内容。每个日志记录器都应该在其实现中以自己喜欢的方式管理配置。IoC应该只注入记录器。对于单元/集成测试,在这两种情况下,您都应该能够为日志记录器提供配置,例如,使用log4net,我用来通过api在测试的启动中配置日志子系统,并且我创建了一个appender,用于在控制台上编写所有内容。您不能通过IoC隔离配置,因为每个可能的日志系统不必共享配置部分的契约。