日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

什么是ActiveRecord

 燮羽 2011-04-22
我在 前一篇文章中提到ActiveRecord, 有人在回復中問什么是ActiveRecord. 說實話,從去年開始用SubSonic, 我就一直有點困惑, 什么是ActiveRecord, 什么不是ActiveRecord, 以及應該怎么樣使用它才對. 把我的一些想法寫下來, 希望能和大家交流. 歡迎拍磚.
ActiveRecord
是什么:
1. 每一個數(shù)據(jù)庫表對應創(chuàng)建一個類.類的每一個對象實例對應于數(shù)據(jù)庫中表的一行記錄; 通常表的每個字段在類中都有相應的Field;
2. ActiveRecord同時負責把自己持久化. 在ActiveRecord中封裝了對數(shù)據(jù)庫的訪問, 即CRUD; 
3. ActiveRecord是一種領域模型(Domain Model), 封裝了部分業(yè)務邏輯;

ActiveRecord不是什么:
1. Row Data Gateway
Row Data Gateway模式中每個對象也封裝了數(shù)據(jù)庫記錄的狀態(tài)和持久化到數(shù)據(jù)庫的訪問方法; 這兩個有時候很難區(qū)分. 細微的區(qū)別在于Row Data Gateway不封裝任何業(yè)務邏輯;

2. TableGateway
TableGateway是一種數(shù)據(jù)訪問模式, 對每個表有一個類, 類的方法封裝了對單個表的數(shù)據(jù)操作, 如CRUD; 方法的接受表字段的值作為參數(shù);
比如說對表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的區(qū)別在于ActiveRecord的對象中保持了記錄的值, 是有狀態(tài)的, 而TableGateway是沒有狀態(tài)的, 只是一系列數(shù)據(jù)庫訪問方法的集合;

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

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

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

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

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

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

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

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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多