在Unity中使用Method Injection时是否可以覆盖参数值?

时间:2010-08-12 05:10:25

标签: .net dependency-injection inversion-of-control unity-container

它在Unity手册中说...

  

ParameterOverride只能用于构造函数。

那么为什么方法的参数被遗漏了?

干杯,伊恩。

2 个答案:

答案 0 :(得分:1)

在DI框架中,我们通常有constructor injection or property injection

构造函数注入是指框架构造实例并自动提供与构造函数的参数匹配的实例。

属性注入是指在创建实例后,具有容器支持的类型的任何属性自动设置为该类型的实例。

属性通常不支持参数,因此PropertyOverride仅对构造函数注入有意义。

Unity中的

更新: method injection允许在实例上调用方法,将参数传递给方法调用:

container.RegisterType<DriveController>(
       new InjectionMethod("InitializeMe", 42.0, 
       new ResolvedParameter<ILogger>("SpecialLogger")));

InjectionMethod类强制您为所有方法参数提供值。在这种情况下使用ParameterOverride没有多大意义,因为我们已经为解析器提供了显式值。

注意: ParameterOverride仅适用于构造函数参数的技术原因是支持方法覆盖有一些问题。考虑以下课程:

public class Foo
{
      public Foo(IService service) { ... }
      public void Initialize(IService service) { ... }
}

container.Resolve<IFoo>(new ParameterOverride("service", new Service()));

应该覆盖哪个参数?

如果你需要在解析时提供参数值,我建议改用工厂代表。转换上面的示例:

container.RegisterInstance<Func<int, DriveController>>(
    number => {
                  var dc = new DriveController();
                  dc.InitializeMe(number, container.Resolve<ILogger>("SpecialLogger"));
                  return dc;
              });

var factory = container.Resolve<Func<int, DriveController>>();
var dc = factory(42);

我没有用Unity试过这个。我认为它会起作用,至少它表明应该有“解决时间”提供参数值的替代方案。

答案 1 :(得分:1)

我很遗憾地把它排除在外的原因是开发和发展。测试时间,加上方法注入使用的次数远远少于构造函数或属性注入。特别是,我们的测试和文档团队坚持用他们的指甲试图跟上我扔它们的东西。

没有任何技术理由不予理会。 Override对象是可扩展的,因此如果您确实需要,创建自己的方法参数值是完全合理的。