gpt4 book ai didi

c# - 简单注入(inject)器的策略模式

转载 作者:行者123 更新时间:2023-11-30 20:30:18 27 4
gpt4 key购买 nike

我有一个工作流,我需要在其中使用基于某些运行时数据的特定服务类。

例如。我有一个 SendEmailCommand 依赖于 IEmailServiceMandrillEmailServiceSmtpEmailService 的 2 个实现。

SendEmailCommand 将确定它在运行时使用哪个 IEmailService 实现。

每个电子邮件服务实现都有自己的依赖项,这些依赖项由简单注入(inject)器连接。

我不确定 SendEmailCommand 将如何确定要使用的实现 (IEmailService) 或如何将这些服务与运行时数据连接起来。

部分代码:

SendEmailCommand.cs 处理程序

public void Handle(SendEmail command) {
IEmailService service;

if(/* some condition */) {
service = // What to do here?
} else {
service = // What to do here?
}
}

服务可以用我猜的策略代替。

最佳答案

(对我而言)最明显的解决方案是定义一个新的抽象,允许在向邮件服务实现提供运行时数据的同时分派(dispatch)它。这可能看起来像这样:

interface IMailServiceDispatcher
{
void Send([runtime data], [mail service arguments]);
}

这允许您的命令处理程序成为:

private readonly IEmailServiceDispatcher dispatcher;
public void Handle(SendEmail command) {
var data = /* runtime data */
this.dispatcher.Send(data, /* mail service parameters */);
}

现在您可以为 IMailServiceDispatcher 创建一个实现,如下所示:

class EmailServiceDispatcher : IEmailServiceDispatcher
{
IMailService man; IMailService smtp;
public EmailServiceDispatcher(IMailService man, IMailService smtp) { ... }

public void Send(runtimeData, parameters) =>
GetService(runtimedData).Send(parameters);

private IMailService GetService(runtimeData) =>
/* some condition using runtime data */ ? man : smtp;
}

您可以按如下方式连接所有内容:

container.Register<IMailServiceDispatcher, MailServiceDispatcher>();
container.RegisterConditional<IMailService, MandrillEmailService>(WithParamName("man"));
container.RegisterConditional<IMailService, SmtpEmailService>(WithParamName("smtp"));

// Helper method
private static Predicate<PredicateContext> WithParamName(string name) =>
c => c.Consumer.Target.Name == name;

关于c# - 简单注入(inject)器的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45041447/

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