如何在Ninject中使用Provider

我有以下代码

public class Something { [Inject] public Configuration config {get;set;} //singleton [Inject] public Provider windowsProvider { get; set; } //NOT singleton public void Search(string text) { WindowHandler handler = windowsProvider.Create(xxxxxx); //use the new handler that was created } } 

但似乎提供商采用了IContext,我放了xxxxxx。 不应该使用IContext从我引导并从内核创建Something.cs时使用。 Provider上的no参数Create方法在哪里??? (我来自Guice的土地观点,它将被编码如上)。

所以问题是我该如何正确地做到这一点?

谢谢,迪恩

您似乎正在尝试将提供程序用作代码中的工厂。

Ninject术语中的提供者是为Ninject提供的工厂,用于创建特殊创建的对象。 因此,它获得了解析上下文,可用于创建不同的实例,具体取决于注入实例的位置。

 public class FooProvider : Provider { public override IFoo CreateInstance(IContext ctx) { // add here your special IFoo creation code return new Foo(); } } kernel.Bind().ToProvider(); 

你想要的是你的编码器中的工厂,它创建一个WindowHandler实例。 因此,创建一个接口来创建这样的实例:

 public interface IWindowHandlerFactory { WindowHandler Create(); } Bind().ToFactory(); 

或者,您可以在不添加配置的情况下注入Func 。 但在我看来,这没有什么意义。

注意:所有这些都需要Ninject.Extensions.Factory作为Nuget的预发布3.0.0-rc2。

另见: http : //www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

好吧,我的最终解决方案是使用以下代码在ninject 2.0中作弊…

  var windowFactory = kernel.Get(); var tabFactory = kernel.Get(); windowFactory.Kernel = kernel; tabFactory.Kernel = kernel; 

在我的绑定列表中

 Bind().ToSelf().InSingletonScope(); Bind().ToSelf().InSingletonScope(); 

然后我就开始申请了

 var main = kernel.Get(); main.Start(); 

当然,工厂是在MainForm的层次结构中注入我需要它们的地方。

所以我在启动时手动放入内核,然后当我引导我的应用程序时,这些工厂自然是带有[Ninject]注释的类中的字段,因此它们可以创建对象。 在我们获得3.0之前不是最干净的,但是它有效(而且我讨厌额外的工厂类,我必须编写代码但是哦)。