构造函数注入与 IocFactory

本文关键字:IocFactory 注入 构造函数 | 更新日期: 2023-09-27 17:56:40

今天在工作中,我和一位同事讨论了以下内容:

基本上,我们有一个规则引擎,其工作方式如下:

规则执行器

  • 获取要在构造函数中执行的所有规则,如public RuleExecutor(ICollection<IRule> rulesToExecute) { ... }

  • 通过为每个规则调用rule.ApplyRule();来执行所有规则

规则

  • 提供执行规则的方法 ApplyRule();

现在我们希望在 cron 作业中执行 RuleExecutor。

我们讨论了如何检索 RuleExecutor 的实例。

我认为"正确的方法"是通过构造函数注入

public RuleCronJob(IRuleExecutor ruleExecutor) { ... }

我的同事想要使用具有静态方法GetInstance<>的"IocFactory"。因此,在 cron 作业的"执行方法"中,他会做类似 var ruleExecutor = IocFactory.GetInstance<IRuleExecutor>();

public static TType GetInstance<TType>(params Tuple<string, object>[] constructorParameters)
    {
        if (constructorParameters.Any())
        {
            var constructorArgs = new Collection<ConstructorArgument>();
            foreach (var parameter in constructorParameters)
            {
                constructorArgs.Add(new ConstructorArgument(parameter.Item1, parameter.Item2, true));
            }
            return Kernel.Value.Get<TType>(constructorArgs.Cast<IParameter>().ToArray());
        }
        return Kernel.Value.Get<TType>();
    }

Kernel 是 Ninject 的标准内核。

我认为构造函数注入更好,因为它允许更容易的测试(模拟),IocFactory 实际上是一个"服务定位器",我认为这是一种反模式,IocFactory 为 cronjob 添加了另一个依赖项,这是不必要的......但我无法说服他使用它,因为他认为 IocFactory "也很好用,所以为什么不使用它"......

    有什么
  • 论据可以说服他使用构造函数注入而不是 IocFactory?

提前致谢

构造函数注入与 IocFactory

这就是你如何回答他的"效果很好"(和非技术性)论点。

如果有的话,他对params Tuple<string, object>的方法充其量是可怕的:维护噩梦,重构工具的零支持。服务定位器实际上是伪装的单例。

使用适当的 IoC,您可以提升您选择的容器提供的任何高级功能:不同的生存期、构造函数和属性注入、对Func<>Lazy<>的支持等。使用服务定位器,您不会得到这些。