项目重构方案设计

最近接手到一个已经成型的项目,然后我们的任务就是对它进行重构,这个项目是一个功能很齐全的WPF视频播放器(附带很多其他功能),在仔细 研究了项目的背景和架构以后,初步做出了一下的重构方案:
目前现状:
虽然整个系统做得很漂亮,代码也写得不错,但仍有以下不足:
  1. 1, 架构有待改善。虽然看似MVC架构,却没有遵循MVC的模式,里面逻辑和UI耦合很高,没有清晰的规律。
  2. 2, 没有充分用到WPF的特性。WPF除了给我们很多炫丽的效果外,还给我们提供了诸如 Binding,command等特性,这些特性可以帮我们隔开耦合,同时减少代码量。
  3. 3, 代码和文件没有组织。代码、dll、样式文件和资源文件等没有统一的组织,到处都有,这样看起来就会很混乱。
  4. 4, 没有建立公用代码库。没有把公用的代码库独立出来,很多地方都是另外在写,这样既增加了代码量,同时维护和重构也带来了麻 烦。
  5. 5, 逻辑处理不应暴露在Client。项目是一个C/S架构的系统,没有必要把所有的逻辑都暴露在Client 端,应该用分布式把Logic放在服务器端,这样可以更安全同时使客户端变小。
  6. 6, 没有单元测试。这样一个庞大的程序,没有单元测试是非常危险的,我们不可能做到100%的覆盖率,但是我们可以对主要的逻辑 和Function做单元测试,这样既减少了测试人员的工作量同时整个系统的安全、稳定和可维护性得到了大大的提高。
  7. 7, 性能不够优化。启动项目,通过WPF性能工具Perforator和Visual Profiler分析得出,程序启动和界面操作都导致CPU很高,内存也消耗比较多。
解决方案
  1. 1, 针对缺陷1的“架构问题”。做法是采用MVP或者MVVM模式,目前正在对比和考虑。
  2. 2, 针对缺陷2的“WPF特性”。做法是充分利用Binding,command等特性。
  3. 3, 针对缺陷3的“代码和文件没有组织”。做法是建立一些单独的工程或者文件来分类和组织这些代码,并且充分隔离 耦合。
  4. 4, 针对缺陷4的“没有建立公用代码库”。做法是把一些公用的代码和常用的代码做成单独的Dll,并且有完整的单 元测试,这样才能提高效率。
  5. 5, 针对缺陷5的“逻辑处理不应暴露在Client端”。做法是用WCF做为中间层,把业务逻辑全 部进行封装,通过WCF提供统一的接口供项目调用。
  6. 6, 针对缺陷6的“没有单元测试”。做法是不管用MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元 测试覆盖,同时对一些公用的组件也要有单独的单元测试代码。
  7. 7, 针对缺陷7的“性能不够优化”。这个我会单独做一个性能优化列表出来,针对耗资源的操作和其他有损害性能的操 作,我们应该避免。
  8. 那么我们就可以结合实际情况搭建如下的结构
  9.   Arc1
  10. 因为使用了MVVM模式,所以UI结构图就做如下调整
  11. Arc2
  12. 由于整个项目客户部希望我们引用第三方的组件或者工具,所以很多功能都只能通过企业库实现,比如AOP和IOC,log和exception对项 目特征做了定制化,数据访问通过企业库重写实现局部ORM,对性能要求比较高的应用仍然实现存储过程。对所有事务操作都转移到数据库,邮件使用JOB进行 发送。大型数据和客户要求较高的实时操作,用MSMQ和SSB相结合的方式。层次依赖关系
clip_image002
UI: 功能模块使用时候,都会首先通过UI层次Security模块的安全验证(验证是通过Components模块里面的自定义 的用于页面功能以及功能点验证的控件触发), Security模块会通过服务层获取用户身份数据,用于页面验证.
功能模块的实际功能实现,如果需要数据库支持,那么依然会通过服务层进行数据操作.整个架构基于MVVM模式。
Service:通过WCF做中间服务,使应用隔离开来,这样有利于扩展和维护,同事提高了整个应用程序的伸缩性。
Business Logic: 服务层内部之间的组合关系,主要体现再依赖和调用,由上往下调用,逐级依赖,最后Service底层边界Data Access模块将调用Framework中的Data模块,Data模块将调用MS.EntLib3中的Data,向数据服务器发送数据操作命令和数 据.
Framework: 该层次提供许多基础的功能模块(七大块),分别提供给UI,Service层里面的模块直接或者间接的调用,同时也可以看到Framework层次内部各 模块之间再运行时也有互相依赖调用的关系存在.该层次的部分模块会依赖和调用Ms.EntLib3中的模块,一般是按照两个层次里面的模块名称,产生关系 的.
MS.EntLib3: 该层次的各个模块是整个系统框架中最底层的,只会在运行时被更高层次的模块依赖和调用,同时该层次内部各个模块之间也存在依赖和运行时调用关系.
整个架构采用迭代的方式进行开发,这样方便客户进行实时反馈,由于现在还没有开始,所以有很多时间进行准备,如果园子里有这方面经验的朋友,也 可以畅所欲言,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker top查看容器中运行的进程信息

