首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >遵循可靠原则的电子邮件回退

遵循可靠原则的电子邮件回退
EN

Stack Overflow用户
提问于 2021-04-23 17:21:35
回答 1查看 71关注 0票数 0

我想实现一个使用备用客户端发送电子邮件的微服务,所以在第一个客户端(SendGrid)出现故障的情况下,我将调用第二个客户端(MailJet),下面的代码展示了这个想法。

问题是:有没有一种方法可以使用一些.net核心功能来改进主函数,而不是初始化新对象?重点是我喜欢遵循可靠的原则,避免依赖和紧密耦合,所以如果我明天需要一个新的EmailClient,它应该很容易实现,而不会破坏可靠的原则。

附言:欢迎任何改进。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
                    
public class Program
{
    public static void Main()
    {       
        List<IEmailClient> clients = new List<IEmailClient>();
        clients.Add(new SendGrid());
        clients.Add(new MailJet());
        
        var emailService = new EmailService(clients);
        emailService.sendEmail();
    }   
}

public class EmailService
{
    protected List<IEmailClient> clients;
    
    public EmailService(List<IEmailClient> clients)
    {
        this.clients = clients;
    }
    
    public void sendEmail()
    {
        foreach (IEmailClient client in this.clients)
        {
            if (client.send()) {
                break;
            }
        }
    }
}

public interface IEmailClient
{
    bool send();
}

public class SendGrid: IEmailClient
{
    public bool send()
    {
        var error = true;

        Console.WriteLine("SendGrid sending email");

        if (error) {
            Console.WriteLine("Error");     
            return false;
        }
        
        Console.WriteLine("Sendgrid email sent");
        return true;        
    }
}

public class MailJet: IEmailClient
{
    public bool send()
    {
        var error = false;

        Console.WriteLine("Mailjet sending email");

        if (error) {
            Console.WriteLine("Error");     
            return false;
        }
        
        Console.WriteLine("Mailjet email sent");
        return true;        
    }
}

dotnet fiddle

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 00:51:13

所有应用程序都有一个连接依赖项的Composition Root。无论是手动编写还是通过配置IoC容器编写,代码的核心都很可能是相同的。

在您设计的示例中,Main方法是组成根,添加新的IEmailClient实现不会影响应用程序的核心(EmailService),只会影响根。

关于设计,很难说,但也许您可以努力应用Composite & Decorator模式来抽象多个客户端的存在。例如:

这种设计的优点是它允许在不更改类的情况下扩展EmailService的行为。您可以在不更改现有代码的情况下添加retrys、fallback、logging等。此外,如果EmailService最终只委托给IEmailClient,您甚至可能会质疑是否需要该Facade

另一个优点是,它允许您动态创建具有不同行为的客户端。例如,假设您的系统用户希望能够配置回退、重试等,那么您可以拥有一个根据他们的配置动态构建IEmailClient实例的Factory

但是,请记住不要过度设计解决方案。您已经在利用现有的电子邮件网关。如果您还不确定您将需要什么,那么只需争取最简单的解决方案,并根据需要进行重构。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67234391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文