0

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

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

现在的问题是,根据(即IMessage,)的种类,IClientChannel实现方式略有不同。但是,我无法区分/的上下文。我需要一种能够知道在哪里使用这样的实例的方法。ServiceIDocumentServiceIAccountServiceIMessageIClientChannel

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

有人有想法吗?

4

1 回答 1

3

Ninject 具有简单的约束解析:命名绑定。使用此功能,您可以多次为同一服务类型注册类型绑定:

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完整示例可在 gist.github 获得

于 2013-01-02T20:43:02.103 回答