使用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/

10-14 16:45