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

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

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

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

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

附言:欢迎任何改进。

代码语言:javascript
运行
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

复制
相关文章
MongoDB:如何将 BSON 文档转换为可读的格式
二进制 Javascript 对象表示法 (BSON) 是 JSON 文档的二进制编码序列化。JSON 更易于理解,因为它是人类可读的,但与 BSON 相比,它支持的数据类型更少。BSON 已扩展为添加一些可选的非 JSON 原生数据类型,例如日期和二进制数据。
用户4235284
2023/10/14
1.3K0
Python如何将GrADs常用文件转换为NetCDF格式?
测试数据分享 链接:https://pan.baidu.com/s/1mj1-YpvQN414crNz32f8GA 提取码:wmfr
气象学家
2022/01/18
1.9K0
Python如何将GrADs常用文件转换为NetCDF格式?
Python如何将GrADs常用文件转换为NetCDF格式?
首先需要确保xgrads库的安装: pip install xgrads Install from github 或者 git clone https://github.com/miniufo/xgrads.git cd xgrads python setup.py install 链接https://github.com/miniufo/xgrads , 有提供示例ctl和dat文件,下面我们是使用的ctl和grd文件转换的,方法类似: #import sys #sys.path.append('/home/gavin/miniconda3/envs/atmpy/lib/python3.8/site-packages') #sys.path from xgrads import CtlDescriptor, open_CtlDataset ds = open_CtlDataset('lst.ctl') ctl = CtlDescriptor(file='lst.ctl') ds.attrs['pdef' ] = 'None' ds.to_netcdf('lst.nc') data = ds.ro1 data.where(data!=ctl.undef).plot(figsize=(9,5), cmap='jet') 以上需要注意两点: 1.如果在jupyter-lab中无法加载xgrads需要手动添加其路径,使用到的是:import sys 2. xgrads存在bug,如果不添加语句ds.attrs['pdef' ] = 'None'会一直报错,无法生成nc文件!
郭好奇同学
2021/08/26
2.9K0
Python如何将GrADs常用文件转换为NetCDF格式?
如何将ipynb转换为html,md,pdf等格式
本文介绍了如何将 Jupyter Notebook(.ipynb 文件)转换为 HTML、Markdown、PDF 和 LaTeX 格式。首先介绍了 Jupyter Notebook 的入门知识,然后介绍了将 Jupyter Notebook 转换为其他格式的方法,包括使用 `jupyter nbconvert` 命令和设置 Jupyter Notebook 模板。此外,还提供了将 Jupyter Notebook 转换为 PDF 和 LaTeX 格式的方法,以及使用 ipython 命令行工具直接将 Jupyter Notebook 转换为 PDF 格式的方法。
红色石头
2017/12/28
8.4K0
如何将ipynb转换为html,md,pdf等格式
php格式怎么转换为pdf,PHP如何将将word文件转为pdf
PHP将word文件转为pdf的方法:首先修改【php.ini】,并重启环境;然后安装微软office套件;最后配置office组件服务即可。
全栈程序员站长
2022/08/26
5.5K0
php格式怎么转换为pdf,PHP如何将将word文件转为pdf
如何将ownCloud转换为Nextcloud
ownCloud的核心开发团队中一部分人员启动了一个名为Nextcloud的项目。虽然ownCloud将继续开发,但您可能想了解新项目的功能。Nextcloud和ownCloud共享一个公共代码库,这意味着将现有的ownCloud安装迁移到Nextcloud中。
小铁匠米兰的v
2018/08/02
2.7K0
如何将Array转换为List?
可以使用 Arrays.asList() 方法, 该方法接受一个数组作为输入,并返回一个列表作为输出。
程序你好
2018/07/23
1.5K0
java如何将String转换为enum
已知枚举对应的String值,希望得到对应的枚举值。例如,已知"A",希望得到对应的枚举——Blah.A,应该怎么做? Enum.valueOf()是否能实现以上目的,如果是,那我如何使用?
硬核编程
2020/07/23
4K0
Core ML Tools初学者指南:如何将Caffe模型转换为Core ML格式
欢迎来到Core ML教程系列的第二部分。在本教程中,将学习如何设置Python虚拟环境,获取不在Core ML格式裡的数据模型,并将该模型转换为Core ML格式,最后将其集成到应用程式中。强烈建议
iOSDevLog
2018/06/21
1.7K0
如何将视频轻松转换为 GIF
有时看到一条有意思的视频想发到朋友圈,但朋友圈有限制时长,而且也不方便,这时可以把视频转GIF(再做成表情包也可以),再发到朋友圈或者微博(不用像视频一样需要等待审核)。
苏生不惑
2020/02/26
1.9K0
如何将pdf转换为word 2.0
再次以《新冠肺炎诊疗方案(试行第七版)》为例,该文件为图片性pdf,文字不可复制。
生信菜鸟团
2020/06/04
2.7K0
Java 如何将 List 转换为 MAP
上面的代码将会把 Id 作为 Key,然后生成的 Map 是以 id 为 Key,Animal 为Value 的 Map。
HoneyMoose
2022/10/12
2.1K0
Java 如何将 List 转换为 MAP
如何将pdf转换为word 3.0
相对于封装的软件,python和R的操作需要稍微折腾一下。浏览论坛的时候的发现了一款轻量级程序,尝试了一下还不错,看一下转换的效果:
生信菜鸟团
2020/08/04
1.8K0
如何将pdf转换为word 3.0
java如何将String转换为Int
Short.valueOf/parseShort, Long.valueOf/parseLong等也是有类似差别。
硬核编程
2020/07/23
1.7K0
如何将 JSON 转换为有序判断?
JSON(JavaScript Object Notation)是系统之间数据交换的流行格式。它是一种轻量级、基于文本且易于解析的格式,已成为互联网上数据交换的标准。但是,JSON 不会为数据结构中的元素提供任何顺序。虽然这在大多数情况下可能不是问题,但在某些情况下,元素的顺序很重要。
很酷的站长
2023/08/11
5790
如何将 JSON 转换为有序判断?
基于双目视觉的树木高度测量方法研究
随着人工智能时代的到来,计算机视觉领域被广泛应用到各个行业中。同样的,人工智能改变着传统林业的研究方法,林业信息工程技术日渐成熟。针对传统树高测量方法中存在的结果准确性不高、操作困难、专业知识转化为规则困难等问题,采用了一种基于双目立体视觉理论计算树高的方法,实现了树木高度的无接触测量。以双目相机作为采集设备,基于MATLAB、VS2015开发平台,采用张正友单平面棋盘格相机标定方法进行单目标定和双目标定,从而获取双目相机2个镜头的参数。通过SGBM算法和BM算法立体匹配后获得视差深度图像,进而获取树木关键点的三维坐标信息并以此来计算树木高度。将深度学习与双目视觉相结合可以实现树木同时在二维和三维空间的信息提取。在VS2015上的试验结果表明,该方法操作相对简单,并且能够较为准确地测量树木高度,SGBM算法树高测量结果的相对误差范围为0.76%~3.93%,BM算法相对误差范围为0.29%~3.41%。结果表明:采用双目视觉技术测量树木高度可以满足林业工程中对于树高测量的精度需要。
Color Space
2022/05/26
1.7K0
基于双目视觉的树木高度测量方法研究
[1154]如何将字符串转换为datetime
1.把datetime转成字符串: 2017-11-23 17:05:18 2.把字符串转成datetime: 2017-11-23 16:10:10 3.把字符串转成时间戳形式: 1511424610.0 4.把时间戳转成字符串形式: 2017-11-23 17:05:18 5.把datetime类型转外时间戳形式: 1511427918.0
周小董
2022/07/27
3.6K0
mysql整型转字符串_java中如何将字符串转换为字符数组
select * from A order by cast(name as unsigned);
全栈程序员站长
2022/09/27
24.5K0
将VOC格式的数据集转换为COCO格式
import xml.etree.ElementTree as ETimport osimport json coco = dict()coco['images'] = []coco['type'] = 'instances'coco['annotations'] = []coco['categories'] = [] category_set = dict()image_set = set() category_item_id = -1image_id = 20180000000annotation_id
狼啸风云
2021/06/09
3.3K0
mat格式数据集转换为arff与txt格式
下面的代码给出了将mat格式数据集转换为arff与txt格式的matlab代码。 注意,每个.mat文件中只有一个数据集,其中共有m+1列,最后一列是label。 转为arff: mat2arff.m代码 MATLAB % % This function is used to convert the input data to '.arff' % file format,which is compatible to weka file format ... % % Parameters: % input_
里克贝斯
2021/05/21
9910

相似问题

数字格式:如何将1转换为"01",2转换为"02“等?

50

如何将MySQL转储转换为Server格式

13

测量高度

34

格式:如何将1转换为“01”,如何将2转换为“02”,如何将3转换为"03",依此类推

33

将统一转换为卷曲

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档