gpt4 book ai didi

c# - DI 实际上是如何对属性进行注入(inject)的?

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:42 25 4
gpt4 key购买 nike

我绞尽脑汁也没有找到合适的答案,所以我们开始吧!我的每个表单或对象都具有以下属性:

    private RootWorkItem m_RootWorkItem;
[RootWorkItem(Inject = true)]
public RootWorkItem RootWorkItem {

get {
if (m_RootWorkItem == null) {
m_RootWorkItem = new RootWorkItem();
}
return m_RootWorkItem;
}
}

请注意,RootWorkItem 是我设计的一个包含服务集合(Collection)的类。基本上,我所有的服务都是使用反射和 Activator.CreateInstance 从外部 DLL 文件加载,并放入 RootWorkItem.Services。

但是我究竟如何才能将创建的第一个 RootWorkItem 实际“注入(inject)”到程序中标有我的属性的所有其他 RootWorkItem 中?

这些 DI 模式实际上是如何“执行”注入(inject)“到”属性中的?我知道 DI 的概念,但我正在尝试为一个对象编写我自己的非常基本的 DI。我一直在用大量的反射来尝试找到一些合适的方法来做到这一点,我什至没有想出一个正确的方法来做到这一点。

编辑更清晰的问题:DI 框架/服务如何知道何时创建包含要注入(inject)的属性的对象?

即:

    class MyForm : Form {
[RootWorkItem(Inject = true)]
public RootWorkItem RootWorkItem { get; set; }
end class

class Program {
Main {
MyForm form = new MyForm();
form.Show();
}
end class

如果没有通知服务它已创建或需要注入(inject),它如何知道在创建表单时注入(inject)属性值?

最佳答案

您问的是正确的问题:“如果没有通知服务它已创建或需要注入(inject),它如何知道在创建表单时注入(inject)属性值?”

当您说“如果没有任何内容通知服务它已创建或需要注入(inject)”时,您也是正确的,那么 DI 框架无法完成其工作。

但是,DI 框架确实知道,因为您使用 DI 框架来创建注入(inject)其依赖项的对象。在本例中,您使用 DI 框架创建表单,因此它知道对象并可以注入(inject)依赖项。

代替

MyForm form = new MyForm(); 
form.Show();

MyForm form = DIFramework.CreateForm(typeof(MyForm));
form.Show();

现在,您的 DI 框架知道该对象了!

本质上,new 是 DI 的敌人,因为它意味着调用者正在控制对象的构造。相反,调用者打算将该责任留给其他人,即 DI 框架。调用者应该只要求 DI 框架提供/构造/配置对象。

关于c# - DI 实际上是如何对属性进行注入(inject)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com