为什么Unity在解析具体类型时会使用属性注入?

时间:2012-02-03 00:43:55

标签: .net unity-container

我有一个界面:

 public interface IFoo{ 
     string Bar{ get; set; } 
 }

和接口的实现

public class RealFoo{
    public string Bar{ get; set; }
    public string Qux{ get; set; }
}

我已经通过配置文件配置了unity,使用属性注入将IFoo解析为RealFoo:

<register type="Namespace.IFoo, Assembly" mapTo="Namespace.RealFoo, Assembly">
    <property name="Qux" value="somevalue" />
</register>

如果我调用Resolve(typeof(RealFoo)),我的实例将.Qux设置为“somevalue”。这怎么可能?这是预期的行为吗?据我所知,如果我调用Resolve(typeof(IFoo))将.Qux设置为“somevalue”,但无法解释如何解析具体类型将设置.Qux。

2 个答案:

答案 0 :(得分:2)

使用统一注册和注入参数/构造函数时,您要为它映射到的类型定义它们。我不使用统一的配置文件,但在代码中它允许您执行以下操作:

unityContainer.RegisterType<IFoo, FooOne>("FooOne" new InjectionProperty("Qux", "somevalue"));
unityContainer.RegisterType<IFoo, FooTwo>("FooTwo", new InjectionProperty("Qux", "anothervalue"));

含义不同的具体类型可以具有不同的注入参数/属性。在统一中,除非命名注册,否则使用最后注册的混凝土注入参数。

请考虑以下事项:

unityContainer.RegisterType<IFoo, FooOne>(new InjectionProperty("Qux", "somevalue"));
unityContainer.RegisterType<FooOne>(new InjectionProperty("Qux", "anothervalue"));

如果我然后执行unityContainer.Resolve<IFoo>()unityContainer.Resolve<FooOne>()两者都会将“anothervalue”注入“Qux”,因为它将两者都解析为FooOne实例并且最后一次注册注入“Qux” “as”另一个值“。

答案 1 :(得分:0)

您还期望它做什么?它会为您注入依赖项。 Qux是一种依赖。如果您不希望它这样做,请告诉它。此行为与构造函数的行为一致。