應用程式框架實戰二十 對映層超型別

2022-01-31 01:22:45 字數 2638 閱讀 3300

使用entity framework一般需要對映三種型別的物件,即實體、聚合、值物件。

聚合與實體對映的主要區別是:聚合對映單屬性標識id,並需要對映樂觀離線鎖version,而實體的標識往往需要對映成復合屬性,這樣方便物理刪除聚合中的實體。entity framework通過entitytypeconfiguration進行實體對映。

值物件以嵌入值模式對映,這需要使用complextypeconfiguration。

封裝對映配置並不是必須的,但封裝以後可以獲得如下好處。

1. 輔助記憶

如果你跟我一樣記憶力很差,記不住上面兩個類名,那麼通過封裝乙個自定義的型別可以幫助你進行記憶。一旦封裝完成,你就可以把系統或第三方的api扔到一邊。

2. 劃分邏輯結構

把所有對映**放到乙個方法,不方便閱讀,我把它們劃分成不同的方法,可以獲得更清晰的結構。

3. 減少**冗餘

對於聚合而言,可以把id標識和version樂觀離線鎖封裝到層超型別,從而減少**冗餘。  

entitymapbase從entitytypeconfiguration繼承,泛型引數tentity使用ientity介面約束,構造方法將對映配置從邏輯上分離到4個方法中,即對映表、對映標識、對映屬性、對映導航屬性。

在構造方法中呼叫虛方法有時候可能導致意想不到的錯誤,這種情況發生在子類構造方法的**依賴某些虛方法,由於呼叫順序混亂可能導致失敗,不過這種情況還是比較少見,如果你碰到上述問題,請果斷扔掉該對映基類,直接從entitytypeconfiguration派生。

entitymapbase用於對映實體,**如下。

using

system.data.entity.modelconfiguration;

using

util.domains;

namespace

util.datas.ef

//////

對映表

/// protected

abstract

void

maptable();

//////

對映標識

/// protected

abstract

void

mapid();

//////

對映屬性

/// protected

virtual

void

}//////

對映導航屬性

/// protected

virtual

void

mapassociations()

}}

另外,提供了兩個泛型版本的aggregatemapbase, 提供aggregatemapbase的目的是使聚合對映更易用,因為我的大多數聚合都使用guid型別,這樣可以省乙個引數。

aggregatemapbase用於對映聚合,**如下。

using

system;

using

system.componentmodel.dataannotations.schema;

using

util.domains;

namespace

util.datas.ef

//////

對映屬性

/// protected

override

void

property( t => t.version ).hascolumnname( "

version

").isrowversion().hasdatabasegeneratedoption( databasegeneratedoption.computed ).isoptional();}}

//////

聚合根對映

/// ///

聚合根型別

public

abstract

class aggregatemapbase: aggregatemapbasewhere tentity : aggregateroot

}

valueobjectmapbase從complextypeconfiguration繼承,它唯一需要的就是對映屬性,建立這個類只有乙個原因——幫助你記憶。

valueobjectmapbase用於對映值物件,**如下。 

using

system.data.entity.modelconfiguration;

namespace

util.datas.ef

//////

對映屬性

/// protected

abstract

void

}}

之所以說對映基類不是必須的,是因為對映配置一般由**生成器建立,所以能夠從基類獲得的好處不是非常明顯。另外,很多人會覺得這導致過度封裝。建立這幾個類在很大程度上屬於我個人習慣問題,介紹它們的目的是想告訴你,如果不想動腦筋記憶,就自己封裝一層。

.net應用程式框架交流qq群: 386092459,歡迎有興趣的朋友加入討論。

應用程式框架實戰三 什麼是應用程式框架

什麼是應用程式框架?正如框架是架構的具體實現一樣,應用程式框架是應用程式架構的具體實現。不過這樣說了等於沒說,因為框架和架構都是如此抽象。為了獲得直觀的感受,下面先看看更具體的.net framework和第三方框架。net framework為.net程式設計師提供了乙個龐大的類庫,幾乎任何開發任...

應用程式框架實戰六 應用程式框架的特點

之前說過,net framework為所有.net程式設計師提供底層支援,第三方開源框架建立在.net framework的基礎上,專門解決某些特定問題,而應用程式框架則建立在.net framework和第三方框架的基礎上,為專案開發的方方面面保駕護航。它們的作用雖然都是幫助程式設計師更好的建立應...

應用程式框架實戰三 什麼是應用程式框架

什麼是應用程式框架?正如框架是架構的具體實現一樣,應用程式框架是應用程式架構的具體實現。不過這樣說了等於沒說,因為框架和架構都是如此抽象。為了獲得直觀的感受,下面先看看更具體的.net framework和第三方框架。net framework為.net程式設計師提供了乙個龐大的類庫,幾乎任何開發任...