我有一个界面:
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。
答案 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
是一种依赖。如果您不希望它这样做,请告诉它。此行为与构造函数的行为一致。