如何映射Unity以注入容器实例?

时间:2016-12-12 22:49:48

标签: c# winforms unity-container

我如何映射Unity以注入容器实例,我使用DependencyAttribute类但我总是得到一个实例null。

我可以尝试:

    static void Main()
    {
        using (var container = new UnityContainer())
        {
            container.RegisterType<Invoice, Invoice>(new HierarchicalLifetimeManager());
            container.RegisterType<Form1>().RegisterInstance<IUnityContainer>(container);

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(container.Resolve<Form1>());
        }
    }

   public partial class Form1 : Form
   {
       [Dependency]
        public IUnityContainer Container { get; set; }
        public Form1()
        {
            InitializeComponent();
            var invoice = Container.Resolve<Invoice>();
        }
    }

Value cannot be null.Parameter name: container

1 个答案:

答案 0 :(得分:1)

好的,所以你无法从构造函数中访问Container属性,因为它尚未设置。

如果您考虑如何手动创建对象,那么为什么不应该这样做:

Form1 myForm = new Form1();
myForm.Container = new UnityContainer();

显然,鉴于上面的代码,在设置之前就无法访问容器 - Unity正在做同样的事情。

修复方法是将其作为构造函数参数注入:

public partial class Form1 : Form
{
    public Container { get; set; }
    public Form1(IUnityContainer container)
    {
        InitializeComponent();
        this.Container = container;
        var invoice = Container.Resolve<Invoice>();
    }
}

修改

鉴于您的澄清,我认为您实际应该做的是让您的财产成为Invoice

public partial class Form1 : Form
{
    [Dependency]
    public Invoice { get; set; }

    public Form1()
    {
        InitializeComponent();
    }
}

请注意,由于前面概述的相同原因,您仍然无法从构造函数中访问Invoice