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,我们可以这样做:
建立消息对象
1 2 3 4 5 6 7 | 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到对象的映射约定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
标签:
ValueInjecter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异