如何配置对象并覆盖该配置
本文关键字:配置 覆盖 对象 何配置 | 更新日期: 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隔离配置,因为每个可能的日志系统不必共享配置部分的契约。