繁体   English   中英

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

[英]How to configure an object and override that configuration

我有以下接口和类:

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 ,并将其传递给存储库的constructo。 如果您使用Unity解析它将使用Activator实例化此类,wuthout必须注册它。 但是,在测试中,您只需更新派生配置类的新实例,从而提供不同的值。

这有道理吗? 我应该澄清一下吗?

更新 :我决定提供一些额外的说明。 因此,您已经有两个实现,现在您希望每个配置都查询其正确的配置设置。

我会将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操作实例化您的类时,这将由容器解决,您将从conf文件加载配置选项。 但是当你想要进行单元测试时:

1)创建一个新的“模拟”实现

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进行Insolate配置,因为每个可能的日志记录系统都不需要共享配置部分的合同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM