您的位置:首页 > 编程语言 > ASP

Spring.NET企业架构实践之 Nhibernate + WCF + ASP.NET MVC + NVelocity 对PetShop4.0重构(二)——领域模型

2011-01-10 13:44 771 查看
什么是领域模型?领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

  当我们不再对一个新系统进行数据库提炼时,取而代之的时面向对象的模型提炼。我们必须大刀阔斧地对业务领域进行细分,将一个复杂的业务领域划分为多个小的子领域,同时还必须分清重点和次要部分,抓住核心领域概念,实现重点突破。

  著名建模专家Eric Evans提出了Domain Driven Design(领域驱动设)。最初层次只分为三层:表现层、业务层和持久层,DDD其实告诉我们如何让实现业务层。

  领域模型种类

  传统模型分为两种:实体(Entity)和值对象(Value Object),服务(Service)成为第三种模型元素。

  领域驱动设计有两种常用的模式:贫血模式和充血模式。

  贫血模式:只有状态,没有行为。


OrderInfo.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="PetShopOrder.Domain" namespace="PetShopOrder.Domain">
<class name="PetShopOrder.Domain.OrderInfo, PetShopOrder.Domain" table="Orders" lazy="true" >
<id name="OrderId" column="OrderId" type="Int32" >
<generator class="native" />
</id>
<property name="Date" type="DateTime">
<column name="OrderDate" not-null="true"></column>
</property>
<property name="UserId" type="String">
<column name="UserId" length="20" not-null="true"></column>
</property>
<property name="AuthorizationNumber" type="Int32">
<column name="AuthorizationNumber" not-null="false"></column>
</property>
<property name="OrderTotal" type="Decimal">
<column name="TotalPrice" precision="10" scale="2" not-null="true"></column>
</property>
<bag name="LineItems" inverse="true" lazy="true" generic="true" cascade="all" table="LineItem">
<key column="OrderID"/>
<one-to-many class="PetShopOrder.Domain.LineItemInfo, PetShopOrder.Domain" />
</bag>
</class>
</hibernate-mapping>

在持久层中每个实体模型都对应了数据库中的一个表,每个属性都对应了表中的一个字段,每个实体对象对应了表中的一条记录。

在服务层中,需要得到的模型对象往往和持久层的实体模型不一致,如某个类中有属性:数量,单价和金额,但是数据库中只有数量和单价。这时候需要建立一种模型——业务模型。然而Linq和匿名类的出现缓解了这一点。在门面层调用服务层返回DTO对象的过程中,通过Linq查询实体模型来方式返回DTO。这样业务模型就能够被省略(后面的文章会谈到这一点)。

  最后在设计领域模型中我们需要分清“主次”。当设计进销存系统,业务类数据就数主要的,如采购,销售,库存信息。基础资料数据就是次要的,如供应商和客户信息。当设计客户关系管理系统时,客户资料数据则是主要的,围绕的客户产生的活动,社交等数据则是辅助数据。这就产生一个规律:主要数据的变化频率比较高,辅助数据变化频率比较低。在PetShop4.0中,主要数据当然是订单。这样我们就需要想方设法去优化系统,以便于更好的处理订单数据。

  出处/article/4818697.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