我在我的Ninject模塊中重複了幾次以下的代碼。我可以使用哪些方法和技術來減少這些重複的代碼?請求IDirectoryBuilder
,其主要功能是確定通過使用IDirectory
實施的基礎上配置設置的文件的位置時發生如何讓我的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");
}
的主要區別。
在上面的例子中,我返回一個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工廠方法創建IDirectoryBuilder
s,我看到的方式是我需要將ConfigurationManager
相關的調用分散在我的代碼庫中。
如果我使用Ninject Provider方法,我將需要所有實現IDirectoryBuilder
的提供者,並且還更新了我的構造函數和IDataConnection
的實現。我的代碼現在看起來像(不是非常乾燥,類似於我目前的方法)。
Bind<IDirectoryBuilder>().ToProvider<DefaultDirectoryBuilderProvider>()
.WhenParentNamed("EDDatePricesXLConnection")
.WithConstructorArgument("baseDir", "someConfigValue")
.WithConstructorArgument("fileName", "someOtherConfigValue");
我的代碼具有目前一個非常一致的依賴鏈(使用NamedArguments):ICalculator
- >IDataReader
- >IDataConnection
- >IDirectoryBuilder
- 這使我相信,必須有某種方式來重複創建這條產業鏈而不必重複設置代碼 - 我似乎無法弄清楚。還有一個額外的限制,因爲我經常需要兩個相同的依賴鏈實例 - 唯一的區別是配置值不同。
參見http://stackoverflow.com/questions/10344568/binding-recurring-connection-string-constructor-parameters-using-di – 2012-04-27 07:36:41