ValueInjecter----最好用的OOM(以微信消息转对象举例)
使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个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, "");
Assert.AreEqual(msg.CreateTime, "");
}
源码可以从这里获取: https://github.com/178220709/HelloCSharp/tree/master/MyProject/WeixinModel
ValueInjecter----最好用的OOM(以微信消息转对象举例)的更多相关文章
- C#开发微信门户及应用(2)--微信消息的处理和应答
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微 ...
- 使用delphi+intraweb进行微信开发4—微信消息加解密
示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. 在上一讲当中我做了个简单的微信文本消 ...
- C#/ASP.NET MVC微信公众号接口开发之从零开发(二) 接收微信消息并且解析XML(附源码)
文章导读: C#微信公众号接口开发之从零开发(一) 接入微信公众平台 微信接入之后,微信通过我们接入的地址进行通信,其中的原理是微信用户发送消息给微信公众账号,微信服务器将消息以xml的形式发送到我们 ...
- WP&Win10仿微信消息框代码分享
上次分享了幸运转盘的源码,感觉小伙伴们很喜欢:这次和大家分享下通信相关部分需要用到的类似微信的消息框代码,有需要的童鞋可以拿去用哟.自己尝试写的,可能有点low,勿喷呀! 希望以后有好的东西大家都分享 ...
- 转 C#开发微信门户及应用(2)--微信消息的处理和应答
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微 ...
- 微信消息体签名及加解密功能详细解析以及.net实现
原文:微信消息体签名及加解密功能详细解析以及.net实现 前言 微信消息体签名及加密功能已上线,明文传输确实存在安全风险,鉴于微信的用户范围使用之广泛,必定会成为众矢之的.所以大家还是尽快接入安全模式 ...
- 4.Node.js 微信消息管理
一.写在前面的话 当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应. 消息推送也是 ...
- iOS 微信消息拦截插件系列教程-(总目录)
微信iOS消息拦截插件教程 标签: 越狱开发 背景介绍 本教程所有内容免费 本教程来源于一次知识分享,如果有需要了解更多的 请联系QQ:480071411 iOS逆向高级开发群:375024882 1 ...
- 玩玩微信公众号Java版之二:接收、处理及返回微信消息
前面已经配置了微信服务器,那么先开始最简单的接收微信消息吧~ 可以用我们的微信号来直接进行测试,下面先看测试效果图: 这是最基本的文本消息的接收.处理及返回,来看看是怎么实现的吧! 首先可 ...
随机推荐
- DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...
- Spring之旅
Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...
- 在 SAE 上部署 ThinkPHP 5.0 RC4
缘起 SAE 和其他的平台有些不同,不能在服务器上运行 Composer 来安装各种包,必须把源码都提交上去.一般的做法,可能是直接把源码的所有文件复制到目录中,添加到版本库.不过,这样就失去了与上游 ...
- pt-mext
pt-mext实现的功能比较简单,就是将mysqladmin输出的多次迭代的相同status变量值放到同一行输出. 参数很少,除了--help和--version外,只有一个--relative参数 ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- # PHP - 使用PHPMailer发邮件
PHPMailer支持多种邮件发送方式,使用起来非常简单 1.下载PHPMailer https://github.com/PHPMailer/PHPMailer,下载完成加压后, 把下边的两个文件复 ...
- .NET中AOP方便之神SheepAspect
SheepAspect 简介以及代码示列: SheepAspect是一个AOP框架为.NET平台,深受AspectJ.它静织目标组件作为一个编译后的任务(编译时把AOP代码植入). 多有特性时,可根据 ...
- MyBatis源码分析(二)语句处理器
StatementHandler 语句处理器,主要负责语句的创建.参数的设置.语句的执行.不负责结果集的处理. Statement prepare(Connection connection, Int ...
- 如何理解DT将是未来IT的转型之路?
如今的IT面临着内忧外患的挑战. 一方面,企业多多少少都建立了信息化,有些企业或集团甚至会有数几十个分公司,包含直销.代理.零售以及第三方物流等多种业态.越是复杂的业务,信息化建设越困难,比如运用大量 ...
- Zephyr OS 简介
最新发布的开源 Zephyr Project™(Zephyr 项目)是一款小型且可伸缩的实时操作系统,尤其适用于资源受限的系统,可支持多种架构:该系统高度开源,对于开发人员社区完全开放,开发人员可根据 ...