我的 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
。
在上面的示例中,我返回 a 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 方法来创建IDirectoryBuilder
s,我认为我需要将ConfigurationManager
相关调用分散在我的代码库中。
如果我使用 Ninject Provider 方法,我将需要IDirectoryBuilder
s 的所有实现的提供者,并更新我的构造函数和IDataConnection
. 我的代码现在看起来也像(不是很干,与我目前的方法相似)。
Bind<IDirectoryBuilder>().ToProvider<DefaultDirectoryBuilderProvider>()
.WhenParentNamed("EDDatePricesXLConnection")
.WithConstructorArgument("baseDir", "someConfigValue")
.WithConstructorArgument("fileName", "someOtherConfigValue");
我的代码目前有一个非常一致的依赖链(使用 NamedArguments):ICalculator
-> IDataReader
-> IDataConnection
-> IDirectoryBuilder
- 这让我相信必须有某种方法可以重复创建这个链,而不必重复设置代码 - 我可以似乎没有弄清楚。还有一个额外的限制,因为我经常需要相同依赖链的两个实例——唯一的区别是不同的配置值。