【问题标题】:Castle Windsor code design issue温莎城堡代码设计问题
【发布时间】:2012-09-14 12:02:09
【问题描述】:

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

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

【问题讨论】:

    标签: c# castle-windsor


    【解决方案1】:

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

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

    Castle Windsor - How to map Named instance in constructor injection

    【讨论】:

    • 我发现这些 Winsdor 约定会使代码难以遵循。我想知道是否有单独的接口和实例,例如“FooConverterService : IFooConverterService”、“BarConverterService : IBarConverterService”等。每个具体类都将从“ConverterService”继承,并且它们的构造函数期望它传递给基 ctr 的“IXxxSettingsProvider”。它只是意味着接口和子类的激增(除了 ctr 之外是空的),但它会使代码更具可读性。
    • 我会说让接口包装器以这种方式分组,但我不确定你是否会在编译时知道你会有什么类型,至少你可以定义一些名称在运行时作为它的字符串标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多