docker top :查看容器中运行的进程信息,支持 ps 命令参数。 语法 docker top [OPTIONS] CONTAINER [ps OPTIONS] 容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正…

docker镜像加载原理

docker镜像加载原理

navicat的安装

1.下载 这里使用的是11.1版本。 2.安装到D盘 3.破解 下载 参考:http://www.cnblogs.com/da19951208/p/6403607.html 将PatchNavicat粘贴到安装目录,然后双击 选择navicat、 结果: 4.这个时候可以使用了 转载于:https://www.cnblogs.com/junca…

docker实现宿主机和容器之间映射添加数据卷

docker run -it —privilegedtrue -v /宿主机绝对路径:/容器内目录 镜像名 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷 在ubuntu容器内 /tmp/docker_data 下新建test.txt文件 在宿主机…

实验四 恶意代码

中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 冷其航 年级 14级 区队 二区队 指导教师 高见老师 信息技术与网络安全学院 2017年10月24日 实验任务总纲 2017—2018 学年 第 一 学期 一、实验…

docker启动容器指定端口和随机分配端口

例子 我要启动tomcat docker run -d -P tomcat 大些-P表示随机分配端口 docker run -d -p 8086:8080 tomcat 小些-p 表示指定端口,主机端口:docker容器端口

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境 作者:宋杨日期:2010年7月4日星期日FeedBack:songyangsongyang.me系统环境:Windows 7 简体中文旗舰版软件环境:1、 IIS 7.5(安装FastCGI)2、 Z…

在docker安装完tomcat后,访问地址出现404错误

在docker安装完tomcat后,访问地址出现404错误 可以看到我们平时访问的文件在webapps文件夹下,而这里的这个文件夹却为空,因为他把文件都放在webapps.dist文件夹下了,所有你只需要把webapps文件夹里面的内容移到webapps里面即可 …

解决Use ‘docker scan‘ to run Snyk tests against images to find vulnerabilities and learn how to fix th

Use docker scan to run Snyk tests against images to find vulnerabilities and learn how to fix them 解决方案 执行如下命令 export DOCKER_SCAN_SUGGESTfalse

浅谈Junit4和TestNG中的参数化测试

最近在看Junit4的相关知识,由于本身做的是自动化方面的测试,所以工作上着重于应用TestNG。恰好遇到了一个将case进行参数化的需求,故在此记录Junit4和TestNG在参数化方面的区别。 一、Junit4和TestNG的注释支持 特点JUnit 4TestNG测试注释Tes…

使用docker查看和删除虚悬镜像

虚悬镜像是REPOSITORY和TAG为<none>的镜像 none镜像(虚悬镜像),那是因为 构建镜像过程中因为脚本错误导致很多镜像构建终止&#xff0c;产生很多none标签的版本 手动构建镜像的时候没有进行提交&#xff0c;遗留来的垃圾镜像 这些镜像占据较大的存储空间&#xff0c;需要…

MSN消息提示类(II)

纯js编写跨框架无图片支持调速度任意位置弹出需要ie5.5以上 <HTML><HEAD><SCRIPT languageJavaScript><!--/**//* ** ** 类名&#xff1a;CLASS_MSN_MESSAGE ** 功能&#xff1a;提供类似MSN消息框 ** 示例&#xff1a; ----------…

查看docker-compose --version报错syntax error near unexpected token `(‘‘usr/local/bin/docker-compose:

问题 执行docker-compose --version查看版本是报错如下 /usr/local/bin/docker-compose: line 2: html: No such file or directory /usr/local/bin/docker-compose: line 3: head: No such file or directory /usr/local/bin/docker-compose: line 4: meta: No such file …

spring的父子容器

在创建ssm项目工程时&#xff0c;经常需要读取properties资源配置文件&#xff0c;传统的方法当然可以。 但是spring提供了更简便的方法&#xff0c;value注解。 在page.properties文件中&#xff0c;配置分页信息。 这个时候&#xff0c;发现在Service层用value("${PAGES…

kubectl --help查看帮助命令

查看帮助命令 kubectl --help 具体查看某个操作 kubectl get --help

使用localstorage来存储页面信息

今天小颖在跟着慕课网学习vue&#xff0c;不学不知道&#xff0c;一学吓一跳&#xff0c;学了才发现&#xff0c;我之前知道的只是vue的冰山一角&#xff0c;嘻嘻&#xff0c;今天把小颖跟着慕课网学习的demo&#xff0c;给大家分享下&#xff0c;希望对大家有所帮助嘻嘻。 环境…

kubectl get cs 查看组件状态

查看组件状态 Healthy为正常 kubectl get cs

深圳SQL数据库823报错修复

深圳某电子公司SQL数据库恢复成功SQL2000数据库类型&#xff1a;SQL数据库版本&#xff1a;SQL2000MDF大小&#xff1a;1.3GB故障现象&#xff1a;SQL数据库正在编辑数据时&#xff0c;突然断电&#xff0c;开机后数据库报错再次附加数据库提示823报错&#xff01;客户要求&…