我心中的核心組(zu)件(可插拔(ba)的AOP)~消(xiao)息組(zu)件~完善篇
為什么要有本篇文章
本篇(pian)文章主(zhu)要實(shi)現(xian)了(le)(le)RTX消息(xi)(xi)生(sheng)(sheng)(sheng)產者,并且完成了(le)(le)整體(ti)的(de)(de)(de)設計(ji)(ji)(ji)方(fang)(fang)(fang)式,之前在設計(ji)(ji)(ji)時消息(xi)(xi)生(sheng)(sheng)(sheng)產者全(quan)局使(shi)用(yong)(yong)單(dan)一(yi)的(de)(de)(de)生(sheng)(sheng)(sheng)產方(fang)(fang)(fang)式,即一(yi)個項(xiang)目里使(shi)用(yong)(yong)了(le)(le)Email就不能使(shi)用(yong)(yong)SMS,這(zhe)種(zhong)設計(ji)(ji)(ji)方(fang)(fang)(fang)法和實(shi)際不相符,雖然在性能上是最佳(jia)的(de)(de)(de)(采用(yong)(yong)了(le)(le)單(dan)例(li)(li)模(mo)型(xing),維護一(yi)個生(sheng)(sheng)(sheng)產者,使(shi)用(yong)(yong)策(ce)略模(mo)式進行生(sheng)(sheng)(sheng)產者的(de)(de)(de)實(shi)現(xian),使(shi)用(yong)(yong)工(gong)廠模(mo)式生(sheng)(sheng)(sheng)產具體(ti)生(sheng)(sheng)(sheng)產者),實(shi)際項(xiang)目中,應該是可以自動選擇消息(xi)(xi)生(sheng)(sheng)(sheng)產者的(de)(de)(de),當然為(wei)了(le)(le)程序(xu)的(de)(de)(de)性能,我們還必須使(shi)用(yong)(yong)單(dan)例(li)(li)模(mo)式來生(sheng)(sheng)(sheng)產具體(ti)生(sheng)(sheng)(sheng)產者,這(zhe)種(zhong)單(dan)例(li)(li),在本程序(xu)中,采用(yong)(yong)了(le)(le)具體(ti)類(lei)型(xing),具體(ti)單(dan)例(li)(li)的(de)(de)(de)方(fang)(fang)(fang)法,即Email自己(ji)(ji)維護單(dan)例(li)(li),SMS自己(ji)(ji)維護單(dan)例(li)(li),這(zhe)樣,程序(xu)即能滿足實(shi)際的(de)(de)(de)需要,又可以提高自己(ji)(ji)的(de)(de)(de)性能!
強大的設計
強大的生產者
/// <summary> /// 消息(xi)生產(chan)者 /// 具體(ti)消息生產(chan)者(zhe)是單例,如Email,SMS,Rtx等 /// </summary> public class MessageFactory { /// <summary> /// 消息工(gong)廠 /// </summary> public static IMessageManager GetService(MessageType messageType) { switch (messageType) { case MessageType.Email: return EmailMessageManager.Instance; case MessageType.SMS: return SMSMessageManager.Instance; case MessageType.RTX: return RTXMessageManager.Instance; default: throw new NotImplementedException("消息生產者未被識別(bie)..."); } } }
RTX生產者的實現
/// <summary> /// RTX消(xiao)息服務 /// </summary> internal class RTXMessageManager : IMessageManager { #region Singleton private static object lockObj = new object(); public static RTXMessageManager Instance; static RTXMessageManager() { lock (lockObj) { if (Instance == null) Instance = new RTXMessageManager(); } } private RTXMessageManager() { } #endregion private string EncodingString(string str) { return HttpUtility.UrlEncode(str, Encoding.GetEncoding("GB2312")); } private string rtxUrl = System.Configuration.ConfigurationManager.AppSettings["RtxApi"] ?? "//192.168.1.8:8012/sendnotifynew.cgi?"; #region IMessageManager 成員 public void Send(string recipient, string subject, string body) { Send(new List<string> { recipient }, subject, body); } public void Send(IEnumerable<string> recipients, string subject, string body) { try { var dic = new Dictionary<string, string>() { {"title",EncodingString(subject)}, {"msg",EncodingString(body)}, {"receiver", EncodingString(string.Join(",",recipients))}, {"delaytime","0"} }; StringBuilder str = new StringBuilder(); foreach (var item in dic) { str.Append(item.Key + "=" + item.Value + "&"); } new HttpClient().GetAsync(rtxUrl + str.ToString()).Wait(); } catch (Exception ex) { Logger.Core.LoggerFactory.Instance.Logger_Info(ex.Message); } } public void Send(IEnumerable<string> recipients, string subject, string body, bool isAsync) { if (isAsync) Task.Run(() => { Send(recipients, subject, body); }); else Send(recipients, subject, body); } #endregion }