基于NBear的Domain层设计

NBear是Teddy开发的快速开发框架,在之前的5个示例中,主要演示了主要的框架功能和业务领域模型不太复杂情形下忽略领域层的应用范例。但是,当业务模型相对复杂,单纯基于简单实体的强类型数据访问接口,可能就会使得太多的业务逻辑被分散到service或facade层,此时,我们就最好加一层独立的业务领域模型层来封装实体和强类型接口的使用。本文为您演示基于NBear v1.6.0中新增的NBear.Domain的领域模型设计示例。

NBear.Domain

NBear.Domain主要为您提供了基类DomainModel和GuidKeyDomainModel,前者用于采用自增长ID主键的实体,后者用于采用Guid主键的实体。只需将他们作为你的领域类的基类,它就能提供最基本的领域类需要的CRUD等功能(包括Save, Delete, Find, FindAll等),您可以方便的以此为基础进行扩展。

DomainModel.cs

 1using System;
 2using System.Data;
 3using System.Data.Common;
 4using System.Collections.Generic;
 5using System.Text;
 6using NBear.Common;
 7using NBear.Data;
 8
 9namespace NBear.Domain
10{
11  public interface IDomainModel<IEntityType, IEntityViewType>
12    where IEntityType : IEntity
13    where IEntityViewType : IEntity
14  {
15    void Save();
16    void Save(DbTransaction tran);
17    void LoadFromEntity(IEntityViewType entity);
18    object ID { get; }
19  }
20
21  public abstract class DomainModel<IEntityType, IEntityViewType, DomainType> : IDomainModel<IEntityType, IEntityViewType>
22    where IEntityType : IEntity
23    where IEntityViewType : IEntity
24    where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()
25  {
26    Protected Members#region Protected Members
27
28    protected IEntityType entityValue;
29    protected IEntityType entityValue2;
30    protected IEntityViewType entityViewValue;
31
32    protected DomainModel()
33    {
34      entityValue = Gateway.Create<IEntityType>();
35      entityValue2 = Gateway.Create<IEntityType>();
36    }
37
38    /**//// <summary>
39    /// override this method in sub class to customly load auto-created key column id if neccessary
40    /// by default, when saving a new domain model, the latest auto created ID will be loaded.
41    /// </summary>
42    protected virtual void LoadCreatedID(DbTransaction tran)
43    {
44      KeyValueCollection keyValues = entityValue.GetKeyValues();
45
46      keyValues[0] = Gateway.Db.ExecuteScalar(tran, CommandType.Text, string.Format("select max([{0}]) from [{1}]", keyValues.GetKeys()[0], typeof(IEntityType).Name));
47    }
48
49    protected virtual void DoUpdate(DbTransaction tran)
50    {
51      string[] exceptColumns = Gateway.CompareEntities<IEntityType>(entityValue, entityValue2);
52      if (exceptColumns.Length == NBear.Common.Entity<IEntityType>.GetKeys().Length)
53      {
54        //no columns are modified, so no need to update
55        return;
56      }
57      KeyValueCollection keyValues = entityValue.GetKeyValues();
58      if (tran == null)
59      {
60        Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID);
61      }
62      else
63      {
64        Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID, tran);
65      }
66    }
67
68    protected virtual void DoCreate(DbTransaction tran)
69    {
70      string exceptKeyColumn = Entity<IEntityType>.GetKeys()[0];
71      if (tran == null)
72      {
73        DbTransaction t = Gateway.BeginTransaction();
74
75        try
76        {
77          Gateway.Insert<IEntityType>(entityValue, t, exceptKeyColumn);
78
79          LoadCreatedID(t);
80
81          t.Commit();
82        }
83        catch
84        {
85          t.Rollback();
86        }
87        finally
88        {
89          Gateway.CloseTransaction(t);
90        }
91      }
92      else
93      {
94        Gateway.Insert<IEntityType>(entityValue, tran, exceptKeyColumn);
95        LoadCreatedID(tran);
96      }
97    }
98
99    #endregion
100
101    Properties#region Properties
102
103    public IEntityType EntityValue
104    {
105      get
106      {
107        return entityValue;
108      }
109    }
110
111    public IEntityViewType EntityViewValue
112    {
113      get
114      {
115        return entityViewValue;
116      }
117    }
118
119    public virtual object ID
120    {
121      get
122      {
123        return entityValue.GetKeyValues()[0];
124      }
125    }
126
127    #endregion
128
129    Basic CRUD#region Basic CRUD
130
131    public virtual void LoadFromEntity(IEntityViewType entityView)
132    {
133      if (entityView == null)
134      {
135        return;
136      }
137      entityValue = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);
138      entityValue2 = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);
139    }
140
141    public void Save()
142    {
143      Save(null);
144    }
145
146    public virtual void Save(DbTransaction tran)
147    {
148      if (ID == null || Convert.ToInt32(ID) == 0)
149      {
150        DoCreate(tran);
151      }
152      else
153      {
154        DoUpdate(tran);
155      }
156
157      LoadFromEntity(Gateway.Get<IEntityViewType>(ID));
158    }
159
160    public static DomainType Find(object id)
161    {
162      DomainType obj = new DomainType();
163      obj.LoadFromEntity(Gateway.Get<IEntityViewType>(id));
164      return obj;
165    }
166
167    public static DomainType[] FindAll(string orderBy)
168    {
169      return EntityViewArrayToDomainArray(Gateway.SelectAll<IEntityViewType>(orderBy));
170    }
171
172    public static DomainType[] EntityViewArrayToDomainArray(IEntityViewType[] entityViews)
173    {
174      DomainType[] objs = new DomainType[entityViews.Length];
175      for (int i = 0; i < objs.Length; i++)
176      {
177        DomainType obj = new DomainType();
178        obj.LoadFromEntity(entityViews[i]);
179        objs[i] = obj;
180      }
181      return objs;
182    }
183
184    public static void Delete(object id)
185    {
186      Gateway.Delete<IEntityType>(id);
187    }
188
189    #endregion
190
191    Gateway#region Gateway
192
193    private static NBear.Data.Facade.Gateway _Gateway = null;
194
195    public static NBear.Data.Facade.Gateway Gateway
196    {
197      get
198      {
199        return (_Gateway == null ? GatewayManager.DefaultGateway : _Gateway);
200      }
201      set
202      {
203        _Gateway = value;
204      }
205    }
206
207    #endregion
208  }
209
210  public abstract class DomainModel<IEntityType, DomainType> : DomainModel<IEntityType, IEntityType, DomainType>
211    where IEntityType : IEntity
212    where DomainType : IDomainModel<IEntityType, IEntityType>, new()
213  {
214  }
215
216  public abstract class GuidKeyDomainModel<IEntityType, IEntityViewType, DomainType> : DomainModel<IEntityType, IEntityViewType, DomainType>
217    where IEntityType : IEntity
218    where IEntityViewType : IEntity
219    where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()
220  {
221    protected override void DoCreate(DbTransaction tran)
222    {
223      //create guid
224      entityValue.GetKeyValues()[0] = Guid.NewGuid().ToString();
225
226      if (tran == null)
227      {
228        Gateway.Insert<IEntityType>(entityValue);
229      }
230      else
231      {
232        Gateway.Insert<IEntityType>(entityValue, tran);
233      }
234    }
235  }
236
237  public abstract class GuidKeyDomainModel<IEntityType, DomainType> : GuidKeyDomainModel<IEntityType, IEntityType, DomainType>
238    where IEntityType : IEntity
239    where DomainType : IDomainModel<IEntityType, IEntityType>, new()
240  {
241  }
242}

