2

使用 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)?

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

4

1 回答 1

1

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

这个问题提供了一些关于使用命名组件/实例的信息。

Castle Windsor - 如何在构造函数注入中映射命名实例

于 2012-09-14T12:21:19.287 回答