RookeyFrame 通用页面 加载数据 原理

 

说明:

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

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

  点一下查询按钮,就能看到请求的地址:/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);
            }

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Rookey.Frame是一套基于.NET MVC easyui的企业级极速开发框架,支持简单逻辑模块零代码编程、支持工作流(BPM)、支持二次开发,具有高扩展性、高复用性、高伸缩性。   框架特点 (1)简单逻辑模块实现零代码编程,通过简单配置即可实现增、删、改、查、数据列表、导入、导出、单字段编辑、批量编辑、复制、回收站、草稿箱、附 属模块显示配置、列表搜索框和表单外键字段自动完成、列表视图自定义、表单自定义、表单附件、权限控制、缓存配置、数据库配置、单据编号配置、模块功能控 制等功能,可线上增加功能模块、可线上增加字段 (2)完善的RABC权限体系,包括功能权限、字段权限、数据权限,支持菜单权限、列表按钮权限、字段查看、新增、编辑权限控制、数据查看、编辑、删除范围控制 (3)在系统中可支持模块分库,可实现读写分离,可方便的将系统数据库与业务数据库分离 (4)模块缓存可配置,支持本地缓存、Memcached分布式缓存和Redis分布式缓存,可扩展其他缓存方式 (5)支持列表视图自定义,用户可定义多个视图(包括外侧树视图、树网格视图、分组视图),可定义关联模块视图,视图可自由切换 (6)支持视图字段自定义、搜索字段自定义、排序字段自定义、列表操作按钮自定义 (7)支持角色表单功能,对于同一模块针对不同的角色可建立不同的表单 (8)支持表单布局自定义,可自由配置成带tab标签、panel面板的表单;多种编辑方式支持包括弹出表单编辑、打开tab标签编辑、网格内行编辑、网格内表单编辑 (9)支持表单字段自定义,包括可编辑性自定义、控件类型和宽度自定义、字段验证自定义 (10)支持单据编码规则自定义 (11)支持日志功能,包括登录日志、操作日志、异常日志 (12)支持图标管理,可自行上传图标,将其应用到菜单、按钮、树及需要图标的地方 (13)模块开发简单,实体类建立后即具备第一条所述功能 (14)实体层、数据层、业务层、操作事件层可配置 (15)支持SQL语句操作、支持Lamda表达式与SQL联合查询、支持读写分离 (16)多种关系类型数据库支持,目前支持的数据库类型有mssql,mysql,oracle,可扩展支持其他 (17)支持非关系型数据库Mongodb,可扩展支持其他 (18)支持自定义工作桌面,可为不同的角色定制不同的工作桌面 (19)支持IM(即时通迅)功能,支持单聊、群聊,支持图片、文件发送,支持头像设置 (20)系统任何模块以及后续加入模块均自动支持WebApi接口操作 (21)增加对工作流的支持,可在线设计、配置流程,支持单行、并行审批,支持子流程、分流、合流,支持回退、指派 框架整体架构图:   部分系统截图:   更多截图请参考作者博客:http://www.cnblogs.com/rookey/p/5230945.html 更多介绍:http://rookey.gotoip2.com/Page/Main.html?page=Main   开源地址:https://git.oschina.net/rookey/Rookey.Frame           标签:开发框架  easyui

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值