时间: 2024-09-22 15:14:48

基于NBear的Domain层设计的相关文章

基于.NET平台的分层架构实战(九)—数据访问层的第三种实现:基于NBear框架

基于.NET平台的分层架构实战(九)-数据访问层的第三种实现:基于NBear框架的ORM实现 前面的文章讨论了使用SQL语句和存储过程两种数据访问层的实现方式,这一篇里,将讨论使用ORM方式实现数据访问层的方法. 对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统.对象和关系数据是业务实体的两种表现形式,业务实

《解剖PetShop》之五:PetShop之业务逻辑层设计_自学过程

五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,我们也将业务逻辑层称为领域层.例如Martin Fowler在<Patterns of Enterprise Application Architecture>一书中,将整个架构分为三个主要的层:表示层.领域层和数据源层.作为领

宽带固定无线接入网MAC层设计

一.引言 宽带接入网被认为是信息高速公路的最后一公里,必将成为未来国家信息基础设施发展的重点.目前有几种宽带接入方式,如光纤接入.xDSL.宽带固定无线接入网等.与其它宽带接入方式相比,宽带固定无线接入网有许多优点,如建网快.低成本.易维修和可克服某些地理环境的限制等,已成为一种非常有前途的接入方式. 宽带固定无线接入网是指节点固定的无线通信系统,主要用来在用户终端和核心网之间传送数据[1].宽带固定无线接入网的拓扑结构如图1所示.宽带固定无线接入网是一种点到多点的结构,主要包括基站(BS).用

