首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Spring.NET 企業架構實踐(二):領域模型與 NHibernate 映射

     編輯:關於.NET

前言

本文探討領域模型設計:貧血 vs 充血模型、實體關聯關係、NHibernate 映射檔案與屬性兩種配置方式。

領域模型類型

貧血模型

僅含屬性(狀態),無行為。業務邏輯集中在 Service 層。


public class OrderInfo
{
    public virtual int OrderId { get; set; }
    public virtual DateTime Date { get; set; }
    public virtual string UserId { get; set; }
    public virtual decimal OrderTotal { get; set; }
    public virtual IList<LineItemInfo> LineItems { get; set; }
    public virtual int? AuthorizationNumber { get; set; }
}

public class OrderManager
{
    public IOrderDao CurrentDao { get; set; }
    public object Save(OrderInfo entity)
    {
        ProcessCreditCard(entity);
        return CurrentDao.Save(entity);
    }
    private void ProcessCreditCard(OrderInfo entity)
    {
        entity.AuthorizationNumber = new Random().Next();
    }
}

優點:層次分明。缺點:Service 易膨脹、難維護。

充血模型

屬性與行為封裝在實體內。


public class OrderInfo
{
    // ... 屬性同前
    public void ProcessCreditCard()
    {
        this.AuthorizationNumber = new Random().Next();
    }
}

優點:內聚性高、重用性好。.NET 專案多採貧血模型。

實體關聯關係

一對多


public class OrderInfo
{
    public virtual IList<LineItemInfo> LineItems { get; set; }
}
public class LineItemInfo
{
    public virtual OrderInfo Order { get; set; }
    // ... 其他屬性
}

NHibernate 雙向外鍵會循環參考,序列化需注意。

NHibernate 映射配置

方式一:.hbm.xml 檔案(推薦)

不需額外組件,脫離 ORM 仍可用。


<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="PetShopOrder.Domain" namespace="PetShopOrder.Domain">
  <class name="OrderInfo" 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" />
    </property>
    <property name="UserId" type="String">
      <column name="UserId" length="20" not-null="true" />
    </property>
    <bag name="LineItems" inverse="true" lazy="true" generic="true" cascade="all" table="LineItem">
      <key column="OrderID" />
      <one-to-many class="LineItemInfo" />
    </bag>
  </class>
</hibernate-mapping>

方式二:NHibernate.Mapping.Attributes

屬性標註,省配置檔但需引用組件。

持久層與服務層模型分離

服務層回傳 DTO,可透過 Linq 查詢實體投影為匿名型別/DTO,省略業務模型層。

設計重點:主次資料區分

  • 主要資料:變動頻率高(如訂單),需優化處理
  • 輔助資料:變動頻率低(如供應商、客戶)

原始出處

Spring.NET 企業架構實踐(二)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved