• ValueInjecter----最好用的OOM(以微信消息转对象举例)


      使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的.

      这种类型的工具有很多,比如automapper,EmitMapper,还有和orm混合的dapper等,各有各的特色, 但综合性能,扩展,易用性来说,我觉得ValueInjecter是用的最舒服的.

       太简单的场景我就不举例了, 可以看这里 

           今天玩了玩微信接口开发,写对象转换的时候,再一次感觉到了ValueInjecter的便利,于是有了这篇文.

    场景说明: 

      场景一,接口验证,参数在get请求的url上面, 比如这种:http://i.cnblogs.com/EditPosts.aspx?postid=3866781&update=1&para3="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

  • 相关阅读:
    面试题 16:反转链表
    Makefile学习之路6————通过函数增强功能
    Makefile学习之路5————变量
    Makefile学习之路3————规则的运行
    LED灯C语言的点亮方式
    LED灯汇编机器码的点亮方式
    Linux的进阶命令
    入门命令2
    shell命令解析器功能说明及入门命令1
    C++基础 — C++中的变量和三目运算符
  • 原文地址:https://www.cnblogs.com/suijing/p/ValueInjecter_demo.html
Copyright © 2020-2023  润新知