我正在使用Ninject并面临使用静态构造函数创建库的问题 方法而不是常规构造函数:
Kernel.Bind<IDocumentService>().ToMethod(
x => CoDocumentService.Create(x.Kernel.Get<IMessage>(),x.Kernel.Get<IClientChannel>())
).InRequestScope();
现在的问题是,IMessage
和IClientChannel
的实施略有不同,具体取决于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 :(得分: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();