使用數據實體的好處我這里就不多說了,但大家享受這些好處的時候,難免也對那些瑣碎的賦值代碼感到厭煩,基於此,我認為掌握一個oom的使用,還是很有必要的.
這種類型的工具有很多,比如automapper,EmitMapper,還有和orm混合的dapper等,各有各的特色, 但綜合性能,擴展,易用性來說,我覺得ValueInjecter是用的最舒服的.
太簡單的場景我就不舉例了, 可以看這里
今天玩了玩微信接口開發,寫對象轉換的時候,再一次感覺到了ValueInjecter的便利,於是有了這篇文.
場景說明:
場景一,接口驗證,參數在get請求的url上面, 比如這種:http://i.cnblogs.com/EditPosts.aspx?postid=3866781&update=1¶3="value"...
然后有些小伙伴獲取數據的方式是:
model.postid=Request["postid"],; model.update=Request["update"]; ......
不得不說,這種代碼寫起來實在是沒意思.
而如果使用一個oom,我們可以這樣做:
建立消息對象
public class CheckModel { public string signature { get; set; } //微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 public string timestamp { get; set; } //時間戳 public string nonce { get; set; } //隨機數 public string echostr { get; set; } //隨機字符串 }
建立從Request到對象的映射約定
public class RequestInjection : KnownSourceValueInjection<HttpRequestBase> { protected override void Inject(HttpRequestBase source, object target) { var targetPros = target.GetProps();//取得實體對象的所有屬性 foreach (PropertyDescriptor targetPro in targetPros) { var name = targetPro.Name; var vaule = source[name];//這里解釋一下,微信接口驗證的時候是發送的get請求,url中帶有這三個(驗證的時候,還帶echostr)參數,通過Request[echostr]的方式,取得其內容,然后賦值給target(CheckModel) if (vaule == null) continue; targetPro.SetValue(target, vaule); } } }
然后兩句代碼,即可完成model的賦值.
var model = new CheckModel(); model.InjectFrom<RequestInjection>(Request);
場景二,微信消息的格式是比較規范的xml字節流,種類很多,但格式都一個樣. 微信接口文檔
同樣,我們先聲明消息實體 ,
public class ReceiveBase { public string ToUserName { get; set; } public string FromUserName { get; set; } public string CreateTime { get; set; } public string MsgType { get; set; } public string MsgId { get; set; } }
public class TextMessage : ReceiveBase { public string Content { get; set; } }
和 映射約定
public class XmlStrInjection : KnownSourceValueInjection<string> { protected override void Inject(string source, object target) { XElement xElement = XElement.Parse(source); var nodes = xElement.Nodes(); foreach (XElement xNode in nodes) { var name = xNode.Name.LocalName; var value = xNode.Value; var targetPro = target.GetProps().GetByName(name); if (targetPro == null) continue; targetPro.SetValue(target, value); } } }
同樣,賦值的時候,就是這么簡單
public const string MsgDemo1 = "<xml><ToUserName><![CDATA[gh_a413ed7b46b6]]></ToUserName>" + "<FromUserName><![CDATA[oinzFjmCt9LdPgmnEnvBShE0W5Qk]]></FromUserName>" + "<CreateTime>1406179796</CreateTime>" + "<MsgType><![CDATA[text]]></MsgType>" + "<Content><![CDATA[this is client msg]]></Content>" + "<MsgId>6039496236316578696</MsgId>" + "</xml>"; [TestMethod] public void XmlStrInjectionTest() { var msg = new TextMessage(); msg.InjectFrom<XmlStrInjection>(MsgDemo1); Assert.AreEqual(msg.FromUserName, "oinzFjmCt9LdPgmnEnvBShE0W5Qk"); Assert.AreEqual(msg.MsgId, "6039496236316578696"); Assert.AreEqual(msg.CreateTime, "1406179796"); }
源碼可以從這里獲取: https://github.com/178220709/HelloCSharp/tree/master/MyProject/WeixinModel