码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-09-15 12:53:08      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   使用   ar   for   

总体设计:

bubuko.com,布布扣

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# 消息发送功能(支持多种发送方式)

标签:des   style   blog   http   color   io   使用   ar   for   

原文地址:http://www.cnblogs.com/JFCao/p/3972576.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!