什麼是ActiveRecord

我在 前一篇文章中提 到ActiveRecord, 有人在回覆中問什麼是ActiveRecord. 說實話,從去年開始用SubSonic, 我就一直有點困惑, 什麼是ActiveRecord, 什麼不是ActiveRecord, 以及應該怎麼樣使用它纔對. 把我的一些想法寫下來, 希望能和大家交流. 歡迎拍磚.
ActiveRecord是什麼:

1. 每一個數據庫表對應創建一個類.類的每一個對象實例對應於數據庫中表的一行記錄; 通常表的每個字段在類中都有相應的Field;
2. ActiveRecord同時負責把自己持久化. 在ActiveRecord中封裝了對數據庫的訪問, 即CRUD; 
3. ActiveRecord是一種領域模型(Domain Model), 封裝了部分業務邏輯;

ActiveRecord不是什麼:
1. Row Data Gateway
Row Data Gateway模式中每個對象也封裝了數據庫記錄的狀態和持久化到數據庫的訪問方法; 這兩個有時候很難區分. 細微的區別在於Row Data Gateway不封裝任何業務邏輯;

2. TableGateway
TableGateway是一種數據訪問模式, 對每個表有一個類, 類的方法封裝了對單個表的數據操作, 如CRUD; 方法的接受表字段的值作爲參數;
比如說對錶Person有DAOPerson, 有以下方法:
int Create(string name, bool isMale)
DataSet Find(int personId)
void Delete(int personId)
void Update(int personId, string name, bool isMale)
微軟的很多代碼示例中使用了此模式;

ActiveRecord的區別在於ActiveRecord的對象中保持了記錄的值, 是有狀態的, 而TableGateway是沒有狀態的, 只是一系列數據庫訪問方法的集合;

3. Table Module
Table Module是一種領域邏輯模式, 一個類對應於數據庫中的一個表; Table Module通常和Table Gateway合作, 前者負責基本的業務邏輯, 後者負責數據庫訪問, 以達到邏輯層和持久化層的隔離; 微軟的實例代碼經常使用這兩者, 如對錶Person, 通常會定義兩個類, PersonBL和PersonDB, 在PersonBL中處理驗證等邏輯, 並調用PersonDB訪問數據庫, 層間調用使用DataSet或自定義數據傳輸對象傳輸數據

在業務邏輯比較簡單並且有和表的一一對應時, ActiveRecord相對來說更簡單, 因爲它在一個類中包括了業務邏輯對象和數據訪問, 而且不需要數據傳輸對象, 減少了維護的工作量;
和Table Module比較起來, ActiveRecord與數據庫耦合更緊;

ActiveRecord適用於:
1. 業務邏輯比較簡單;當你的類基本上和數據庫中的表一一對應時, ActiveRecord是非常方便的, 即你的業務邏輯大多數是對單表操作;

2. 當發生跨表的操作時, 往往會配合使用事務腳本(Transaction Script), 把跨表事務提升到事務腳本中;

3. ActiveRecord最大優點是簡單, 直觀; 一個類就包括了數據訪問和業務邏輯. 如果配合代碼生成器使用就更方便了; 

4. 這些優點使ActiveRecord特別適合web快速開發, 而正是快速開發框架ROR採用了ActiveRecord, 並且很多類ROR框架如Castle的紛紛效仿才使ActiveRecord重新進入大家視線; 
我想這也是爲什麼Martin Fowler在PoEAA中早就提出了這個模式, 但是直到最近兩三年ActiveRecord才熱起來可能就是這個原因;

ActiveRecord不適合於
1. ActiveRecord雖然有業務邏輯, 但基本上都是基於單表的. 跨表邏輯一般會放到當發生跨表的操作時, 往往會配合使用事務腳本(Transaction Script)中. 如果對象間的關聯越來越多, 你的事務腳本越來越龐大, 重複的代碼越來越多, 你就要考慮Domain Model + O/R Mapper了;

2. ActiveRecord保存了數據, 使它有時候看上去像數據傳輸對象(DTO). 但是ActiveRecord有數據庫訪問能力, 不要把它當DTO用. 尤其在跨越進程邊界調用的時候, 不能傳遞ActiveRecord對象; 


轉自:http://blog.csdn.net/80x88/article/details/2762072

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章