分析目前项目结构

眼前出现这么一坨坨的文件夹,相信很多人已经看不下去了。是的,首先就是要把它给做掉。

按照这个项目文件夹的命名意图,大概可以划分如下:

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】开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的的更多相关文章

  1. 【G】开源的分布式部署解决方案(一) - 开篇

    做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...

  2. 【G】开源的分布式部署解决方案(三) - 一期规划定稿与初步剖析

    G.系列导航 [G]开源的分布式部署解决方案 - 预告篇 [G]开源的分布式部署解决方案(一) - 开篇 [G]开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的 [G]开源的分布式 ...

  3. 【G】开源的分布式部署解决方案文档 - 手动安装

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 序言 因各种原因,决定先写使用文档.也证明下项目没有太监.至于安装过程复杂,是因为还没有做一键安装,这个现阶段确实没精力. 项目进度 (点击图片 ...

  4. 【G】开源的分布式部署解决方案文档 - 使用手册

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 已知问题 导航没有联动 因为权限只是做了基础的登录校验,考虑到后面导航要跟权限关联上暂时是写死的. 只有部分界面使用了Vue.js 因为刚开始没 ...

  5. 【G】开源的分布式部署解决方案文档 - Web Deploy

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 微软官方部署方式 右键项目->发布 这个大家应该再熟悉不过,在部署前有个预览界面可以看本次更新到底更新哪些文件. 既然它可以预览部署结果, ...

  6. 【G】开源的分布式部署解决方案文档 - 部署Console & 控制负载均衡 & 跳转持续集成控制台

    G.系列导航 [G]开源的分布式部署解决方案 - 导航 设置项目部署流程 项目类型:选择Console,这个跟功能无关,只是做项目分类,后面会有后续功能 宿主:选择Console 部署方式:选择原始, ...

  7. 【G】开源的分布式部署解决方案 - 预告篇

    为什么想到要做分布式部署解决方案? 当项目越做越大以后,你会发现部署变成一件极其头疼的事情.当然头疼的绝不仅仅在部署一个环节,比如新服务器环境搭建当中就许多坑要踩.各种重复性的工作,包括但不仅限于增加 ...

  8. hyperledger fabric 1.0.5 分布式部署 (二)

    环境:2台 ubuntu 16.04 角色列表 角色 IP地址 宿主端口 docker端口  peer0.org1.example.com  47.93.249.250  7051  7051  pe ...

  9. 分布式事务解决方案以及 .Net Core 下的实现(上)

    数据一致性是构建业务系统需要考虑的重要问题 , 以往我们是依靠数据库来保证数据的一致性.但是在微服务架构以及分布式环境下实现数据一致性是一个很有挑战的的问题.最近在研究分布式事物,分布式的解决方案有很 ...

随机推荐

  1. CodeForces 590A Median Smoothing

    构造题. 答案可以o(n)构造出来.首先要发现规律.只有01交替的串才可能变化,变化规律如下: 1开头,长度为偶数(0结尾):变(len-2)/2次 变完后 前半1 后半01开头,长度为奇数(1结尾) ...

  2. [zoj解题] 1203

    #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAXN 100 #define ...

  3. DHCP配置部分

    1.DHCP工作过程 dhcp discover \\客户端请求服务器器提供地址 dhcp offer \\服务器提供ip地址 dhcp request \\客户端租用ip地址 dhcp ack \\ ...

  4. iOS两个关于对象的关键字

    标签: swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的 ...

  5. 【转贴】 Flex 预编译处理 与 手机项目、Web项目、Air项目自由转换

    原文连接: http://bbs.9ria.com/forum.php?mod=viewthread&tid=263350#lastpost 由于这个论坛不稳定,所以转到这里来,这个帖子蛮有用 ...

  6. SpingMvc 中文乱码 post 方式解决方案

    Web.xml <!-- spring 中文乱码问题 --> <filter> <filter-name>encodingFilter</filter-nam ...

  7. (简单) POJ 2492 A Bug's Life,二分染色。

    Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs ...

  8. 在MAC上安装GitHub DeskTop

    下载Git工具:下载链接 https://git-scm.com/downloads/ 然后配置Git:配置教程链接  http://jingyan.baidu.com/article/ceb9fb1 ...

  9. Java Base64、AES、SHA1、MD5加密算法(转载)

    package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.Inval ...

  10. 一起学JUCE之Atomic

    Atomic功能是提供简单的类保持原始值,并且提供对其执行原子操作:Atomic是线程安全的,类型的实现比较简单,就是通过各种措施保证变量的操作达到原子操作,有一点需要注意Atomic使用的时候只支持 ...