我如何映射 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
。
我如何映射 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
。