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

    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/

10-13 06:23