Ninject和静态构造方法

时间:2013-01-02 18:14:52

标签: ninject

我正在使用Ninject并面临使用静态构造函数创建库的问题 方法而不是常规构造函数:

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

现在的问题是,IMessageIClientChannel的实施略有不同,具体取决于Service的种类(即IDocumentServiceIAccountService)。但我无法区分IMessage / IClientChannel的背景。我需要一种能够知道将要使用这种实例的方法。

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

有人有想法吗?

1 个答案:

答案 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();

ps full sample are available at gist.github