基于.Net Remoting的项目总结报告
Based on .Net Remoting Project Summary Report<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
任务:将一个Windows forms的Client/Server程序改写为基于.Net Remoting的程序,由IIS承载Remote Objects。
1,Windows form的Client/Server系统架构:
包含5个主要的子系统:WinUI(用户界面部分),BusinessRules(业务逻辑部分),DataAccess(数据访问部分),ApplicaitonFrameworks(负责系统参数配置和一些通用class),ExceptionManagement(负责所有系统的异常处理及log)
2,转换为基于.Net Remoting系统的若干思路
本来准备将BusinessRules子系统部署为Remote Objects,标示为SAO(SingleCall/Singleton),但立即发现了一个问题。
因为Business Class几乎都是Fileds成员变量+Public方法组成的,也符合对象技术的基本定义:将数据和操作行为(方法)包装在一起。
如果将Remote Objects部署为SAO-SingleCall,任何对Remote Objects的Public Accessors赋值/调用都会产生新的对象实例,也就是说Remote Objects是无状态的。
如果将Remote Objects部署为SAO-Singleton,显然这样也行不通,因为共享一个Remote Object实例,Fields成员变量会混乱。
虽然可以通过将方法参数直接传入,完全不使用Fileds成员变量,这样就可以解决上述问题,但是这样存在很多问题:
(1)首先,程序修改工作量巨大,我最讨厌这种没有创造性的重复工作。
(2)在Class中不使用Fileds成员变量,我觉得这样违背了对象技术的基本定义:将数据和操作行为(方法)包装在一起。另外,也丧失了使用Fileds成员变量的好处,使程序的可读性及可维护性下降。
(3)设想方法中包括N多的参数,并且多个方法都是类似的参数列表,显然不能接受。或许有人提出可以采用参数类/Entity Class来传参数,这样会产生很多的参数类,并且也违背对象技术的基本定义。
***
这样,可以考虑将Remote Objects部署为CAO(Client-Activated Object),CAO对象基本上和正常的.Net Object一样。当在Client端发出创建实例对象的请求(通过Activator.CreateInstance() or new关键字),一个激活消息将发送到Server端,然后Client端的Proxy Object并获取一个指向Remote Object的objRef对象。
CAO对象是有状态对象(stateful object),Client端对Remote Object的属性赋值后,可以在下一次正确读取,并且CAO对象在每一次方法调用都保持状态信息。
为了减少对WinUI/BusinessRules子系统的修改,显然采用CAO对象的Direct/Transparent Creation方法,具体可以参考《MarshalByRefObjects远程对象及其调用方法》,其中也有一些drawback需要注意。
我认为采用CAO来部署Remote Objects应该是可行的,不过我具体没有测试过。如果有人测试过,希望能share这方面的体会。
***
具体项目中,因为DataAccess子系统基于SqlHelper.cs类(Microsoft Data Access Application Block v2.0),无法直接将SqlHelper.cs部署为Remote Objects,前面的posting《尝试RemotingSqlHelper的若干问题》有详细的讨论。
虽然可以将SqlHelper.cs改写为可以部署为Remote Objects对象,我也的确做了一些尝试。正是由于《尝试RemotingSqlHelper的若干问题》提及的一些局限,同时也避免对BusinessRules子系统的大量修改。
最终尝试了如下的方法,并且在实际系统中验证是可行的。
3,基于.Net Remoting 的系统架构:
具体思路是这样的:
(1)将原来的DataAccess子系统部署为Remote Server,并改为RemoteDataAccess子系统,由于SqlHelper.cs不能直接部署为Remote Object,因此在外面包装一个RemotingSqlHelper Class,将RemotingSqlHelper部署为Remote Object。
(2)增加新的DataAccess子系统,该子系统负责接受来自BusinessRules子系统的调用,因此需要伪装为SqlHelper.cs的模样,否则BusinessRules子系统需要修改的地方就多了。
(3)并且新的DataAccess子系统并不直接访问SQL Server Database,而是访问RemotingDataAccess子系统中的RemotingSqlHelper Class。
其中需要注意的问题:
(1)SqlConnection对象以connection string代替,我一直习惯使用connection string,因此这个也省事了。
(2)SqlParameter对象-我定义了一个可序列化的Class,在DataAccess端,将SqlParameter对象转为可序列化的Class。然后在RemotingSqlHelper class中还原为SqlParameter对象,并调用真正的SqlHelper class。
这样,整个转换过程就大功告成了。其中BusinessRules子系统需要修改的地方很少,几乎不用改。
不过,当有大量数据记录从Server端传递到Client端时,比较明显感觉到性能受到影响。Remote Server为IIS,Channel为HTTP(IIS不支持TCP Channel),Formatter为Binary。
在此,也感谢一些friends对上述Posts的回复/评论,对我有不少启发。
当然,如果设计一个全新的基于.Net Remoting的系统,就不要费这么多周折了。
基于.Net Remoting的项目总结报告相关推荐
- 项目选题报告 (基于云的胜利冲锋队)
作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 团队作业第二次-项目选题报告 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及可视化分析平台 ...
- 项目选题报告(基于云的胜利冲锋队)
作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 团队作业第二次-项目选题报告 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及可视化分析平台 ...
- 基于SSM的商城项目项目源码+实验报告
基于SSM的商城项目 本项目是今年暑假小学期时完成的,耗时四天时间,在小学期结束项目答辩时,在年级里斩获冠军,在此很感谢我的团队,正是我们各个环节的配合,最终才能够获得如此好的成绩. 目录 基于SSM ...
- 团队作业第二次—项目选题报告(追光的人)
所属课程 软件工程1916 作业要求 团队作业第二次-项目选题报告 团队名称 追光的人 作业目标 组员提出选题,大家挑选出可行性最高的进行分析,制作选题报告和选题PPT 目录 队员贡献分比例 选题报告 ...
- 2020 年微服务项目活跃度报告
导读:2020 年 8 月 18 日,首届云原生微服务大会于线上召开,会议首日,阿里云资深技术专家.CNCF TOC 李响 Keynote 演讲中正式发布了< 2020 年微服务领域开源数字化报 ...
- 浙江理工大学信息学院本科生创新项目总结报告——简单的后台用户管理项目
信息学院本科生创新项目总结报告 研究目的与意义 基于Spring Boot框架等技术实现一个简单的后台用户管理系统项目,具有良好的用户交互体验.良好的信息反馈能力.安全防护措施,包括用户登录.用户注册 ...
- 《快活帮》第二次作业:团队项目选题报告
项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验六 团队作业2:团队项目选题报告 团队名称 快活帮 作业学习目标 (1)团队项目可行性 ...
- c语言张振国实验报告,基于VisualC的黄金分割法程序设计实验报告.doc
基于VisualC的黄金分割法程序设计实验报告 新疆农业大学机械交通学院 实验报告 基于Visual C 的黄金分割法程序设计 一 .实验目的 1. 加深对机械优化设计方法的基本理论和算法步骤的理解: ...
- 互联网+废品回收项目可行性分析报告
本项目设计书为笔者软件工程课的作业,由于时间有限较为粗糙,不合理之处还望指出并改正. 互联网+废品回收项目可行性分析报告 互联网+废品回收项目需求分析报告 互联网+废品回收项目概要设计说明书 互联网+ ...
最新文章
- 梯度下降法的三种形式-BGD、SGD、MBGD
- torch_geometric 笔记:TORCH_GEOMETRIC.UTILS(更新中)
- IoU 判断矩形区域重叠
- 远程管理,无需在机房来回穿梭
- 敏捷结果: 学习笔记
- 设计数据密集型应用程序_设计数据密集型应用程序书评
- 安卓虚拟机与Hyper-V冲突
- JVM调优总结(2):基本垃圾回收算法
- c语言switch scanf语句,C语言中scanf函数与switch语句
- 写给省选前的自己V2
- MongoDB的增删改查
- Unicode和ASCII的区别
- 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?
- esxi不能识别Intel 网卡怎么办
- 蚂蚁分类信息系统5.8 短信通道2 互亿无线配置使用说明
- vue valley_12个无剧透的Stardew Valley秘诀和技巧,助您入门
- 更改适配器设置无法和计算机连接,win10系统更改适配器没有无线网络连接的设置技巧...
- yaahp使用教程_如何用yaahp进行大量备选方案/评价对象的综合评价?
- Python最简单的图形编程
- Android 代码新增联系人至手机通讯录中
热门文章
- python 路由转发_RabbitMQ之路由键转发消息
- 神策数据:游戏买量与长线运营的数据宝典
- 深度洞见|体验经济浪潮兴起,什么才是企业制胜密钥?
- 周五话运营 | 和用户谈一段不分手的恋爱(留存分析)
- (23/24) webpack实战技巧:如何在webpack环境中使用Json
- WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
- 互联网推广方案:如何提高企业网站排名!
- SpringBoot中的Quartz应用
- jQuery remove 内存 释放
- 求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,例如:2+22+222+2222+22222