将命令行参数与Unity DI一起使用的策略
本文关键字:策略 一起 DI 命令行 参数 Unity | 更新日期: 2023-09-27 18:00:27
我使用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
使用吗?有没有一种方法可以在某个地方设置参数覆盖&Unity是否在没有实际实例化configObj
的情况下使用它?
我会采取不同的做法。将CommandLineArguments类添加到项目中,该类只封装命令行参数。作为容器初始化的一部分,请在容器中注册:
container.RegisterInstance(new CommandLineArguments(args));
那么ConfigurationProvider应该具有CommandLineArguments的依赖项,而不是字符串[]。从那时起,它应该只自然地"一直向下"解决所有问题,而不使用参数重写。
由于你的命令行参数不会改变,所以在我看来,这会让它变得简单得多。
注意:我使用CommandLineArguments类型是因为它更能描述正在发生的事情。你可以将字符串[]直接注册到容器中,但这对我来说有点奇怪,可能会将命令行参数注入到你意想不到的地方。