当我
container.RegisterType<IInterface, MyClass>();
一切正常,所有依赖属性都注释为:
[Dependency]
通过容器解决。
但是,我现在有一个int属性,我也想通过容器解析。它不是在构造函数中传递的,而是作为公共属性传递的。所以我尝试了这个:
container.RegisterType<IInterface, MyClass>(
new InjectionProperty("PropertyName", 1)
);
现在该属性被注入,但使用[Dependency]注释的所有其他属性都为null且未解析。如果我将InjectionProperty用于一个属性,我现在是否必须显式声明具有[Dependency]属性的所有其他属性?或者有更好的方法吗?
感谢。
答案 0 :(得分:6)
虽然@najmeddine是正确的,但您仍然可以执行以下操作。
您的组件:
public class Service : IService
{
[Dependency("Key")]
public Int32 Value { get; set; }
}
注册:
IUnityContainer unity = new UnityContainer()
.RegisterType<IService, Service>()
.RegisterInstance("Key", 2010)
用法很简单。
如果您现在使用Unity 2.0或更高版本(不适合您),并且您需要在应用程序的不同区域(有界上下文)中注入不同的值,请使用容器层次结构:
IUnityContainer child = unity.CreateChildContainer()
.RegisterInstance("Key", 1900);
在child
Unity容器上解析您的组件。
有关容器层次结构的更多信息: http://msdn.microsoft.com/en-us/library/ff660895(PandP.20).aspx
答案 1 :(得分:1)
使用API(运行时)注册属性将取消[Dependency]属性。 你不能同时使用它们。但是您可以使用反射来获取使用[Dependency]属性修饰的属性,并在运行时注册它们。
答案 2 :(得分:0)
正如najmeddine所说,InjectionProperty
注册会覆盖[Dependency]
属性......但是,您仍然可以使用InjectionMethod
对象来覆盖[Dependency]
属性。
我用可选的“覆盖”方法构建了我的对象:
class SomeObject
{
[Dependency("Value")]
public string Value { get; set; }
public void OverrideValue(string value)
{
this.Value = value;
}
}
正常DI的工作原理如下:
container.RegisterInstance<string>("Value", "Default Value");
container.Resolve<SomeObject>();
如果覆盖了值,您将执行以下操作:
container.RegisterType<SomeObject>("NotDefault", new InjectionMethod("OverrideValue", "Other Value"));
container.Resolve<SomeObject>("NotDefault");
我刚刚把这个写在了我的头顶,所以我提前为任何错别字道歉。 (如果您发现任何评论,我会很乐意调整我的答案。)