热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现

上篇已经设计出比较完善的数据库了,这篇开始进入代码。首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和

     上篇已经设计出比较完善的数据库了,这篇开始进入代码。
 首先把上篇设计的数据库脚本在数据库中执行下,生成数据库,然后在VS中建立项目,为了方便理解和查看,我设计的都是很直白的类名和文件名,没有命名空间前缀。

     采用接口方式,共8个项目:7个类库和一个MVC项目,  分别为:  

                     
                     
                     
                 
 显示层——MVC项目

                     
                     
                     
                 
 业务逻辑层——访问接口IBLL、具体实现BLL

                     
                     
                     
                 
 数据访问层——访问接口IDAL、具体实现DAL

                     
                     
                     
                 
 数据(模型)——DataModel

                     
                     
                     
                 
 通用方法——Common

                     
                     
                     
                 
 仓储——Factory

这里的仓储并不为了生产业务逻辑层和数据访问层的接口,而是为了存放EntityFramework上下文对象和一些缓存管理,业务逻辑层和数据访问层的接口生产(实现)工作我会交给Spring.NET注入实现。
框架搭建好之后如下:

bubuko.com,布布扣

 

   
框架搭建好了,接下去把数据库添加进来,在DAL中(注意是DAL不是datamodel)添加新项,选择数据--ADO.NET实体数据模型:

bubuko.com,布布扣

 

取个名字,就叫WeixinModel吧, 选择从数据库生成,配置一下数据库连接到之前生成的数据库,一路下一步,最后加载到edmx,
在edmx上右键--添加代码生成项,选择代码:bubuko.com,布布扣bubuko.com,布布扣 src="https://img.php1.cn/3cd4a/1eebe/cd5/857a46d091981bac.webp">

选DbContext Generator,  然后保存一下edmx,
之后把edmx和weixinmodel.tt复制到DataModel,删除DAL中的edmx和weixinmodel.tt,
在datamodel中打开weixinmodel.tt保存一下即可,
另外需要在DAL中保留的WeiXinModel.Context.cs中声明datamodel命名空间。  

   
框架和数据模型都有了,接下去在DAL、IDAL、BLL、IBLL中按照正确的引用层次添加引用,并写几个常用方法,就可以开始在显示层中使用了,

这里举例在DAL中写添删改查方法:


bubuko.com,布布扣id="code_img_closed_2f60e0e0-1614-411c-872c-90b5472f2c73" class="code_img_closed"
src="/img/jia.gif">bubuko.com,布布扣 id="code_img_opened_2f60e0e0-1614-411c-872c-90b5472f2c73"
class="code_img_opened" Onclick="cnblogs_code_hide(‘2f60e0e0-1614-411c-872c-90b5472f2c73‘,event)"
src="/img/jian.gif">

1 //添加
2 public T AddEntity(DbContext db,T entity) where T : class
3 {
4 db.Entry(entity).State = EntityState.Added;
5 db.SaveChanges();
6 return entity;
7 }
8
9 //修改
10 public bool UpdateEntity(DbContext db,T entity) where T : class
11 {
12 db.Set().Attach(entity);
13 db.Entry(entity).State = EntityState.Modified;
14 db.SaveChanges();
15 return true;
16 }
17 //删除
18 public bool DeleteEntity(DbContext db,T entity) where T : class
19 {
20 db.Set().Attach(entity);
21 db.Entry(entity).State = EntityState.Deleted;
22 db.SaveChanges();
23 return true;
24
25 }
26
27
28
29
30 // 返回一个对象
31 public T InfoEntities(DbContext db, Expressionbool>> whereLambda) where T : class
32 {
33
34 return db.Set().Where(whereLambda).FirstOrDefault();
35
36 }

View Code

对应的把接口、业务逻辑层都写上。

 

    现在来到显示层,默认的MVC项目是返回VIEW, 这里我们不需要返回页面, 把home中的index改成Void返回类型,
接下去就是接收微信发来的请求进行判断了,验证请求----接收POST数据---分析XML----解析成自己想要的数据

 

  入口:首先验证消息来源是微信服务器,然后解析收到的xml,解析成功有数据则执行LookMsgType方法来进行处理


bubuko.com,布布扣id="code_img_closed_430fe848-ba22-4b95-967f-5246f4e3e5ad" class="code_img_closed"
src="/img/jia.gif">bubuko.com,布布扣 id="code_img_opened_430fe848-ba22-4b95-967f-5246f4e3e5ad"
class="code_img_opened" Onclick="cnblogs_code_hide(‘430fe848-ba22-4b95-967f-5246f4e3e5ad‘,event)"
src="/img/jian.gif">

