首页 > 代码库 > C# 消息发送功能(支持多种发送方式)

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方法,发送信息即可。

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