使用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?更具体地说,温莎将如何解决正确的问题(请记住,ConverterService构造函数仅需要ISettingsProvider)?
关于我应该如何(重新)设计课程的任何建议将不胜感激。
最佳答案
您不能为实例使用命名约定并以这种方式控制它们吗?因此,您的IConverterService的每个实例都将具有一个关联的名称,以指示其正在使用的配置。
该问题提供了有关使用命名组件/实例的一些信息。
Castle Windsor - How to map Named instance in constructor injection
关于c# - 温莎城堡代码设计问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12424158/