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 に答える