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

我估计一片帖子写不完这个,慢慢来吧。。。

先上个图,按照图来说明应该容易说清楚一些。

在Model Core核心代码中,老胡创建了一个类 CAMCOCO.Model.Core,要求今后在Model Logic中编写的实体类都必须从这里继承。

Core里提供了两种基类,一个是Entity的基类,一个是Filter基类。

先给出实体类的继承结构:代码有点多,点开再看^v^

 1 namespace CAMCOCO.Model.Core.Entity
 2 {
 3     using System;
 4
 5     #region _BaseEntity 数据实体基类
 6
 7     /// <summary>
 8     /// 数据实体基类
 9     /// </summary>
10     public abstract class _BaseEntity : IDisposable
11     {
12         //do nothing...
13         public virtual void Dispose()
14         {
15         }
16     }
17
18     #endregion
19
20
21
22     #region _BasicEnityClone 数据实体克隆类:继承自此的类均可实现Clone自身的操作
23
24     /// <summary>
25     /// 数据实体克隆类:继承自此的类均可实现Clone自身的操作
26     /// ----------------
27     /// 本类为抽象类,不能直接实例化
28     /// </summary>
29     public abstract partial class _BasicEnityClone : _BaseEntity
30     {
31         //在分部类_BasicEnityClone中实现具体定义
32     }
33
34     #endregion
35
36
37
38     #region _BaseEntityValidation 数据实体自我验证类:继承自此的类可以进行数据合法性自我验证
39
40     /// <summary>
41     /// 数据实体自我验证类:继承自此的类可以进行数据合法性自我验证
42     /// </summary>
43     public abstract partial class _BaseEntityValidation : _BasicEnityClone
44     {
45         //在分部类_BaseEntityValidation中实现具体定义
46     }
47
48     #endregion
49
50
51
52
53
54
55     #region BaseEntityNormal 标准数据实体类:构成一个数据实体的基本属性
56
57     /// <summary>
58     /// 标准数据实体类:构成一个数据实体的基本属性
59     /// </summary>
60     public abstract partial class BaseEntityNormal : _BaseEntityValidation
61     {
62         //在分部类BaseEntityNormal中实现具体定义
63     }
64
65     #endregion
66
67
68
69     #region BaseEntityOrder 可自定义排序的数据实体类:通过增加OrderIndex属性实现自定义排序
70
71     /// <summary>
72     /// 可自定义排序的数据实体类:通过增加OrderIndex属性实现自定义排序
73     /// </summary>
74     public abstract partial class BaseEntityOrder : BaseEntityNormal
75     {
76         //在分部类BaseEntityOrder中实现具体定义
77     }
78
79     #endregion
80
81
82
83     #region BaseEntityTree 支持树形结构的数据实体类:通过增加ParentId属性实现树形结构
84
85     /// <summary>
86     /// 支持树形结构的数据实体类:通过增加ParentId属性实现树形结构
87     /// </summary>
88     public abstract partial class BaseEntityTree : BaseEntityOrder
89     {
90         //在分部类BaseEntityTree中实现具体定义
91     }
92
93     #endregion
94
95 }

简单说来就是 _BaseEntity -> _BasicEnityClone -> _BaseEntityValidation -> BaseEntityNormal -> BaseEntityOrder -> BaseEntityTree

_BasicEnityClone 虚类实现了实体间属性克隆的功能,这个在老胡的架构里很重要,在后面聚合方法的add和update里会说到为什么这么做。

_BaseEntityValidation 虚类则实现了实体模型的自我验证功能,一个实体对象数据是否合法(比如必填字段是否填写、数据库中是否存在同名记录等等),都是通过这个虚类中的代码来实现的。(下一节来说明这个东东了)

Entity基类就是所有实体的基类了,在以前的项目实践中,老胡总结出三种常见的数据(实体)模型来:

