在Unity DI中使用命令行参数的策略?

时间:2011-06-23 19:29:45

标签: c# .net dependency-injection unity-container

我正在使用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

1 个答案:

答案 0 :(得分:3)

我会这样做。将CommandLineArguments类添加到项目中,该类只包装命令行参数。作为容器初始化的一部分,请使用容器注册:

container.RegisterInstance(new CommandLineArguments(args));

然后您的ConfigurationProvider应该具有CommandLineArguments的依赖关系,而不是string []。从那里开始,它应该自然地“一直向下”解决所​​有问题,而不使用参数覆盖。

由于您的命令行参数不会改变,因此我认为这更简单。

注意:我使用CommandLineArguments类型,因为它更加描述了正在发生的事情。你可以将字符串[]直接注册到容器中,但这对我来说会有点奇怪,并且可能会在你不期望的地方注入命令行参数。