我费尽脑汁,找不到合适的答案,所以我们开始吧!我的每个表单或对象都具有以下属性:
private RootWorkItem m_RootWorkItem;
[RootWorkItem(Inject = true)]
public RootWorkItem RootWorkItem {
get {
if (m_RootWorkItem == null) {
m_RootWorkItem = new RootWorkItem();
}
return m_RootWorkItem;
}
}
请注意,RootWorkItem是我设计的一个类,其中包含服务(集合)的集合。基本上,我的所有服务都是使用反射和Activator.CreateInstance从外部DLL文件加载的,并放入RootWorkItem.Services。
但是,实际上,我究竟如何才能将创建的第一个RootWorkItem注入到程序中标记有我的属性的每个其他RootWorkItem中呢?
这些DI模式实际上如何“注入”到属性中?我知道DI的概念,但是我试图为一个对象编写自己的极其基础的DI。我一直在思考反射吨,以尝试找到一些合适的方法来做到这一点,而我甚至还没有想出正确的方法来做到这一点。
编辑更清晰的问题:
DI框架/服务如何知道何时创建包含要注入的属性的对象?
即:
class MyForm : Form {
[RootWorkItem(Inject = true)]
public RootWorkItem RootWorkItem { get; set; }
end class
class Program {
Main {
MyForm form = new MyForm();
form.Show();
}
end class
如果没有任何内容通知服务创建它或需要注入它,那么如何知道在创建表单时注入属性值?
最佳答案
您在问一个正确的问题:“如果没有任何东西通知服务它已创建或需要注入,那么它如何知道在创建表单时注入属性值?”
当您说“如果没有什么通知服务已创建或需要注入”时,您也是正确的,那么DI框架将无法完成其工作。
但是,DI框架确实知道,因为您使用DI框架来创建注入了依赖项的对象。在这种情况下,您将使用DI框架创建表单,因此它可以识别对象并可以注入依赖项。
代替
MyForm form = new MyForm();
form.Show();
做
MyForm form = DIFramework.CreateForm(typeof(MyForm));
form.Show();
现在,您的DI框架知道对象了!
本质上,
new
是DI的敌人,因为这意味着调用方正在控制对象的构造。相反,调用者应将这一责任留给其他人,即DI框架。调用者仅应要求DI框架提供/构造/配置对象。关于c# - DI实际上如何注入(inject)属性(property)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3323740/