我正在使用Unity框架通过以下界面将ConfigurationProvider注入到我的一些类中:
interface IConfigurationProvider<T>{
T GetConfiguration();
}
然后,在我的Unity引导程序中,
container.RegisterType(typeof (IConfigurationProvider<DongleConfiguration>),
typeof (DongleConfigurationProvider));
到目前为止,这是一个很好的策略。允许我为各种实现定义不同的配置提供程序。试验。现在,我希望其中一个提供程序使用命令行参数来设置配置对象,这需要我将args
参数传递给ctor:
class ProblematicConfigurationProvider : IConfigurationProvider<ProblematicConfiguration> {
...
public ProblematicConfigurationProvider(string[] args) { ... }
...
}
我读过我可以使用ParameterOverride
提供可选的ctor参数:
var configObj = container.Resolve<IConfigurationProvider<ProblematicConfiguration>>(new ParameterOverride("args", args));
但是,我正在使用DI“一直”并依赖容器在解析RootObject
或我的顶级类之后解决依赖关系。我的问题是,如果它被隐藏在我的依赖图中的某个地方,我现在如何使用我刚刚解决的configObj
对象?如何在另一次调用Resolve
时使用已解析的对象?是否会通过ParameterOverride
的类似用途?有没有办法在某处设置param覆盖&amp;让Unity使用它而不实际实例化configObj
?
答案 0 :(得分:3)
我会这样做。将CommandLineArguments类添加到项目中,该类只包装命令行参数。作为容器初始化的一部分,请使用容器注册:
container.RegisterInstance(new CommandLineArguments(args));
然后您的ConfigurationProvider应该具有CommandLineArguments的依赖关系,而不是string []。从那里开始,它应该自然地“一直向下”解决所有问题,而不使用参数覆盖。
由于您的命令行参数不会改变,因此我认为这更简单。
注意:我使用CommandLineArguments类型,因为它更加描述了正在发生的事情。你可以将字符串[]直接注册到容器中,但这对我来说会有点奇怪,并且可能会在你不期望的地方注入命令行参数。