将命令行参数与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的情况下使用它?

将命令行参数与Unity DI一起使用的策略

我会采取不同的做法。将CommandLineArguments类添加到项目中,该类只封装命令行参数。作为容器初始化的一部分,请在容器中注册:

container.RegisterInstance(new CommandLineArguments(args));

那么ConfigurationProvider应该具有CommandLineArguments的依赖项,而不是字符串[]。从那时起,它应该只自然地"一直向下"解决所有问题,而不使用参数重写。

由于你的命令行参数不会改变,所以在我看来,这会让它变得简单得多。

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