使用具有Dependency关键字和UnityContainer的属性进行初始化

时间:2012-01-24 05:14:28

标签: c# unity-container prism

我有一个类似于此的代码示例。

public class AdventureWorksRepository
{
    [Dependency]
    private AdventureWorksEntities Context
    {
        get; set;
    }

    public AdventureWorksRepository()
    {
         SelectDemo();
    }

    public void SelectDemo()
    {
        var productNames = Context.Products.Select(item => item.Name);

        foreach (var productName in productNames)
        {
           Console.WriteLine("Name : "productName);
        }
    }
}

和继承人主要的程序

private static void Main(string[] args)
{
    UnityProvider.Container = new UnityContainer();
    UnityProvider.Container.RegisterInstance<AdventureWorksEntities>(new AdventureWorksEntities());
    var repository = UnityProvider.Container.Resolve<AdventureWorksRepository>();
}

从我所理解的Dependency关键字应该告诉Unity初始化AdventureworksEntities属性但是我一直得到和null引用异常任何提示我正在做什么或假设错误

1 个答案:

答案 0 :(得分:2)

我建议您不要使用[Dependency]属性。使用它们,您可以在代码库中的任何位置引用容器。有关详细说明,请参阅this article

您可以告诉Unity您希望使用InjectionProperty这样的依赖注入

container.RegisterType(typeof(IMyInterface), typeof(MyImplementation), new InjectionProperty("MyProperty"));

代替。如果要将特定值注入该属性而不是让Unity解析该值,您还可以在InjectionProperty的构造函数中指定自己的值。

顺便说一下:您的财产必须是公开的。它不适用于私人财产。如果您不想公开该属性,则应该使用构造函数注入

public class AdventureWorksRepository
{
  private readonly AdventureWorksContext context;
  public AdventureWorksRepository(AdventureWorksContext context)
  {
    if(context == null) throw new ArgumentNullException("context");
    this.context = context;
  }
}