gpt4 book ai didi

c# - CaSTLe温莎代码设计问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:21 25 4
gpt4 key购买 nike

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

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

public interface IConverterService
{
object ConvertData(object sourceData);
}

转换器类需要一些配置设置,由 ISettingsProvider 提供。这些设置在构造函数和 ConvertData() 方法中都使用。因此,我将 ISettingsProvider 注入(inject)到构造函数中:-

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 注入(inject) - 标准的东西。这工作正常,但我现在需要许多不同的消费者能够使用具有不同设置提供程序(最多两个或三个)的 ConverterService。

我不能让 ConverterService 成为 transient 的,因为我不想每次都有初始化开销。感觉我需要为每种类型的 ISettingProvider 创建一个单独的 ConverterService 实例,但我不确定是否/如何使用 Windsor 完成此操作,或者是否需要更基本的重构?

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

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

最佳答案

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

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

Castle Windsor - How to map Named instance in constructor injection

关于c# - CaSTLe温莎代码设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12424158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com