【问题标题】:Ninject injection into object constructed via reflectionNinject 注入到通过反射构造的对象中
【发布时间】:2011-08-16 22:05:30
【问题描述】:

我们遇到了一个问题,我们希望将依赖项注入到通过反射构造的对象中:

        Type _type = Type.GetType(className, true, true);
        ConstructorInfo _ctor = _type.GetConstructor(new[] { typeof(MyClass) });
        IReg _reg = (IReg)_ctor.Invoke(new object[] { _myClass });

这里似乎没有使用属性注入进行注入。不可能吗?我们怎样才能绕过这个问题? 谢谢。

【问题讨论】:

    标签: reflection ninject


    【解决方案1】:

    您可以在对象构造后通过反射使用 IKernel 上的kernel.Inject(Object) 方法对对象进行属性注入。但这将是后期构造,您不会得到任何构造函数注入。

    【讨论】:

    • 这似乎是迄今为止最好的方法。但是我如何进入我的内核?创建一个新的?它在 Web 服务应用程序级别实例化(我们使用 WCF 扩展)。连同绑定。我们的实例化逻辑在业务逻辑级别(不同的程序集)执行,它不知道它被 Web 服务使用。
    • 依赖注入模式是“经典抽象类工厂”+新特性(基于 ctor/properties、对象生命周期等的连接依赖)的泛化。所以它应该像抽象类工厂一样使用:在设置应用程序(例如:main 函数)中,您应该定义“类工厂”并作为抽象传递给组件(例如:您的业务逻辑程序集)。在我们的例子中,抽象类工厂是 IKernel。如何将内核传递给您的程序集?为每个需要的业务调用传递一个实例。或在您的业务逻辑程序集中为其定义一个单例。
    • 你必须想办法获取内核。查看这个问题,了解有关遗留系统的一些想法stackoverflow.com/q/6562872/154477
    【解决方案2】:

    有一个Kernel.Get(Type),但是当你想调用一个特定的构造函数时,它是没有用的。有一个可自定义的构造函数选择策略,您可以使用它来模拟您在第二行中所做的事情。

    【讨论】:

      【解决方案3】:

      要使用依赖注入框架,您不应该使用 new 或反射来实例化对象本身,您应该调用注入框架。 在你的情况下:

      //setup the application
      IKernel kernel = new StandardKernel();
      //add all your other bindings for property injection
      ...
      
      kernel.Bind<MyClass>.ToConstant(_myClass); //if same _myClass instance is used than this can go in setup application. 
      Type _type = Type.GetType(className, true, true);
      var _reg = kernel.Get(_type);
      kernel.Unbind<MyClass>(); //cleanup the global kernel
      

      依赖注入框架用于避免使用反射进行对象实例化 + 连接它的依赖项,基于先前的配置(使用 Bind 调用 Ninject)。

      【讨论】:

      • 不幸的是,大约有 100 多个类实现了该接口。这些类的名称是动态检索的,因此也动态实例化(参见上面的示例)。需要实例化哪些类取决于业务逻辑,并且很难重构。
      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 2023-03-07
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多