C# 消息发送功能(支持多种发送方式)

总体设计:

IMessageChannel接口:一个消息的发送方式,即消息的发送通道。有一个Process方法,此方法处理本消息发送通道怎么去发送消息。接受一个IDictionary<string,object>参数,此参数提供发送的内容,是一个键值对集合。希望消息有多种发送方式。每种方式实现此接口即可。

IMessageChannelSelector: 消息通道选择器,用于消息通道管理器,便于管理器能正确的选择出一个消息发送的通道。

IMessageChannelManager:消息通道管理器,管理各种消息发送通道。

IMessageService: 消息发送服务。也是消息发送功能调用入口。

二。具体实现。

  /// <summary>
    /// 消息通道
    /// </summary>
    public interface IMessageChannel
    {
        /// <summary>
        /// 通道对信息的处理方法
        /// </summary>
        /// <param name="parameters">参数列表</param>
        void Process(IDictionary<string, object> parameters);
    }
    /// <summary>
    /// 消息通道选择器
    /// </summary>
    public interface IMessageChannelSelector
    {
        /// <summary>
        /// 获取消息通道
        /// </summary>
        /// <param name="messageType"></param>
        /// <param name="payload"></param>
        /// <returns></returns>
        MessageChannelSelectorResult GetChannel(string messageType, object payload);
    }

    /// <summary>
    /// 消息通道选择器的结果
    /// </summary>
    public class MessageChannelSelectorResult
    {
        /// <summary>
        /// 优先级
        /// </summary>
        public int Priority { get; set; }

        /// <summary>
        /// 消息通道
        /// </summary>
        public Func<IMessageChannel> MessageChannel { get; set; }
    }
  /// <summary>
    /// 消息通道管理器
    /// </summary>
    public interface IMessageChannelManager
    {
        /// <summary>
        /// 获取消息通道
        /// </summary>
        /// <param name="type"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        IMessageChannel GetMessageChannel(string type, IDictionary<string, object> parameters);
    }

    /// <summary>
    /// 消息通道管理器的默认实现
    /// </summary>
    public class MessageChannelManager : IMessageChannelManager
    {

        /// <summary>
        /// 通道选择器列表
        /// </summary>
        private readonly IEnumerable<IMessageChannelSelector> _messageChannelSelectors;

        public MessageChannelManager(IEnumerable<IMessageChannelSelector> messageChannelSelectors)
        {
            _messageChannelSelectors = messageChannelSelectors;
        }

        public IMessageChannel GetMessageChannel(string type, IDictionary<string, object> parameters)
        {
            var messageChannelResult = _messageChannelSelectors
                .Select(x => x.GetChannel(type, parameters))
                .Where(x => x != null)
                .OrderByDescending(x => x.Priority)
                .FirstOrDefault();

            return messageChannelResult == null ? null : messageChannelResult.MessageChannel();
        }
    }
    /// <summary>
    /// 信息服务接口
    /// </summary>
    public interface IMessageService
    {
        void Send(string type, IDictionary<string, object> parameters);
    }
 public class DefaultMessageService : IMessageService
 {
        //消息通道管理器
        private readonly IMessageChannelManager _messageChannelManager;

        public DefaultMessageService(IMessageChannelManager messageChannelManager)
        {
            _messageChannelManager = messageChannelManager;
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="type">消息类型</param>
        /// <param name="parameters">参数列表</param>
        public void Send(string type, IDictionary<string, object> parameters)
        {
            //从消息通达管理器中获取消息通道对象
            var messageChannel = _messageChannelManager.GetMessageChannel(type, parameters);
            if (messageChannel == null)return;
            //调用消息通道对象,处理具体的发送方法
            messageChannel.Process(parameters);
        }

}

三 使用方式

现在我需要使用电子邮件发送一个消息。 怎么使用此消息发送设计呢?

1.我们通过实现IMessageChannel接口,来创建一个电子邮件发送通道(电子邮件发送方式)来发送消息。

  public class SmtpMessageChannel : IMessageChannel
    {        public static readonly string MessageType = "Email";
        //以某种方式得到SMTP对象。
        SmtpClient smtpClient;
        public void Process(IDictionary<string, object> parameters)
        {
            //从参数中提取出发送的相关信息。
            var emailMessage = new EmailMessage
            {
                Body = parameters["Body"] as string,
                Subject = parameters["Subject"] as string,
                Recipients = parameters["Recipents"] as string

            };

            //构建Mail Message
            var mailMessage = new MailMessage
            {
                Subject = emailMessage.Subject,
                Body = emailMessage.Body,//这里你还可以加入模板功能。
                IsBodyHtml = true
            };

            try
            {
                //循环添加收件人
                foreach(var recipient in emailMessage.Recipients.Split(new [] {‘;‘}, StringSplitOptions.RemoveEmptyEntries))
                {
                    mailMessage.To.Add(new MailAddress(recipient));
                }

                //使用SMTP 发送邮件
                smtpClient.Send(mailMessage);
            }
            catch(Exception e)
            {
                //进行异常的相关处理。
            }

        }

2.实现通道选择器

public class EmailMessageChannelSelector : Component, IMessageChannelSelector {
        public const string ChannelName = "Email";
        public MessageChannelSelectorResult GetChannel(string messageType, object payload)         {
            if (messageType == "Email")            {                 return new MessageChannelSelectorResult                 {
                    Priority = 50,
                    MessageChannel = () =>new SmtpMessageChannel(),//这里你可以使用IoC得到IMessageChannel对象                };
             } return null;        } }

3.然后,我们只要在我们的程序中得到一个IMessageService的一个实例,然后调用Send方法,发送信息即可。

时间: 2024-10-07 10:18:54

C# 消息发送功能(支持多种发送方式)的相关文章

【SSH网上商城项目实战26】完成订单支付后的短信发送功能

上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就是给买家发送短信,告诉他订单已经生成之类的.这一节主要介绍一下如何在用户支付完成后自动给用户发送短信. 1.申请短信发送功能 很明显,我们自己不能发短信,也没有做短信的功能,所以我们需要去借助第三方的运营商.但是像中国移动,联通,电信这种不会直接给我们提供短信服务,而是先把短信服务提供给一些运营商,然后这些运营商再提供给我们.  有一个运营商叫“中国网建sms短信通”(官网地址).这个运营商可以给我们提供短信的服务,

邮件发送功能开发

作为一名.Net开发,"邮件发送"功能的开发和使用是必须要掌握的,因为这个功能作为"消息推送"的一种手段经常出现在各种.Net系统中,所以本文将对.Net平台下的"邮件发送",做一个细致的分析! 一.who需要邮件功能 1.服务提供方:需提供邮件收发客户端或Web服务.如:QQ邮箱.GMail邮箱.126.163等知名邮件服务提供商.注:如果你使用的第三方不知名邮件服务商提供的邮件收发服务,通过其发出的邮件,可能会被其他知名邮件服务提供商的STM

HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据推送).基于数据推送是这样的,当数据源有新数据,它马上发送到客户端,不需要等待客户端请求.这些新数据可能是最新闻,最新股票行情,来自朋友的聊天信息,天气预报等. 数据拉与推的功能是一样的,用户拿到新数据.但数据推送有一些优势. 你可能听说过Comet, Ajax推送, 反向Ajax, HTTP流,W

.NET开发邮件发送功能的全面教程(含邮件组件源码)

ref: http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html 今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         邮件发送相关.NET类库 3)         介绍我开发的一个发送邮件的小组件(MailHelper) 4)         MailHelper组

