博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RookeyFrame 通用页面 加载数据 原理
阅读量:6494 次
发布时间:2019-06-24

本文共 4630 字,大约阅读时间需要 15 分钟。

 

说明:

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

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

  点一下查询按钮,就能看到请求的地址:/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
bll = BridgeObject.Resolve
>(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
_TempOperate = new TempOperate
(); 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); }

 

转载于:https://www.cnblogs.com/guxingy/p/10977913.html

你可能感兴趣的文章
[DeeplearningAI笔记]序列模型1.5-1.6不同类型的循环神经网络/语言模型与序列生成...
查看>>
P2533 [AHOI2012]信号塔
查看>>
Android电话拨号器(uri格式)与四种设置点击事件的方法
查看>>
java web中对json的使用
查看>>
TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)
查看>>
将数据库中提取出来的数据在后台进行分页处理
查看>>
bzoj1034
查看>>
百度地图 鼠标绘制,获取矩形,多边形的顶点经纬度
查看>>
回文树模板
查看>>
struts2之防止表单重复提交
查看>>
【转】Netty系列之Netty并发编程分析
查看>>
cf591d
查看>>
图片存储系统TFS
查看>>
MYSQL备份与恢复
查看>>
贪心/数学 Codeforces Round #212 (Div. 2) A. Two Semiknights Meet
查看>>
Python类__call__()方法
查看>>
「小程序JAVA实战」 小程序wxss样式文件的使用(七)
查看>>
容斥定理,皮克公式
查看>>
git+idea
查看>>
cocos2d游戏开发,常用工具集合
查看>>