Ninjectモジュールに次のコードが数回繰り返されています。この繰り返されるコードを減らすためにどのような方法と手法を使用できますか?
public override void Load()
{
Bind<IDataReader<IList<Price>>>()
.To<PricesDataReader>().Named("ValDatePrices");
Bind<IDataConnection<IList<PricesCsvRecord>>>()
.To<PricesXLConnection>().WhenParentNamed("ValDatePrices")
.Named("ValDatePricesXLConnection");
Bind<IDirectoryBuilder>()
.ToMethod(DefaultValDatePricesDirectory)
.WhenParentNamed("ValDatePricesXLConnection");
Bind<IDataReader<IList<Price>>>()
.To<PricesDataReader>().Named("EDDatePrices");
Bind<IDataConnection<IList<PricesCsvRecord>>>()
.To<PricesXLConnection>().WhenParentNamed("EDDatePrices")
.Named("EDDatePricesXLConnection");
Bind<IDirectoryBuilder>()
.ToMethod(DefaultEDDatePricesDirectory)
.WhenParentNamed("EDDatePricesXLConnection");
}
IDirectoryBuilder
主な違いは、実装を使用して構成設定に基づいてファイルの場所を決定することを主な機能とするを要求するときに発生しますIDirectory
。
上記の例では、を返しますが、以下DefaultDirectoryBuilder
にこれらの他のいくつかの実装があります(EdNrrDirectoryBuilder
メソッドを参照)。
public IDirectoryBuilder DefaultValDatePricesDirectory(IContext arg)
{
return new DefaultDirectoryBuilder(
ConfigurationManager.AppSettings["VALDATE_PRICES_DIR"],
ConfigurationManager.AppSettings["VALDATE_PRICES_FILENAME"]);
}
public IDirectoryBuilder DefaultEDDatePricesDirectory(IContext arg)
{
return new DefaultDirectoryBuilder(
ConfigurationManager.AppSettings["EDDATE_PRICES_DIR"],
ConfigurationManager.AppSettings["EDDATE_PRICES_FILENAME"]);
}
public IDirectoryBuilder EdNrrDirectoryBuilder(IContext arg)
{
return new ExternalDirectoryBuilder(
ValuationDate,
ConfigurationManager.AppSettings["NRRDATE_DIR"],
ConfigurationManager.AppSettings["NRRDATE_PRICES_FILENAME"]);
}
私の問題は、構成ファイルの値が必要なことです。現在、構成に関連するすべてのリクエストは、私のNinjectモジュールで制限されています。
Ninject Factoryアプローチを使用してsを作成する場合 、コードベース全体に関連する呼び出しを分散IDirectoryBuilder
させる必要があることがわかります。ConfigurationManager
Ninject Providerアプローチを使用する場合、IDirectoryBuilder
sのすべての実装にプロバイダーが必要になり、コンストラクターとの実装も更新されIDataConnection
ます。私のコードも次のようになります(あまり乾燥しておらず、現在のアプローチと似ています)。
Bind<IDirectoryBuilder>().ToProvider<DefaultDirectoryBuilderProvider>()
.WhenParentNamed("EDDatePricesXLConnection")
.WithConstructorArgument("baseDir", "someConfigValue")
.WithConstructorArgument("fileName", "someOtherConfigValue");
私のコードには、現時点で非常に一貫性のある依存関係チェーンがあります(NamedArgumentsを使用):ICalculator
-> IDataReader
-> IDataConnection
-> IDirectoryBuilder
-これにより、セットアップコードを繰り返さなくても、このチェーンを繰り返し作成する方法があるはずだと思います-これは可能です理解していないようです。追加の制限があり、同じ依存関係チェーンの2つのインスタンスが必要になることがよくあります。唯一の違いは、構成値が異なることです。