尽量少的前言

虽然写了N年代码了,但总觉得什么东西都是囫囵吞枣,无法尽得其精髓。最近整理了一套心目中的架构,如有错误之处,烦劳不吝指正,老胡在此不胜感激!!

第一篇 我心目中的架构

做了无数个系统,写了无数个项目,有几个问题始终困扰着我。

总是重复做着同样的功能,比如组织架构,比如权限模型;

代码质量总是无法得到根本性的保障;

大量的功能性代码重复,没有被很好地抽象出来(其实就是设计模式没有被很好地利用起来);

过一段时间后修改代码很困难,因为代码风格总是随着时间在不断变化,并且大部分时候代码都是来自好几个人的。

我想有一个架构,它可以有以下一些特性:

  1、利用EntityFramework实现ORM特性,在设计及编写项目时,思路能最大程度地保持在业务本身,而不用跳出到数据库设计上去;

  2、借鉴DDD的设计思想,将业务逻辑封装到聚合里(实际上我是很想完全采用DDD的,但是啃了半天书,因为没有实际项目的实践,在领域事件上仍觉得很模糊,并且对于聚合的实际应用方式也不是很清晰);

  3、将通用性的一些操作,比如增删改查,抽象出来,放到业务逻辑的核心层去实现,每个业务逻辑不用再自己实现。这样上层重复代码量将会少很多;

  4、规范一些基本操作的代码写法,在最大程度上确保上层代码质量的可控性;

  5、通过SOA模式,实现包括一站式登陆、权限判断、通用(常用)模块的独立运行;

  6、业务逻辑层不局限于对某一特定模式的UI层的支持,它应该能够广泛地支持WEB、MVC WEB、WINFORM、MOBILE(ios or android)端的调用;

  总之,通过这个架构,我想能够在编写具体业务功能的时候使用尽量少、尽量标准的代码来实现。

  基于此,我对整个架构进行了如下一个层次划分:

01 UI 层代码:这里是各种客户端的代码,我在其下做了个01.01 MVC WEB Application的目录,如果有其他的客户端,可以在这下面实现,比如增加一个 01.02 WIN FORM Application。

02 SOA:为界面层提供数据的服务层,这一层实际上是一个数据中转层。我将业务逻辑中的各个聚合都通过SOA暴露给客户端,那么不同的客户端都可以通过统一的方式来对系统进行访问了,实际上这一层也起到了一个防腐层的作用。当然,如果是本机运行的WIN FORM模式,或者不希望采用SOA模式,也可以在UI层直接调用业务逻辑层。

03 Business Logic:业务逻辑层,在这里面对不同的业务逻辑按照DDD的设计思想,设计为不同的聚合(Aggregate),这一层也是需要我们自己编写的。SOA层与这一层进行通讯。

04 Model Logic:模型层,也就是实体层。我将业务中的实体对象单独拆分出来,没有和业务层放到一起,因为在UI层里都会用到各个实体的定义,而业务逻辑层我并不想直接交给UI层去使用。UI只需要知道自己当前使用的实体有哪些属性可以使用就好。实体我采用的是充血模型,包括自我验证等特性,这个会在后面说到。

05 Business Core:业务逻辑核心包(代码),严格说来,带Core名字后缀的都不是单独的一层,只是一个基类。业务逻辑层的代码都是从这个东西派生出来的,这里面包含了一些基本的、通用性的业务操作。

06 Model Core:实体层核心包,同上,我在这里给定义了集中标准的实体模型基类,所有实体都需要从这些标准基类中派生出来。同时在这里实现了一些实体的克隆、验证等通用方法。

07 DATA:数据持久层。一直很纠结这里究竟要怎么做,尤其是对不同数据库的支持上,最后因为自己一直使用SQLSERVER,所以这里直接就通过EntityFramework来实现了,EF本身就支持很多种数据库,但没测试过,至少在我的需求内,SQLSERVER是完全没问题的。

08 General:通用描述定义,这里不能称为一层了,我把一些常用的数据类型进行了标准化,实体类在使用这类属性的时候直接从通用描述定义里取得就行,这样利于实现数据格式的标准化,比如实现了数据锁定状态描述信息、数据过期状态描述信息等。