1 private IBLL.IDoWei BLLWei { set; get; }
2 public DbContext dbHome { get; set; }
3 private string token { get; set; }
4 Dictionary<string, string> xmlModel = new Dictionary<string, string>();
5 public void Index()
6 {
7 dbHome=FContext.WeiXinDbContext();
8 //xml字符串
9 string xmlData = string.Empty;
10 //请求类型
11 string method=Request.HttpMethod.ToLower();
12 string signature = Request.QueryString["signature"];
13 string timestamp = Request.QueryString["timestamp"];
14 string nOnce= Request.QueryString["nonce"];
15 //验证接入和每次请求验证真实性
16 if (method == "get")
17 {
18 if (CheckSign(signature,timestamp,nonce))
19 {
20 Often.ResponseToEnd(Request.QueryString["echostr"]);
21 }
22 else
23 {
24 Response.Status = "403";
25 Often.ResponseToEnd("");
26 }
27 }
28 //处理接收到的POST消息
29 else if (method == "post")
30 {
31 using (Stream stream = Request.InputStream)
32 {
33 Byte[] byteData = new Byte[stream.Length];
34 stream.Read(byteData, 0, (Int32)stream.Length);
35 xmlData = Encoding.UTF8.GetString(byteData);
36 }
37 if (!string.IsNullOrEmpty(xmlData))
38 {
39 try
40 {
41 xmlModel = ReadXml.GetXmlModel(xmlData);
42 }
43 catch
44 {
45 //未能正确处理 给微信服务器回复默认值
46 Often.ResponseToEnd("");
47 }
48 }
49 if (xmlModel.Count > 0)
50 {
51 string msgType = ReadXml.ReadModel("MsgType", xmlModel);
52 LookMsgType(msgType);
53 }
54 }
55 else//除了post和get外 如head皆视为非法请求
56 {
57 Response.Status = "403";
58 Often.ResponseToEnd("");
59 }
60 dbHome.Dispose();
61 }

View Code

这里用到的验证方法:



1 ///


2 /// 验证签名
3 ///

4 ///
5 ///
6 ///
7 ///
8 public bool CheckSign(string signature, string timestamp, string nonce)
9 {
10 List<string> list = new List<string>();
11 list.Add(token);
12 list.Add(timestamp);
13 list.Add(nonce);
14 //默认排序
15 list.Sort();
16 string tmpStr = string.Empty;
17 list.All(l => { tmpStr += l; return true; });
18 tmpStr = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
19 //验证
20 if (tmpStr == signature)
21 {
22 return true;
23 }
24 return false;
25 }

仓储中的EF上下文:



1 public static DbContext WeiXinDbContext()
2 {
3 DbContext dbcOntext=new WeiXinEntities(); //创建
4 dbcontext.Configuration.AutoDetectChangesEnabled = false;//自动检测配置更改
5 dbcontext.Configuration.LazyLoadingEnabled = true;//延迟加载
6 dbcontext.Configuration.ValidateOnSaveEnabled= false;//自动跟踪
7 return dbcontext;
8 }

Common中的解析微信发来的XML方法



1 //把接收到的XML转为字典
2 public static Dictionary<string, string> GetXmlModel(string xmlStr)
3 {
4 XmlDocument doc = new XmlDocument();
5 doc.LoadXml(xmlStr);
6 Dictionary<string, string> mo = new Dictionary<string, string>();
7 var data = doc.DocumentElement.ChildNodes;
8 for (int i = 0; i )
9 {
10 mo.Add(data.Item(i).LocalName, data.Item(i).InnerText);
11 }
12 return mo;
13 }
14
15
16
17 ////从字典中读取指定的值
18 public static string ReadModel(string key, Dictionary<string, string> model)
19 {
20 string str = "";
21 model.TryGetValue(key, out str);
22 if (str== null)
23 str = "";
24 return str;
25 }

好了,入口以及验证相关的都解决了,下一篇开始微信消息处理LookMsgType方法实现

[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现,布布扣,bubuko.com


推荐阅读
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
  • 如何基于ggplot2构建相关系数矩阵热图以及一个友情故事
    本文介绍了如何在rstudio中安装ggplot2,并使用ggplot2构建相关系数矩阵热图。同时,通过一个友情故事,讲述了真爱难觅的故事背后的数据量化和皮尔逊相关系数的概念。故事中的小伙伴们在本科时参加各种考试,其中有些沉迷网络游戏,有些热爱体育,通过他们的故事,展示了不同兴趣和特长对学习和成绩的影响。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
author-avatar
溪龙2012_753
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有