【问题标题】:Late binding with Ninject与 Ninject 的后期绑定
【发布时间】:2023-03-04 14:56:01
【问题描述】:

我正在开发一个框架扩展,它使用 Ninject 作为 IoC 容器来处理动态注入,但我在尝试解决如何实现这一点时遇到了一些麻烦。

我的框架的期望是你会传入IModule(s),这样它就可以很容易地在MVC、WebForms等中使用。所以我有这样的类结构:

public class NinjectFactory : IFactory, IDisposable {
  readonly IKernel kernel;
  public NinjectFactory(IModule[] modules) {
    kernel = new StandardKernel(modules);
  }
}

这很好,我可以在单元测试中创建一个实例并传递IModule 的基本实现(使用似乎推荐用于测试的InlineModule 中的构建)。

问题是直到运行时我才知道我需要注入的类型,并且它们是通过我正在扩展的框架以如下方法请求的:

public IInterface Create(Type neededType) {

}

这就是我难过的地方,我不确定检查的最佳方法->创建(如果需要)->返回,到目前为止我有这个:

public IInterface Create(Type neededType) {
  if(!kernel.Components.Has(neededType)) {
    kernel.Components.Connect(neededType, new StandardBindingFactory());
  }
}

这会将它添加到组件集合中,但我无法确定它是否创建了一个实例,或者我如何创建一个实例并为 .ctor 传递参数。

我这样做的方式是否正确,或者 Ninject 甚至不应该以这种方式使用?

【问题讨论】:

    标签: ninject


    【解决方案1】:

    除非您想更改或扩展 Ninject 的内部结构,否则您无需向内核上的 Components 集合添加任何内容。要确定某个类型的绑定是否可用,您可以执行以下操作:

    Type neededType = ...;
    IKernel kernel = ...;
    
    var registry = kernel.Components.Get<IBindingRegistry>();
    if (registry.Has(neededType)) {
      // Ninject can activate the type
    }
    

    【讨论】:

      【解决方案2】:

      非常晚的答案,但 Microsoft.Practices.Unity 允许通过 App.Config 进行后期绑定

      以防万一有人遇到这个问题

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多