2013-01-02 99 views
0

我使用Ninject,面向使用静态构造函数 方法,而不是一个普通的构造函数有一个图书馆的问题:Ninject和静态构造函数方法

Kernel.Bind<IDocumentService>().ToMethod(
    x => CoDocumentService.Create(x.Kernel.Get<IMessage>(),x.Kernel.Get<IClientChannel>()) 
).InRequestScope(); 

现在的问题是,是IMessageIClientChannel略根据Service(即IDocumentService,IAccountService)的种类而不同地实施。然而,我不能区分IMessage/IClientChannel的背景。我需要一种能够知道这种实例将被使用的方式。

this.Kernel 
    .Bind<IClientChannel>() 
    .To<Something>() 
    .WithPropertyValue("Something",x => {"Depends on where this instance is going to be used"}); 

有没有人有想法?

+0

你可以提供一个更详尽的例子吗?你有多个IClientChannel接口的实现,例如: 'SimpleChannel'和'SmartChannel',你想根据它是注入到'IDocumentServier'还是'IAccountService'来选择不同的实现?或者我误解了你的问题?你想用这行代码实现什么:'WithPropertyValue(“Something”...'? – nemesv

回答

3

Ninject具有简单的约束分辨率:named bindings。使用此功能,您可以为同种服务类型多次注册类型绑定:

kernel 
    .Bind<IClientChannel>() 
    .To<UniversalClientChannel>() 
    .Named("IClientChannel") // named binding 
    .WithPropertyValue("Number",x => 42) 

后来解决直接服务的命名实例:

x.Kernel.Get<IClientChannel>("IAccountService") 

则静态构造函数映射是这样的:

kernel 
    .Bind<IDocumentService>() 
    .ToMethod(x => CoDocumentService.Create(
         x.Kernel.Get<IMessage>(), 
         // named instance will be resolved 
         x.Kernel.Get<IClientChannel>("IClientChannel"))) 
    .InTransientScope(); 

PSfull sample are available at gist.github