【G】开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的
分析目前项目结构

眼前出现这么一坨坨的文件夹,相信很多人已经看不下去了。是的,首先就是要把它给做掉。
按照这个项目文件夹的命名意图,大概可以划分如下:
1.Business:业务代码
2.Data:数据访问
3.Helpers:辅助类(通用类库之类的)
4.Models:各种模型(包括视图模型)
5.theme:皮肤,还有一些content、scripts之类的应该是要删除或整理到theme中。
6.Controller、Views、DB:这些就先不动他了。
按文件夹名的意图重新整理项目结构

首先整理出4个解决方案文件夹(注:解决方案文件夹是个虚拟的结构,并非真实的物理文件夹,虽然源码存放位置也缺失按照目前分层做的,但这个概念要分开),分别是 Business、Model、Data、Infrastructure,将业务、模型、数据、基础设施给分拆出来。
其中Business、Model两个文件夹主要与业务相关,这两个文件夹会根据功能模块创建对应的项目,比如 DeployManage、UserManage等。像部署下的一些小的概念,如部署服务器、部署服务器组、部署项目等这些只需要在对应项目下创建1级文件夹区分开即可。
而Data下拆分为2个,主要考虑到 Wrapper 是给Business用的,主要用来访问数据库,而Entities则是用于存放数据表对应的实体类。
最后的Infrastructure则把一些公共的类放到了这里。
可能有人不禁要问一下,就这么简单?这就是最终项目结构了吗?
当然不是,重构即是一个动作,也是一个过程。后面会根据项目发展不断的进行重构。
迁移过程中遇到的问题与解决
1.李鬼李逵傻傻分不清楚

首先遇到的问题则是它,AuthenticationDescription,按照已有的命名空间引用,正常推论是只要引用 Microsoft.Owin.Security.dll 就可以了。但事实证明不行。
为了知道到底是什么原因,我又把这个类放回原来的位置,F12跟踪进去一看,嘿,原来是个李鬼装李逵。

最终通过添加了Microsoft.Owin.dll 解决,这个类其实跟Microsoft.Owin.Security.dll没关系的。真真是被戏耍了一番。
2.雷锋,你做了好事倒是留个名啊

大家可能比较喜欢使用vs自带的这个小灯泡,是的它很方便,但它不是万能的。如果你按照这里的选项来做你有2个选择,要么新建一个类自己实现,要么引用 System.Runtime.Remoting.Context
虽然通过上面的办法我们也能找到最终是谁做的好事,但这个时候经验出现了,我一眼就看出来这是EF帮忙扩展了的(毕竟踩的坑多)。它做了好事儿,但它还没留下自己的名字,只告诉我它是个无名氏。当初第一次踩这个坑也是通过第一个方法解决的,性质跟是一样的,但这里想告诉大家,积累也很重要。

当处理到Business的时候,发现它终于可以给一个正确的提示了,这就好像A是B的老婆,B是C的同事,C认识B自然问B就知道A是谁了。
3.你女儿嫁人了她还是你女儿啊

把引用关系都改好了,过程中修改名字也都使用了大家喜欢的小灯泡同时更改所有的引用,为什么还会出现这个问题?难道View你就不管了吗?她不是你生的?

就是这个泼出去的水,你生的还要我来擦屁股。这里仅仅只是吐槽罢了。

看到了这个页面我长舒了一口气,终于是不报错了。

再来看下 G.Client.UI.Admin 好像是顺眼多了。
但这就改完了吗?这只是个开始而已,后面的路还长呢。
4.青春痘长在别人脸上你最不担心?

好好的一个业务层代码,引用了EF,着实是不爽。不仅如此,Model里也引用了System.Web来获取UserID。
作为一个有道德的人,别人脸上长了青春痘,你应该拿个扬声器对着他喊:喂,你脸上有青春痘,好大一颗,好难看!
nonono,作为一个有文化的人,我当然会解决你的痛处。而不是现在,后面一定会做的。其实很简单,只需要在Wrapper里封装好EF的操作,让Business不会直接引用到EF相关的功能即可。(这个是.net的机制不深究了)
同样的,System.Web的也通过Infrastructure里提供就好了。从此再也不担心青春痘乱长了。
代码方面的调整
作为一个懒人,第一个要解决的肯定是解放双手。

后面对数据库操作的还有好多地方,到处都要这样赋值真的是心疼自己细白嫩长的五指。
已经有很多人想到了AutoMapper吧?当然也有人喜欢EmitMapper等等。各有所长,萝卜白菜自己挑一个啃了吧。用法我就不多说了,看个最终代码。当然我用的是自己又封装一次的AutoMapper。
即便AutoMapper已经很灵活了,但每个人的习惯不同,总有你觉得不爽的地方,那就自己动手吧。