09 Common:工具类,就是各种Helper,这里的工具可以根据需要随时增加。

10 Reference Lib:引用的第三方类库统一放到这个目录下,方便查找。

11 Solution Documents:项目文档什么的,都放这里就好。

12 Test Projects:单元测试代码

13 Publish:项目发布目录

额,下一篇从最底层写起...

[CAMCOCO][C#]我的系统架构.服务器端.(一)的更多相关文章

  1. [CAMCOCO][C#]我的系统架构.服务器端.(四)----Model层 实体的自我验证

    这是Model的第二篇,上一篇点这里 这块完全是扒了@何镇汐大神博客里的教程实现的,在这之前完全没想到数据验证居然可以这样做!!在此表示严重感谢!!! 点击这里可以去了解这个方法的原理,老胡估计自己是 ...

  2. [CAMCOCO][C#]我的系统架构.服务器端.(三)----Model层

    我估计一片帖子写不完这个,慢慢来吧... 先上个图,按照图来说明应该容易说清楚一些. 在Model Core核心代码中,老胡创建了一个类 CAMCOCO.Model.Core,要求今后在Model L ...

  3. [CAMCOCO][C#]我的系统架构.服务器端.(二)----DATA层

    这一层在园子里有很多很多的介绍了,这层写好之后老胡也没多研究,基本上就是参考的园子里大咖们的写法,具体的说明老胡也细说不了了,把接口和思路简单描述一下就好,如果有问题还是那句话,感谢您不吝赐教,老胡这 ...

  4. [CAMCOCO][C#]我的系统架构 总图

    之前写的感觉有点乱,把架构的设计图先放上来吧,对照着说. CAMCOCO架构能够支持的模型: 1.B/S程序,比如CRM什么的,和访问普通网站没什么区别,都是从WEB服务器上进行操作: 2.APP的服 ...

  5. (系统架构)标准Web系统的架构分层

    标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...

  6. 浅谈大型web系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

  7. 大型web系统架构详解

    (如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 动态应用,是相对于网站静态内 ...

  8. Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析(转载)

    简介: 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tomcat 的工作原理,第 2 部分将分析 Tomcat 中 ...

  9. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

随机推荐

  1. Java中static的用法

    static静态,作为修饰符,最初是由c引入,一开始static表示退出一个块后依然存在的局部变量.随后,static表示不能被其他文件访问的全局变量和函数.到了C++和java,static表示属于 ...

  2. DBCP连接池介绍

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4. DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 ...

  3. Android常见工具类封装

    MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...

  4. 64位ubuntu下装32位软件

    本帖最后由 wuy069 于 2013-10-25 12:28 编辑 很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软 ...

  5. WinForm特效:桌面上的遮罩层

    一个窗体特效,帮你了解几个windows api函数.效果:windows桌面上增加一个简单的遮罩层,其中WS_EX_TRANSPARENT 比较重要,它实现了鼠标穿透的功能. using Syste ...

  6. TP复习5

    ## ThinkPHP 3.1.2 查询方式#讲师:赵桐正微博:http://weibo.com/zhaotongzheng 本节课大纲:一.普通查询方式 a.字符串 $arr=$m->wher ...

  7. ccConfig(设置一些底层接口状态:是否支持动作叠加 设置fps更新间隔和位置 是否画边框等。。)

    #ifndef __CCCONFIG_H__ #define __CCCONFIG_H__ #include "platform/CCPlatformConfig.h" /** @ ...

  8. 好记心不如烂笔头之jQuery学习,第一章

    jQuery对象和DOM对象的转换: 1.jquery对象是对象数组,于是乎: var $cr = $('#cr'); var cr = $cr[0]; 2.使用jquery的自带函数: var $c ...

  9. 使用Ant命令压缩JavaScript文件

    压缩JavaScript文件可以减少代码尺寸,保护源代码,节省网络带宽,加快页面打开速度,甚至优化JS代码.Yahoo有一个压缩JS的工具叫做YUI compressor, Google也有一个工具叫 ...

  10. IIS 发布网站遇到的问题

    1.解决win7 64位[ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序 http://wwwu8.wap.blog.163.com/w2/blogDetail.do?hostID ...