Unity - InjectionProperty导致null属性?

时间:2009-09-02 21:50:41

标签: c# dependency-injection unity-container

当我

container.RegisterType<IInterface, MyClass>();

一切正常,所有依赖属性都注释为:

[Dependency]

通过容器解决。

但是,我现在有一个int属性,我也想通过容器解析。它不是在构造函数中传递的,而是作为公共属性传递的。所以我尝试了这个:

container.RegisterType<IInterface, MyClass>(
  new InjectionProperty("PropertyName", 1) 
);

现在该属性被注入,但使用[Dependency]注释的所有其他属性都为null且未解析。如果我将InjectionProperty用于一个属性,我现在是否必须显式声明具有[Dependency]属性的所有其他属性?或者有更好的方法吗?

感谢。

3 个答案:

答案 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");

我刚刚把这个写在了我的头顶,所以我提前为任何错别字道歉。 (如果您发现任何评论,我会很乐意调整我的答案。)