C# 温莎城堡代码设计问题

C# 温莎城堡代码设计问题,c#,castle-windsor,C#,Castle Windsor,使用温莎已有相当一段时间了,我有点惊讶我没有更早地遇到这个“设计”问题。我不知道如何最好地解决它 我有一个类ConverterService,用于执行数据转换。这是接口(我已将参数/返回值更改为对象以简化示例):- 转换器类需要一些配置设置,这些设置由ISettingsProvider提供。这些设置在构造函数和ConvertData()方法中都使用。因此,我将ISettingsProvider注入构造函数:- public class ConverterService : IConverterS

使用温莎已有相当一段时间了,我有点惊讶我没有更早地遇到这个“设计”问题。我不知道如何最好地解决它

我有一个类
ConverterService
,用于执行数据转换。这是接口(我已将参数/返回值更改为对象以简化示例):-

转换器类需要一些配置设置,这些设置由
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均以通常方式在温莎注册:-

container.Register(Component.For<IConverterService>().ImplementedBy<ConverterService>().LifeStyle.Singleton);
container.Register(Component.For<ISettingsProvider>().ImplementedBy<SettingsProvider>().LifeStyle.Singleton);
container.Register(Component.For().ImplementedBy().lifety.Singleton);
container.Register(Component.For().ImplementedBy().lifety.Singleton);
任何需要使用转换器的类都会通过其构造函数标准的东西获得一个IConverterService注入。这很好,但我现在需要许多不同的消费者能够将ConverterService与不同的设置提供者(最多两个或三个)一起使用

我不能使ConverterService暂时化,因为我不希望每次都有初始化开销。对于每种类型的ISettingProvider,我感觉需要一个单独的ConverterService实例,但我不确定是否/如何使用Windsor实现这一点,或者是否需要更基本的重构

我如何注册不同的设置提供程序,它们都实现了ISettingsProvider?更具体地说,温莎将如何解决正确的问题(请记住,ConverterService构造函数只需要一个ISettingsProvider)


任何关于我应该如何(重新)设计类的建议都将不胜感激。

您不能对实例使用命名约定并以这种方式控制它们吗?因此,IConverterService的每个实例都有一个关联的名称来指示它使用的配置

此问题介绍了有关使用命名组件/实例的一些信息


我发现这些Winsdor约定会使代码难以遵循。我想知道是否有单独的接口和实例,例如“FooConverterService:IFooConverterService”、“BarConverterService:IBarConverterService”等。每个具体类都将从“ConverterService”继承,它们的构造函数期望传递给基ctr的“IXxxSettingsProvider”。这只意味着接口和子类的大量增加(除了ctr之外为空),但这会使代码更具可读性。我会说使用接口包装器进行分组,但我不确定您在编译时是否知道您将拥有什么类型,至少使用名称,您可以在运行时将其中一些定义为它的字符串标识符。
container.Register(Component.For<IConverterService>().ImplementedBy<ConverterService>().LifeStyle.Singleton);
container.Register(Component.For<ISettingsProvider>().ImplementedBy<SettingsProvider>().LifeStyle.Singleton);