总体设计:
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