gpt4 book ai didi

c# - 结构图 - 同一接口(interface)的两个实现

转载 作者:可可西里 更新时间:2023-11-01 08:15:41 27 4
gpt4 key购买 nike

我有一个具有以下 ctor 的服务类:

public class (IMessageService emailService, IMessageService smsService)
{ ... }

IMessageService 的两个实现(电子邮件和短信)。如何配置容器以正确解析此构造函数?这是命名实例的用武之地,还是另一种情况?

最佳答案

可以使用命名实例或智能实例来解决这个...

// Named instances
this.For<IMessageService>().Use<EmailService>().Named("emailService");
this.For<IMessageService>().Use<SmsService>().Named("smsService");



// Smart instances
var emailService = this.For<IMessageService>().Use<EmailService>();
var smsService = For<IMessageService>().Use<SmsService>();

this.For<ISomeService>().Use<SomeService>()
.Ctor<IMessageService>("emailService").Is(emailService)
.Ctor<IMessageService>("smsService").Is(smsService);

但我认为您的设计需要一些工作。事实上,您的服务知道 emailService 和 SMS 服务之间的区别,这违反了 Liskov 替换原则。比注入(inject) 2 个相同类型的参数更好的方法是使用 composite pattern .

public class CompositeMessageService : IMessageService
{
private readonly IMessageService[] messageServices;

public CompositeMessageService(IMessageService[] messageServices)
{
this.messageServices = messageServices ?? throw new ArgumentNullException(nameof(messageServices));
}

public void Send(IMessage message)
{
foreach (var messageService in this.messageServices)
{
messageService.Send(message);
}
}
}

然后您的原始服务只需要接受一个 IMessageService 实例。它不需要知道正在处理的 IMessageService 类型的详细信息。

public SomeService(IMessageService messageService)

在 StructureMap 中,您可以轻松注册 IMessageService 的所有实例,它会自动将它们注入(inject)到 IMessageService 的构造函数参数数组中。

this.Scan(scan =>
{
scan.TheCallingAssembly();
scan.AssemblyContainingType<IMessageService>();
scan.AddAllTypesOf<IMessageService>();
});

或者您可以显式注入(inject)实例。

        this.For<IMessageService>().Use<CompositeMessageService>()
.EnumerableOf<IMessageService>().Contains(x =>
{
x.Type<EmailService>();
x.Type<SmsService>();
});

这意味着您可以更改配置以更改首先调用哪个服务的顺序。在您当前的设计中,这些细节被硬编码到接受这 2 个参数的服务中。

此外,您还可以在不更改设计的情况下添加其他消息服务或删除现有消息服务。

关于c# - 结构图 - 同一接口(interface)的两个实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28602403/

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