说明:

  我是一步一步跳转进去的哈

  测试的功能:通用列表页面的普通查询

  点一下查询按钮,就能看到请求的地址:/DataAsync/LoadGridData.html

  

1、DataController -> LoadGridData 里面的核心代码就一句

object list = CommonOperate.GetGridData(gridDataParams, out total, currUser);

2、CommonOperate.cs -> CommonOperate -> GetGridData

  这个文件要注意一下哈,里面有两个类,一个是CommonOperate,还有一个是TempOperate

object list = GetPageEntities(out errMsg, gridDataParmas.ModuleId,此处省略.......

3、接着就一阵跳转,跳转了下面这几个方法,跟着里面的核心方法调整就没错了

  GetPageEntities -> GetPageEntities -> ExecuteTempOperateReflectMethod ->ExecuteTempOperateReflectMethod

  下面这个方法主要是调用了 TempOperate -> GetPageEntities 这个,这里的“GetPageEntities”方法的由来,是在第二个“GetPageEntities”里面传递的一个参数产生的。

        private static object ExecuteTempOperateReflectMethod(Type modelType, string methodName, object[] args, UserInfo currUser = null)
{
Type tempType = typeof(TempOperate<>);
Type relectType = tempType.MakeGenericType(new Type[] { modelType });
//实例化对象
object obj = Activator.CreateInstance(relectType, new object[] { currUser });
MethodInfo method = relectType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
//反射执行方法
FastInvoke.FastInvokeHandler fastInvoker = FastInvoke.GetMethodInvoker(method);
object executedObj = fastInvoker(obj, args);
return executedObj;
}

4、TempOperate -> GetPageEntities 这个方法里面的核心代码

  意思就是:获取接口IBaseBLL的实现类(这里实际上是获取BaseBLL),然后调用BLL层的GetPageEntities这个方法,控制反转的意思吧

  注意: 这里有一个坑,需要特别注意一下哈,

      (1)、一开始我就调试,怎么也调试不进BLL层,然后问作者,作者说“跨解决方案断点”,反正我也是一阵纳闷。

      (2)、“跨解决方案断点”我不会,百度了一下有点点懵逼,然后就继续我的测试了。

          我接着就改了BLL的代码(实际上是在BLL层抛出了个异常),看页面是否有反应,但是页面一点反应也没有,而且数据还正常的返回了。

          当时我就纳闷了,是个什么鬼,然后问作者,作者也没回我了,可能他也确实忙,能开源都已经很不错了,我还经常厚着脸皮问,此处再说一声谢谢哈

          我就用了最笨的一个方法,照着作者的项目结构,自己也简单的搭建了一个,只有核心的几句代码,

          自己一搭建才发现了问题,我自己搭建的代码,项目之间的引用也是按照作者的来的,运行的时候就是会报错,一看bin目录发现没有BLL层的DLL

          这里bin目录没有BLL层的DLL的原因,是因为这个:

          1、整个解决方案都没有一个类库引用到BLL层,应该说成Web层的所有引用都没有一个引用BLL层,反正就是那个意思

          2、在配置BLL层的时候,更改了BLL层的输出路径(右键属性页里面),输出路径改为了这个“..\Rookey.Frame.Lib\web\”

          发现了这个,然后再去看作者的项目,就知道为什么了

          bin目录下面的“Rookey.Frame.BLL.dll”这个文件,是作者自己拷贝过去的,并不是项目生成的时候复制过去的,所以才会有更改了BLL层,代码一样运行。

IBaseBLL<T> bll = BridgeObject.Resolve<IBaseBLL<T>>(currUser, dbType);
list = bll.GetPageEntities(out totalCount, out errMsg, permissionFilter, 此处省略......
pageInfo.totalCount = totalCount;

5、BaseBll的获取代码,跟着 IBaseBLL<T> bll = BridgeObject.Resolve<IBaseBLL<T>>(currUser, dbType); 这句调整进去就可以看到,需要跳转两次哈

Type genericBllType = bllTypeList.Where(x => x.Name.Contains("BaseBLL")).FirstOrDefault();

6、这种情况的BLL层,代码怎么调试,自己研究了就补上来哈

  原文:https://www.cnblogs.com/DasonKwok/p/10510218.html

  我去,我也不知道设置了些啥,这外部的DLL居然可以调试了,继续反省反省,到底是设置了哪儿

  可以看这篇文章:https://www.cnblogs.com/guxingy/p/10980772.html

7、对 3段 进行补充

  实质是调用了这个方法:TempOperate -> GetPageEntities

  就是一个反射调用,主要看这个类 FastInvoke,具体可以看一下这篇文章(反射效率的测试):

  https://www.cnblogs.com/heekui/archive/2007/01/10/616654.html

  自己的测试(有的东西有改过)

            //反射调用 TempOperate -> GetPageEntities
if (true)
{
//01 直接调用方法
TempOperate<Order_File> _TempOperate = new TempOperate<Order_File>();
var list = _TempOperate.GetPageEntities();
} if (true)
{
//02 传统反射调用方法
Type modelType = BridgeObject.GetModelType("Order_File");
string methodName = "GetPageEntities"; Type tempType = typeof(TempOperate<>);
Type relectType = tempType.MakeGenericType(new Type[] { modelType });
MethodInfo method = relectType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public); object obj = Activator.CreateInstance(relectType);
var list = method.Invoke(obj, null);
} if (true)
{
//03 快速反射
Type modelType = BridgeObject.GetModelType("Order_File");
string methodName = "GetPageEntities"; Type tempType = typeof(TempOperate<>);
Type relectType = tempType.MakeGenericType(new Type[] { modelType });
//实例化对象
object obj = Activator.CreateInstance(relectType);
MethodInfo method = relectType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
//反射执行方法
FastInvoke.FastInvokeHandler fastInvoker = FastInvoke.GetMethodInvoker(method);
var list = fastInvoker(obj, null);
}

RookeyFrame 通用页面 加载数据 原理的更多相关文章

  1. 当vue 页面加载数据时显示 加载loading

    参考:https://www.jianshu.com/p/104bbb01b222 Vue 页面加载数据之前增加 `loading` 动画 创建组件 1.新建 .vue 文件: src -> c ...

  2. EasyUI闪屏,EasyUI页面加载提示:原理+代码+效果图

    使用EasyUI时,有个经常遇到的问题,页面还没有渲染完成的时候,就展现了. 刚刚开始很混乱,等加载完成后,就好了. 参考这篇文章http://blog.csdn.net/zheng0518/arti ...

  3. angular6 页面加载数据时的loading提示

    使用npm安装ngx-loading模块 npm install --save ngx-loading 在app.module.ts中导入模块 import { BrowserModule } fro ...

  4. Ajax 加载数据 练习 自我有些迷糊了,写的大概请谅解 ^ _ ^

    查询表的显示,查询显示如果不嵌入PHP代码的话,用ajax怎么实现?   <h1>显示数据</h1> <table width="100%" bord ...

  5. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  6. 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据

    瀑布流加载显示数据,在当下已经用的很普遍,尤其是我们在做网上商城时,在产品列表页面已经被普遍使用. 对于实现瀑布流布局的解决方案主要有以下两种方式: 1.对每一条显示数据使用绝对定位+浮动的方式,这样 ...

  7. js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的

    js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样 ...

  8. 高性能页面加载技术--BigPipe设计原理及Java简单实现

    1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动性和页面显示效果上有了很大的提升,但是对于网站动态网站的整体页面 ...

  9. js中对arry数组的各种操作小结 瀑布流AJAX无刷新加载数据列表--当页面滚动到Id时再继续加载数据 web前端url传递值 js加密解密 HTML中让表单input等文本框为只读不可编辑的方法 js监听用户的键盘敲击事件,兼容各大主流浏览器 HTML特殊字符

    js中对arry数组的各种操作小结   最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊 ...

随机推荐

  1. enum类型的标签内容根据语言的取法

    昨天做了一个开发,说要取enum里面英文label 例如  JournalType   枚举值有   transfer\profit/loss 但是在中文的AX系统时会显示“转移\盈亏”, 但是客户又 ...

  2. Pycharm配置文档教程

    1 桌面找到快捷方式 双击打开 2 3 4 需要自行注册 5 看自己喜欢选择 喜欢白色 选择左边 喜欢黑色 选择右边 6 7 可选 如果你对 Markdown 感兴趣:或者会用 就点击 install ...

  3. Nginx惊群问题

    Nginx惊群问题 "惊群"概念 所谓惊群,可以用一个简单的比喻来说明: 一群等待食物的鸽子,当饲养员扔下一粒谷物时,所有鸽子都会去争抢,但只有少数的鸽子能够抢到食物, 大部分鸽子 ...

  4. JavaJDK多任务执行框架(六)

    class Temp extends Thread { public void run() { System.out.println("run"); } } public clas ...

  5. ITIL《信息技术基础架构库》

    一 概述 1. ITIL 自上世纪70年代开始,个人计算机以及计算机网络开始在欧美发达国家普及.随着时间的推移,信息系统的规模越来越大,人们对信息系统的依赖也越来越强.特别是到了80年代,互联网开始普 ...

  6. bat计算指定文件MD5并输出txt

    @echo off set Name1=*.ADS set Name2=GM_RSSPI* set Name3=equipment* set Name4=protocols* REM 设置输出文件名 ...

  7. Java调用Http/Https接口(1)--编写服务端

    Http接口输入的数据一般是键值对或json数据,返回的一般是json数据.本系列文章主要介绍Java调用Http接口的各种方法,本文主要介绍服务端的编写,方便后续文章里的客户端的调用.文中所使用到的 ...

  8. vue 生命周期的详解

    一.vue生命周期的解析 > 1>什么是vue生命周期 每个vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期.详细来说,就是Vue实例从开始创建,初始化数据, ...

  9. 字符串导出xml文件并弹出下载对话框

    转自:https://blog.csdn.net/zhandingfeng/article/details/53887354 导出单个xml文件:[java] view plain copy      ...

  10. elasticsearch 7版本 基础操作

    elasticsearch 7版本 基础操作 首先我们浏览器http://localhost:5601/进入 kibana里的Console中输入 首先让我们在 Console 中输入: PUT t1 ...