回到目錄
為什麼要有本篇文章
本篇文章主要實作了RTX消息生産者,并且完成了整體的設計方式,之前在設計時消息生産者全局使用單一的生産方式,即一個項目裡使用了Email就不能使用SMS,這種設計方法和實際不相符,雖然在性能上是最佳的(采用了單例模型,維護一個生産者,使用政策模式進行生産者的實作,使用工廠模式生産具體生産者),實際項目中,應該是可以自動選擇消息生産者的,當然為了程式的性能,我們還必須使用單例模式來生産具體生産者,這種單例,在本程式中,采用了具體類型,具體單例的方法,即Email自己維護單例,SMS自己維護單例,這樣,程式即能滿足實際的需要,又可以提高自己的性能!
第五回 消息元件
第六回 消息元件~續
強大的設計
強大的生産者
/// <summary>
/// 消息生産者
/// 具體消息生産者是單例,如Email,SMS,Rtx等
/// </summary>
public class MessageFactory
{
/// <summary>
/// 消息工廠
/// </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("消息生産者未被識别...");
}
}
}
RTX生産者的實作
/// <summary>
/// RTX消息服務
/// </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"] ??
"http://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
}
回到目錄
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!