[CAMCOCO][C#]我的系统架构.服务器端.(一)
尽量少的前言
虽然写了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#]我的系统架构.服务器端.(一)的更多相关文章
- [CAMCOCO][C#]我的系统架构.服务器端.(四)----Model层 实体的自我验证
这是Model的第二篇,上一篇点这里 这块完全是扒了@何镇汐大神博客里的教程实现的,在这之前完全没想到数据验证居然可以这样做!!在此表示严重感谢!!! 点击这里可以去了解这个方法的原理,老胡估计自己是 ...
- [CAMCOCO][C#]我的系统架构.服务器端.(三)----Model层
我估计一片帖子写不完这个,慢慢来吧... 先上个图,按照图来说明应该容易说清楚一些. 在Model Core核心代码中,老胡创建了一个类 CAMCOCO.Model.Core,要求今后在Model L ...
- [CAMCOCO][C#]我的系统架构.服务器端.(二)----DATA层
这一层在园子里有很多很多的介绍了,这层写好之后老胡也没多研究,基本上就是参考的园子里大咖们的写法,具体的说明老胡也细说不了了,把接口和思路简单描述一下就好,如果有问题还是那句话,感谢您不吝赐教,老胡这 ...
- [CAMCOCO][C#]我的系统架构 总图
之前写的感觉有点乱,把架构的设计图先放上来吧,对照着说. CAMCOCO架构能够支持的模型: 1.B/S程序,比如CRM什么的,和访问普通网站没什么区别,都是从WEB服务器上进行操作: 2.APP的服 ...
- (系统架构)标准Web系统的架构分层
标准Web系统的架构分层 1.架构体系分层图 在上图中我们描述了Web系统架构中的组成部分.并且给出了每一层常用的技术组件/服务实现.需要注意以下几点: 系统架构是灵活的,根据需求的不同,不一定每一层 ...
- 浅谈大型web系统架构
动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...
- 大型web系统架构详解
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) 动态应用,是相对于网站静态内 ...
- Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析(转载)
简介: 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tomcat 的工作原理,第 2 部分将分析 Tomcat 中 ...
- Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)
简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...
随机推荐
- winform 在指定目录下已经生成资源Image图片的方式
假设在项目目录下存在一个Image目录,注意其中图片已经都设置成为:生成方式为资源文件. /// <summary> /// 得到要绘置的图片对像 /// </summary> ...
- HTML5 自动聚焦 属性
原文 : HTML5 autofocus Attribut 原文发布时间: 2012年08月27日 翻译时间: 2013年8月6日 HTML5 推出了一大堆精彩的东西给我们. 过去我们要用JavaSc ...
- Android游戏开发:物理游戏之重力系统开发--圆形自由落体Demo
本节为大家提供有关物理游戏的知识,讲解了一个简单的圆形自由落体Demo的编写.. Java代码 package com.himi; import java.util.Random; import ja ...
- 【JavaScript】父子页面之间跨域通信的方法
由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇“跨域,不再纠结” 开始照着尝试时 ...
- mysql 线程级别的缓冲区
线程栈信息使用内存(thread_stack) 主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存 ...
- MySQL auto_increment实现
http://www.cnblogs.com/xpchild/p/3825309.html 运维的时候,经常遇到auto_increment的疑惑: 机器异常crash,重启后id回退的问题 性能考虑 ...
- 基于jQuery的图片相册滑出放大插件
今天给大家带来一款基于jQuery的图片相册滑出放大插件.点击相册图片,展示该图片.该插件适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗..效 ...
- Golang学习 - io 包
------------------------------------------------------------ 先说一下接口,Go 语言中的接口很简单,在 Go 语言的 io 包中有这样一个 ...
- Replace INTO与INSERT INTO的不同之处
Replace INTO和INSERT INTO的区别: REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有 ...
- docker 连接容器
1.通过端口映射 sudo docker run -d -P training/webapp python app.py 容器有一个内部网络和IP地址(在使用Docker部分我们使用docker in ...