构造函数注入与 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?
提前致谢
这就是你如何回答他的"效果很好"(和非技术性)论点。
如果有的话,他对params Tuple<string, object>
的方法充其量是可怕的:维护噩梦,重构工具的零支持。服务定位器实际上是伪装的单例。
使用适当的 IoC,您可以提升您选择的容器提供的任何高级功能:不同的生存期、构造函数和属性注入、对Func<>
和Lazy<>
的支持等。使用服务定位器,您不会得到这些。