【发布时间】:2012-09-14 12:02:09
【问题描述】:
使用 Windsor 已经有一段时间了,我有点惊讶我没有早点遇到这个“设计”问题。我不知道如何最好地解决它。
我有一个类ConverterService 用于执行数据转换。这是接口(我已将参数/返回值更改为对象以简化示例):-
public interface IConverterService
{
object ConvertData(object sourceData);
}
转换器类需要一些配置设置,由ISettingsProvider 提供。这些设置用于构造函数和 ConvertData() 方法。因此,我将 ISettingsProvider 注入到构造函数中:-
public class ConverterService : IConverterService
{
private ISettingsProvider _settingsProvider;
public ConverterService(ISettingsProvider settingsProvider)
{
_settingsProvider = settingsProvider;
// Do some one-time initialisation using info from settingsProvider
// and store the results in class variables (not shown), used by ConvertData.
}
public object ConvertData(object sourceData)
{
// Do the conversion - also uses _settingsProvider,
// and other variables initialised in the constructor ..
}
}
ConverterService 和 SettingsProvider 都以通常的方式在 Windsor 中注册:-
container.Register(Component.For<IConverterService>().ImplementedBy<ConverterService>().LifeStyle.Singleton);
container.Register(Component.For<ISettingsProvider>().ImplementedBy<SettingsProvider>().LifeStyle.Singleton);
任何需要使用转换器的类都会通过其构造函数获得一个 IConverterService 注入 - 标准的东西。这很好用,但我现在需要让许多不同的消费者能够将 ConverterService 与不同的设置提供程序一起使用(最多两个或三个)。
我不能让 ConverterService 瞬态,因为我不希望每次都有初始化开销。感觉就像我需要为每种类型的 ISettingProvider 提供一个单独的 ConverterService 实例,但我不确定是否/如何使用 Windsor 来实现这一点,还是需要进行更基本的重构?
我将如何注册不同的设置提供程序,所有这些提供程序都实现了 ISettingsProvider?更具体地说,Windsor 如何解决正确的问题(请记住,ConverterService 构造函数只需要一个 ISettingsProvider)?
任何关于我应该如何(重新)设计课程的建议将不胜感激。
【问题讨论】:
标签: c# castle-windsor