我在我的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