1、BaseEntityNormal模型:标准的数据模型,每条数据(每个实体)都具备一个唯一编号,也就是ID。在这之上,老胡又增加了几条标准,比如删除标记,比如记录时间。

 1 namespace CAMCOCO.Model.Core.Entity
 2 {
 3     using System;
 4     using System.ComponentModel.DataAnnotations;
 5     using System.ComponentModel.DataAnnotations.Schema;
 6
 7     public partial class BaseEntityNormal
 8     {
 9         /// <summary>
10         /// 实体索引,在数据库中是一个自增标识,并且定义为主键,具备唯一性和聚集索引特性
11         /// </summary>
12         [Key]
13         public long Id { get; set; }
14
15         public class EntityNormalPropertyClass
16         {
17
18
19             /// <summary>
20             /// 实体创建时间,此时间作为数据创建的备案记录,在任何条件下均不允许修改
21             /// </summary>
22             [Required]
23             [Index(IsClustered = false, IsUnique = false)]
24             public DateTime GenerateTime { get; set; }
25
26             ///// <summary>
27             ///// 实体数据发布人索引,当无法明确数据来源时,这个属性可以设置为0 【老胡说事:这个东西已经被老胡无情地砍掉了,真没啥用!!】
28             ///// </summary>
29             //[Index(IsClustered = false, IsUnique = false)]
30             //public long OwnershipId { get; set; }
31
32             /// <summary>
33             /// 数据删除标志位,当为true时表示这是一条已删除数据
34             /// </summary>
35             [Index(IsClustered = false, IsUnique = false)]
36             public bool DeleteFlag { get; set; }
37
38             /// <summary>
39             /// 实体数据删除时间
40             /// </summary>
41             [Index(IsClustered = false, IsUnique = false)]
42             public DateTime DeleteTime { get; set; }
43         }
44
45         public EntityNormalPropertyClass System { get; set; }
46     }
47 }

2、BaseEntityOrder模型。在常见的系统设计中,有一类数据并非是根据ID来顺序或反序排列的,它们需要使用自定义排序,比如一个字典项。这类模型除了标准的实体属性外,应该还有一个自定义排序的Order_Index字段。

 1 namespace CAMCOCO.Model.Core.Entity
 2 {
 3     using System;
 4     using System.ComponentModel.DataAnnotations;
 5     using System.ComponentModel.DataAnnotations.Schema;
 6
 7
 8     public partial class BaseEntityOrder
 9     {
10         public class EntityOrderPropertyClass
11         {
12             /// <summary>
13             /// 自定义排序时,数据的排序序号,可根据此来进行ASC或DESC的排序
14             /// </summary>
15             [Index(IsClustered = false, IsUnique = false)]
16             public int Index { get; set; }
17         }
18         public EntityOrderPropertyClass Order { get; set; }
19     }
20 }

3、BaseEntityTree模型。还有一种模式的数据格式也是很常见的,就是树形模型。例如我们在做组织架构时、商品类目时,就肯定会用到这种模型了。老胡也把这种模型给定义出来了,增加了个ParentId的属性。

 1 namespace CAMCOCO.Model.Core.Entity
 2 {
 3     using System;
 4     using System.ComponentModel.DataAnnotations;
 5     using System.ComponentModel.DataAnnotations.Schema;
 6
 7     public partial class BaseEntityTree
 8     {
 9         public class EntityTreePropertyClass
10         {
11             /// <summary>
12             /// 实体数据的父节点索引,在Tree模型或父子关系模型中,用于表现层级结构的属性
13             /// </summary>
14             [Index(IsClustered = false, IsUnique = false)]
15             public long ParentId { get; set; }
16         }
17
18         public EntityTreePropertyClass Tree { get; set; }
19     }
20 }

额,有了这三种基本模型,绝大部分格式的数据结构咱都能满足了,当然出了更特殊的数据结构的时候,如果有必要,我们再来增加一种就好了。

为什么要把这三种模型作为标准提出来呢?因为老胡的架构想实现一个功能,那就是,只要你是BaseEntityOrder派生出来的,那老胡的架构自身就能提供标准的移动接口来管理数据的上移、下移、置顶、置尾功能了,不用你再去写代码(到处写实现相同功能的代码一直是老胡深恶痛绝的)。