啧啧啧,瞬间又顺眼了好多,整个人都好了。
PS:这次引用的Mapper是我们自己写的,Framework.Mapping和Framework.Caching。暂时还没有开源,后面会放出来,其实也没加壳混淆,你有兴趣肯定难不住你的。
最后最后,本项目暂定名为 G,唯一群号:7424099
Git地址:http://git.oschina.net/doddgu/G (希望大家可以顺手点个star,感谢各位的支持)
【G】开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的的更多相关文章
- 【G】开源的分布式部署解决方案(一) - 开篇
做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...
- 【G】开源的分布式部署解决方案(三) - 一期规划定稿与初步剖析
G.系列导航 [G]开源的分布式部署解决方案 - 预告篇 [G]开源的分布式部署解决方案(一) - 开篇 [G]开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的 [G]开源的分布式 ...
- 【G】开源的分布式部署解决方案文档 - 手动安装
G.系列导航 [G]开源的分布式部署解决方案 - 导航 序言 因各种原因,决定先写使用文档.也证明下项目没有太监.至于安装过程复杂,是因为还没有做一键安装,这个现阶段确实没精力. 项目进度 (点击图片 ...
- 【G】开源的分布式部署解决方案文档 - 使用手册
G.系列导航 [G]开源的分布式部署解决方案 - 导航 已知问题 导航没有联动 因为权限只是做了基础的登录校验,考虑到后面导航要跟权限关联上暂时是写死的. 只有部分界面使用了Vue.js 因为刚开始没 ...
- 【G】开源的分布式部署解决方案文档 - Web Deploy
G.系列导航 [G]开源的分布式部署解决方案 - 导航 微软官方部署方式 右键项目->发布 这个大家应该再熟悉不过,在部署前有个预览界面可以看本次更新到底更新哪些文件. 既然它可以预览部署结果, ...
- 【G】开源的分布式部署解决方案文档 - 部署Console & 控制负载均衡 & 跳转持续集成控制台
G.系列导航 [G]开源的分布式部署解决方案 - 导航 设置项目部署流程 项目类型:选择Console,这个跟功能无关,只是做项目分类,后面会有后续功能 宿主:选择Console 部署方式:选择原始, ...
- 【G】开源的分布式部署解决方案 - 预告篇
为什么想到要做分布式部署解决方案? 当项目越做越大以后,你会发现部署变成一件极其头疼的事情.当然头疼的绝不仅仅在部署一个环节,比如新服务器环境搭建当中就许多坑要踩.各种重复性的工作,包括但不仅限于增加 ...
- hyperledger fabric 1.0.5 分布式部署 (二)
环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口 peer0.org1.example.com 47.93.249.250 7051 7051 pe ...
- 分布式事务解决方案以及 .Net Core 下的实现(上)
数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性.但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题.最近在研究分布式事物,分布式的解决方案有很 ...
随机推荐
- flexpaper二次开发
1.首先下载FlexPaper的源码.下载地址 2.本人不懂flash,只是百度下,然后自己瞎弄弄的.我用的flash build 4.5 提供个key:1499-4181-9296-6452-299 ...
- 常用HQL集锦
1.根据ID查询某"一个"实体类 方法1: String hql = "From ClassEntity as c where c.id=?"; ClassEn ...
- PHP操作mysql类
<?php class Mysql{ //数据库连接句柄 private $link; //返回结果集 private $result; //返回查询数据 private $data; //执行 ...
- html元素被隐藏在后面
当有些html元素是由于某些控件生成的,然后它被隐藏在其他元素的后面,但是它一开始是隐藏的,你无法直接在html或js里修改它的属性:z-index,使其可以放在更前面,这时可以在css里重新定义控件 ...
- MySQL的MyISAM和InnoDB
1.概述 MySQL数据库其中一个特性是它的存储引擎是插件式的.用户可以根据应用需要选择存储引擎.Mysql默认支持多种存储引擎,以适用各种不同的应用需要. 默认情况下,创建表不指定表的存储引擎,则新 ...
- WebService调用权限验证 SoapHeader
一般在项目中,制作的都是基于SOAP协议的webservices,其描述语言是WSDL.但是有时候在项目中,需要保证webservices的安全,需要对其进行进行验证,那么我们就要实现SoapHead ...
- 绕过网站安全狗拦截,上传Webshell技巧总结(附免杀PHP一句话)
这篇文章我介绍一下我所知道的绕过网站安全狗上传WebShell的方法. 思路是:修改HTTP请求,构成畸形HTTP请求,然后绕过网站安全狗的检测. 废话不多说,切入正题.... 1.实验环境: Win ...
- iOS 之 导航栏按钮
UIButton *releaseButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; [releaseButton setTitle ...
- Swift分割字符串
var str_componets = "I Like Swift " str_componets.componentsSeparatedByString(" " ...
- 在centos 6.5 x64中安装 spark-1.5.1
以下内容参考:http://blog.csdn.net/lovehuangjiaju/article/details/48494737 1.解压安装文件,设置环境变量 这里我们使用的安装文件是已经编译 ...