基于Kubernetes的PaaS平台设计和思考

本文讲的是基于Kubernetes的PaaS平台设计和思考[编者的话]文章介绍了PaaS平台的意义,为什么选择Kubernetes,PaaS平台上的微服务架构应用,如何设计和快速构建PaaS平台,PaaS平台的功能组件这几个内容. [烧脑式Kubernetes实战训练营]本次培训理论结合实践,主要包括:Kubernetes架构和资源调度原理.Kubernetes DNS与服务发现.基于Kubernetes和Jenkins的持续部署方案 .Kubernetes网络部署实践.监控.日志.Kubern

基于Web的PDM协同设计的设计与研究

PDM(Product Data Management即产品数据管理)是在上个世纪80年代,为了方便制造企业大量的工程图纸和技术文档的管理而逐渐产生和发展起来的.传统的PDM以管理产品数据为核心,其主要功能是实现企业数据资料的管理.但是随着计算机技术的发展及其在制造企业应用领域的扩大,尤其是近几年来个性化.多元化的消费需求使得市场快速多变,企业之间的竞争更加激烈,这就要求在产品设计的过程中要同时从专业的角度和用户的角度来考虑产品的质量.功能.装配.设计.工艺参数.使用性能和寿命.而产品设计的开发

基于云计算的园区网群设计

基于云计算的园区网群设计 杨柳青 建造校园网群的目的是:提供单一.通用和公共的网络构架,以高速有效地传输数据.声音.图像和视频等信息,满足师生的需求.本文介绍了校园网群建设的几种关键技术(包括IP over SDH.IP over WDM和千兆以太网技术)及校园网群信息中心的云计算解决方案,并对它们进行了比较分析,在此基础上,提出了建设校园网群网络系统的核心层.汇聚层.接入层三层结构的层次化设计,以及数据中心分层设计.虚拟桌面方案,并实施于实际的系统中. 基于云计算的园区网群设计

使用ExtJs开发MIS系统(1):基于ExtJs的MIS构架设计

本系列主要包括以下内容: 基于ExtJs的MIS构架设计. Js的动态加载. 使用数据库保存客户端状态. 轮询和无状态设计. 使用Action抽象客户端操作. 客户端MVC. 最后,如果还有精力的话,再写一些ExtJs性能方面的心得. 本文中的例子.代码等来源于真实的的项目,所以恕不能提供完整的代码下载,但会尽量详细的阐述设计思路,并给出关键的代码片段. 欢迎大家交流和指教. 2,客户端的"致富"之路 在SilverLight.Flex等富客户端框架出现以前,系统中通常由服务器负责Ht

c语言-(基于液晶显示的频率计的设计)的程序与仿真图是怎样的?

问题描述 (基于液晶显示的频率计的设计)的程序与仿真图是怎样的? 要求是:以单片机(AT89C51)为核心,对外部信号源的输入频率进行测量.并将该信号频率在液晶上进行显示.当切换开关连接至不同频率的信号源时,液晶上显示的频率应相应发生改变.程序与仿真图最好不同于网上能找到的. 解决方案 虽然没做过,但是觉得你可以根据实际频率计对比,把每一步完善就能做好. 解决方案二: 把整个程序分成两个小模块,即液晶显示模块,频率计算模块.可以编写两个子函数来实现,这样思路清晰.程序大致流程为 void mai

floodlight下应用开发-基于SDN的虚拟路由设计与实现

问题描述 基于SDN的虚拟路由设计与实现 请问如何在Mininet+floodlight环境下,用java实现基于迪杰斯特拉算法的包路由功能?