我在 前一篇文章中提到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對象; |
|