至于怎么实现这个东东?在后面的Business Core里会说到的。

再说说BaseFilter基类吧,因为在UI层会用到两个很重要的东西,一个是实体类的定义,比如在界面上显示一个客户资料时,我们一般这样做:

Customer cus = iCustomerQuery.findCustomer(customerId);

cus.Name...

cus.Address...

我们在使用Customer时,必须有这个实体类的原型定义,SO,实体模型必须暴露给UI层使用。

为什么业务层又可以不暴露给UI层呢,因为老胡在中间加了个SOA层,业务层是暴露给SOA的,UI对业务的操作是通过SOA来进行的,所以不强制要求UI知道业务层。

当UI需要查找某些数据时,老胡希望有一个尽量规范的格式来进行查询交互,所以引入了Filter这个概念。UI将需要的查询条件构造为一个符合要求的Filter,然后交给SOA,由SOA转发给Business,业务层就清楚需要查询什么样的数据了。

so,,,,Filter是什么?Filter就是在老胡架构中用于描述筛选条件的一个特殊类,目的是用来减少函数调用(如findXXXXList())中的参数个数的!

 1 namespace CAMCOCO.Model.Core.Filter
 2 {
 3     using CAMCOCO.Common.CommonTypeDefine.CommunicationProtocol;
 4
 5     public abstract class BaseFilter
 6     {
 7         public DataPaging PageInfo { get; set; }
 8         public string[] OrderName { get; set; }
 9         public bool[] IsAsc { get; set; }
10
11         /// <summary>
12         /// 支持IdList模式
13         /// </summary>
14         public string Id { get; set; }
15         public bool DeleteFlag { get; set; }
16         /// <summary>
17         /// 具体时间
18         /// </summary>
19         public string GenerateTime { get; set; }
20         /// <summary>
21         /// 时间段-开始
22         /// </summary>
23         public string GenerateTime_start { get; set; }
24         /// <summary>
25         /// 时间段-结束
26         /// </summary>
27         public string GenerateTime_end { get; set; }
28         public string DeleteTime { get; set; }
29         public string DeleteTime_start { get; set; }
30         public string DeleteTime_end { get; set; }
31
32         public string MutiSearchKeywords { get; set; }
33
34         public BaseFilter()
35         {
36             PageInfo = new DataPaging() { PageIndex = 1, PageSize = 30, TotalCount = 0, PageCount = 0, };
37             OrderName = new string[] { "Id" };
38             IsAsc = new bool[] { false };
39
40             Id = "";
41             DeleteFlag = false;
42             GenerateTime = "";
43             GenerateTime_start = "";
44             GenerateTime_end = "";
45             DeleteTime = "";
46             DeleteTime_start = "";
47             DeleteTime_end = "";
48
49             MutiSearchKeywords = "";
50         }
51     }
52 }

可以看到,在老胡的架构中,凡是有查询数据的时候都可以通过Filter构造一些标准的查询条件,这里包括页面尺寸信息(每页多少条数据、第几页、数据库中一共多少条符合条件的数据、有多少页),删除标记,数据生成时间(范围),数据删除时间(范围),甚至可以进行关键字模糊查询(MutiSearchKeywords)。

每个具体的实体模型自身还具备什么特殊的查询条件?OK,从BaseFilter派生出去,做一个新的EntityFilter就搞定了。

GO ON....待续

时间: 2024-07-31 09:26:21

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

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

之前写的感觉有点乱,把架构的设计图先放上来吧,对照着说. CAMCOCO架构能够支持的模型: 1.B/S程序,比如CRM什么的,和访问普通网站没什么区别,都是从WEB服务器上进行操作: 2.APP的服务器端程序.APP可以是原生的,也可以是HTML5的.APP都通过WEB服务器获取REST数据进行访问,保护SOA的安全性: 3.WINFORM程序的服务器端: 从设计图上可以看出,老胡把客户端(使用场景)分为了三类: 1.不可信远程客户端:意思是可以被任何用户使用的,我们无法确保用户不会通过URL

