• [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:项目发布目录

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

  • 相关阅读:
    SQL Server 日期和时间函数
    sql日期格式化函数
    C#中事件的使用
    CSS中的display:inline-block
    用aspnet_regiis注册Framework4.0框架
    什么是CSS hack
    第一次MySQL的SQL注入实验
    (二分)Block Towers(cf626)
    (多线程dp)Matrix (hdu 2686)
    (数位dp)Bomb (hdu 3555)
  • 原文地址:https://www.cnblogs.com/iambluebird/p/4969038.html
Copyright © 2020-2023  润新知