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

How I can map Unity to inject instance of container?

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

我可以试试:

    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>();
        }
    }

好的,所以您无法从构造函数内部访问 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