Spring Boot 2.0 图文教程 | 集成邮件发送功能

文章首发自个人微信公众号: 小哈学Java 个人网站: https://www.exception.site/springboot/spring-boots-send-mail 大家好,后续会间断地奉上一些 Spring Boot 2.x 相关的博文,包括 Spring Boot 2.x 教程和 Spring Boot 2.x 新特性教程相关,如 WebFlux 等.还有自定义 Starter 组件的进阶教程,比如:如何封装一个自定义图床 Starter 启动器(支持上传到服务器内部,阿里 OS

如何在 Laravel 中 “规范” 的开发验证码发送功能

什么是ThinkSNS ? ThinkSNS(简称TS),一款全平台综合性社交系统,为国内外大中小企业和创业者提供社会化软件研发及技术解决方案,目前最新版本为ThinkSNS+(简称TS+).ThinkSNS V4.ThinkSNS[简]. 需求场景 发送「验证码」或者「消息通知」,可发送到手机或邮箱中. 完成 首先,在Laravel中的规范就是使用Laravel的「消息通知」,这里基于场景为「验证码」.这个需求几乎所有软件系统都有使用到. 创建通知场景 第一步,使用php artisan ma

一种红包发送功能的实现(redis+mysql+quartz)

这篇文章主要是对半年前开发的红包模块进行整理,把其中主要的设计思想以及具体的实现方案进行介绍,如有设计以及实现上的缺陷,或是存在漏洞,请大家批评指正! 红包功能大家都很熟悉了,那在这里就简单的对红包功能进行描述... 功能描述:红包业务主要的功能包括四部分,分别是红包发送,红包接收,红包回收,以及红包记录查询. 1)红包发送:发送者账户->红包中间层 2)红包接收:红包中间层->接收者账户 3)红包回收:红包中间层中若存在红包留存超过24小时,则将其回收,红包中间层->发送者账户 功能描

远程短信发送功能

远程短信发送功能 拓波短信服务器(Smsserver)用于支持Turbomail 邮件服务器进行远程发送短信,当邮件服务器和短信猫分别 部署在不同的机器上,邮件服务器就需要通过短信服务器进行短信发送. 安装配置短信服务器(Smsserver)步骤: 安装短信服务器. Windows 安装方法: 解压 smsserver.zip 到C:或D:根目录即完成安装. Linux 安装方法: 执行 tar –vzxf smsserver.tgz 解压 smsserver.tgz 到根目录即完成安装. 配置

redmine邮件发送功能配置详解

redmine的邮件发送功能还是很有用的. 像项目有更新啦,任务分配啦,都能邮件发送的相关责任人. 我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了. 查了网上的资料,都是讲修改下配置文件就可以了,他们没错,只是没有讲全. 下面是我整理的一个redmine邮件发送功能设置的一个完整流程. 1. sendmail安装与检查 linux机器上安装的redmine要能发送邮件,先得是本机的sendmail功能是正常的. 查看sendmail进程是否已正常启动: $ ps au