.net通用框架 (三)--MODEL层(1)

1.新建c#类库 2.安装配置好entity frame5 3.新建的类库项目上右键"添加--新建项",选择AOD.NET实体数据模型 4.设置数据库连接, 5.选择建好的表 6.下图是生成的实体数据模型,数据库如果更改了,可有右键更新模型

Android系统简介(中):系统架构

Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  Kernel.每层提供不同的Service功能以供上层调用. 一:Linux Kernel(Linux 内核): 位于Android系统架构栈的底部,整个Android系统基于该层,最新的Android Kitkat 4.4基于Linux Kernel 3.8构建的.它提供的硬件设备抽象接口,以供其他架构层

用python做自动化测试--对服务器端的自动化测试(1)-系统架构

原来的计划中,关于对服务器端的自动化测试,其实我是打算讲解我们短信网关和彩信网关的自动化测试,在电信行业江河日下的情况下,接触这块协议的人估计会很少,还是讲讲大家接触的到的吧. 其实对我来说,接触的应用层协议太多了,HTTP协议和SMPP,Diameter,CMPP, Radius协议没有太大区别,只是每种协议的head, body, 消息流程不一样而已. 整个服务器端的自动化测试主要包括2个部分,模拟器部分(simulator)和控制台(controller),如下图系统架构.其实模拟器部分(

系统架构师秘籍(三)架构视角和关注点

上次的博文中,我们介绍了一下软件架构的基本概念,接下来我们介绍一下如何来架构一个软件系统. 当我们开始进行系统架构设计的时候,通常会考虑以下几点: 所设计的软件体系结构的主要功能要素是什么. 如何将这些要素与其他系统关联. 哪些信息需要存储.管理和展示. 要实现这些功能要素需要什么硬件和软件. 所设计的软件体系结构提供什么样的特性和能力. 开发.测试.支持.培训环境都需要做什么. 考虑上述问题的时候,我们从哪些层面来考虑呢?那就是架构视角和关注点两个层面. 架构视角 架构视角是从一个或多个角度对

三种Dataase Mapping的系统架构

ORM - O/R M - Object/Relational Mapping: A technique/idea used to map objects and thier individual relations to an relational database(mysql, postgresql, mssql, oracle, db2, pretty much any major db today) DAO - Data Access Object: An object used as

vb.net版机房收费系统——教你七层架构(三)—外观模式

上次我们看到了D层是怎样运作的,现在,我简单演示一下我的外观和B层是如何和U层和D层打交道的. 首先我跟大家说的是我的外观是按照界面功能划分的,粒度有点小,大家在做的时候,记得外观有几个就行了,但是不能没有,U层不能直接调用B层,这样就会增加U层和B层的耦合: '************************** '文 件 名:UserInfo_BLL '命名空间:BLL '内 容: '功 能: '文件关系: '作 者:邱慕夏 '小 组:邱慕夏 '生成日期:2014-06-07 17:36:4

rabbitmq系统学习(三)集群架构

RabbitMQ集群架构模式 主备模式 实现RabbitMQ的高可用集群,一般在并发和数据量不高的情况下,这种模型非常的好用且简单.主备模式也称为Warren模式 HaProxy配置 listen rabbitmq_cluster bind 0.0.0.0:5672 # 配置TCP模式 mode tcp #简单的轮询 balance roundrobin #主节点 server bhz76 192.168.11.76:5672 check inter 5000 rise 2 fall 3 ser

SpringCloud(三)常用系统架构技术讲解

author:QYX  以前我们使用过单体架构,把多个系统放到一个容器中集体调用,这种模式开发简单,适合小型应用但不利于扩展且代码耦合,后来我们引入和垂直应用架构,系统间相互独立,通过前端统一调用,虽然解决了高并发的问题,也可以针对水平扩展,但也存在着系统间相互独立,且重复开发的缺点,现在我们就来认识最常用的架构模式:分布式架构和微服务架构. 分布式架构 SOA(面向服务的架构) SOA全称为Service-Oriented Architecture,即面向服务的架构,它可以根据需求通过网络对松