Ninject (最新バージョン) を使用して、インターフェイスを特定のクラスの型にバインドすることは可能ですか? つまり... 2つのクラスがあるとしましょう..
ClassA と ClassB は、どちらもコンストラクターに IContext インジェクションを持っています。 ClassA の場合は IContext を ContextA にバインドし、IContext を ContextB の場合は ClassB にバインドすると言うことができますか?
名前付きバインディングを使用する代わりに、必要なコードが少なく、タイプセーフな条件付きバインディングを使用することもできます。
Bind<IContext>().To<ContextA>().WhenInjectedInto<SomeClassThatNeedsAContext>();
Bind<IContext>().To<ContextB>().WhenInjectedInto<SomeOtherClassThatNeedsBContext>();
これを行う 1 つの方法は、名前付きバインディングを使用することです。
kernel.Bind<IContext>().To<ContextA>().Named("A");
kernel.Bind<IContext>().To<ContextB>().Named("B");
kernel.Bind<SomeClassThatNeedsContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<IContext>("A"));
kernel.Bind<SomeOtherClassThatNeedsContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<IContext>("B"));
別の方法は、「WithConstructorArgument」を単独で使用することです
kernel.Bind<SomeClassThatNeedsAContext>().ToSelf().WithConstructorArgument("context",ninjectContext=>ninjectContext.Get<ContextA>());
混乱を避けるために、Ninject にはコンテキストの概念もあります。提供されたサンプル IContext などと混同しないでください。
私が経験から発見したことの 1 つは、自分がこれを行っていることに気付いた場合、多くの場合、インターフェイスまたはクラスの設計のどこかに欠陥があるということです。もしかしたら、本当に 2 つの異なるインターフェースが必要なのでしょうか?