使用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)?
关于如何(重新)设计课程的任何建议都将非常感激。
答案 0 :(得分:1)
你能不能为你的实例使用命名约定并以这种方式控制它们?因此,IConverterService的每个实例都有一个关联的名称,以指示它正在使用的配置。
此问题提供了有关使用命名组件/实例的一些信息。
Castle Windsor - How to map Named instance in constructor injection