使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个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, "");
Assert.AreEqual(msg.CreateTime, "");
}

源码可以从这里获取: https://github.com/178220709/HelloCSharp/tree/master/MyProject/WeixinModel

ValueInjecter----最好用的OOM(以微信消息转对象举例)的更多相关文章

  1. C#开发微信门户及应用(2)--微信消息的处理和应答

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微 ...

  2. 使用delphi+intraweb进行微信开发4—微信消息加解密

    示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...

  3. C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)

    文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...

  4. WP&Win10仿微信消息框代码分享

    上次分享了幸运转盘的源码,感觉小伙伴们很喜欢:这次和大家分享下通信相关部分需要用到的类似微信的消息框代码,有需要的童鞋可以拿去用哟.自己尝试写的,可能有点low,勿喷呀! 希望以后有好的东西大家都分享 ...

  5. 转 C#开发微信门户及应用(2)--微信消息的处理和应答

    微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微 ...

  6. 微信消息体签名及加解密功能详细解析以及.net实现

    原文:微信消息体签名及加解密功能详细解析以及.net实现 前言 微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的.所以大家还是尽快接入安全模式 ...

  7. 4.Node.js 微信消息管理

    一.写在前面的话   当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应.   消息推送也是 ...

  8. iOS 微信消息拦截插件系列教程-(总目录)

    微信iOS消息拦截插件教程 标签: 越狱开发 背景介绍 本教程所有内容免费 本教程来源于一次知识分享,如果有需要了解更多的 请联系QQ:480071411 iOS逆向高级开发群:375024882 1 ...

  9. 玩玩微信公众号Java版之二:接收、处理及返回微信消息

    前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~   可以用我们的微信号来直接进行测试,下面先看测试效果图:   这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧!   首先可 ...

随机推荐

  1. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  2. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  3. Linux 开机时网络自动连接

      简单版本: cd /etc/sysconfig/network-scripts/ vi ifcfg-enoXXX 输入:reboot重启 或者输入:service network restart ...

  4. Android N开发 你需要知道的一切

    title: Android N开发 你需要知道的一切 tags: Android N,Android7.0,Android --- 转载请注明出处:http://www.cnblogs.com/yi ...

  5. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  6. ASP.NET MVC开发日常一:SessionID合理清除

    在MVC Web开发中临时存储数据一般会用到Session,Cookie,ViewBag,ViewData,TempData.每个的使用场景是不同,具体区别有空再补上. Session数据最敏感,最需 ...

  7. 为IEnumerable<T>添加RemoveAll<IEnumerable<T>>扩展方法--高性能篇

    最近写代码,遇到一个问题,微软基于List<T>自带的方法是public bool Remove(T item);,可是有时候我们可能会用到诸如RemoveAll<IEnumerab ...

  8. golang语言构造函数

    1.构造函数定义 构造函数 ,是一种特殊的方法.主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个 ...

  9. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  10. gulp批量打包文件并提取公共文件

    gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器. browseriyf是模块化打包工具. 一般情况下,Browserify 会把所有的模块打包成单个文件.单个文件在大多数情况下是 ...