あなたのサンプルでは、完全に優れたファクトリ実装があり、私は何も変更しません。
ただし、KillerRobot および StandardRobot クラスには、実際には独自の依存関係があると思われます。IoC コンテナーを RobotFactory に公開したくないことに同意します。
1 つのオプションは、ninject ファクトリ拡張を使用することです。
https://github.com/ninject/ninject.extensions.factory/wiki
ファクトリを注入する方法は 2 つあります。インターフェイスを使用する方法と、IRobot (またはその他のもの) を返す Func を注入する方法です。
インターフェイス ベースのファクトリ作成のサンプル: https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface
func ベースのサンプル: https://github.com/ninject/ninject.extensions.factory/wiki/Func
必要に応じて、IoC 初期化コードで func をバインドして実行することもできます。何かのようなもの:
var factoryMethod = new Func<string, IRobot>(nameOfRobot =>
{
if (nameOfRobot == "Maximilian")
{
return _ninjectKernel.Get<KillerRobot>();
}
else
{
return _ninjectKernel.Get<StandardRobot>();
}
});
_ninjectKernel.Bind<Func<string, IRobot>>().ToConstant(factoryMethod);
ナビゲーション サービスは次のようになります。
public class RobotNavigationService
{
public RobotNavigationService(Func<string, IRobot> robotFactory)
{
var killer = robotFactory("Maximilian");
var standard = robotFactory("");
}
}
もちろん、このアプローチの問題は、IoC 初期化内にファクトリ メソッドを記述していることです。おそらく最良のトレードオフではありません...
factory 拡張機能は、いくつかの規則ベースのアプローチを提供することでこれを解決しようとします。したがって、コンテキスト依存の依存関係を追加して、通常の DI チェーンを維持できます。