2012-01-03 81 views
6

我有以下代码如何使用提供商Ninject

public class Something { 
    [Inject] 
    public Configuration config {get;set;} //singleton 
    [Inject] 
    public Provider<WindowHandler> windowsProvider { get; set; } //NOT singleton 

    public void Search(string text) { 
     WindowHandler handler = windowsProvider.Create(xxxxxx); 
     //use the new handler that was created 
    } 
} 

但似乎提供商需要一个IContext这里我把XXXXXX。不应该使用从内核引导和创建Something.cs时的IContext。提供者的no参数Create方法在哪里? (我是从Guice陆地角度来的,它会像上面那样编码)。

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

感谢, 院长

回答

12

似乎你试图用一个供应商在你的代码的工厂。

Ninject条款中的提供者是赋予Ninject创建专门创建的对象的工厂。因此,它获得解析上下文,该解析上下文可用于创建不同的实例,具体取决于实例注入的位置。

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

kernel.Bind<IFoo>().ToProvider<FooProvider>(); 

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

public interface IWindowHandlerFactory 
{ 
    WindowHandler Create(); 
} 

Bind<IWindowHandlerFactory>().ToFactory(); 

或者你可以注入Func<WindowHandler>不添加配置。但在我看来,这是没有意义的。

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

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

+0

Func 正是我一直在寻找的东西。在2.0版本中我们使用的版本是否没有办法做到这一点? – 2012-01-03 21:57:57

+1

请参阅http://stackoverflow.com/questions/4840157/does-ninject-support-func-auto-generated-factory/4851885#4851885 – 2012-01-04 00:05:57

1

好吧,我最终的解决办法是在ninject 2.0用下面的代码来欺骗......

 var windowFactory = kernel.Get<IEWindowFactory>(); 
     var tabFactory = kernel.Get<IETabFactory>(); 
     windowFactory.Kernel = kernel; 
     tabFactory.Kernel = kernel; 

,并在绑定名单上有

Bind<IEWindowFactory>().ToSelf().InSingletonScope(); 
Bind<IETabFactory>().ToSelf().InSingletonScope(); 

然后我刚开始我的应用程序

var main = kernel.Get<MainForm>(); 
main.Start(); 

当然,这些工厂在MainForm的层次结构中注入了我需要的地方。

所以我手动把内核启动时,然后当我启动我的应用程序时,自然这些工厂是与[Ninject]注释类中的字段,因此他们可以创建对象。不是最干净的,直到我们得到3.0,但它的工作原理(我讨厌额外的工厂类,我必须编写代码,但哦)。