2010-05-11 62 views
6

只需要澄清這一個,如果我有以下接口Repository模式:添加項目

public interface IRepository<T> 
{ 
    T Add(T entity); 
} 

實現它的時候,不檢查複製如果實體已經存在之前堅持它仍然是在一個工作存儲庫,或者它應該處理一些地方?

+1

@Alastair Pitts,這是否意味着檢查唯一字段也是存儲庫工作的一部分? – 2010-05-12 04:58:23

回答

0

是的 - 我建議在存儲庫中進行這些檢查。

長答案:「知識庫」這個術語有點含糊,但它越來越多地用作持久化抽象層的名稱。這個名字很好,但沒有太多說明:如果你以Asp.Net MVC爲例,示例應用程序(如Neirds dinner)等,或者codeplex項目封裝了存儲庫類的數據訪問。如果這樣的圖層是通過關係數據庫實現的,那麼表的主鍵將不允許重複的條目,這意味着在這種情況下,如果插入具有相同關鍵字的2個條目,則存儲庫實現將拋出異常。換句話說,一個RDBMS實現一個倉庫總是會由於這個檢查而無法避免。因此,爲了使世界各地的轉售站的行爲最相似,並避免出現意外,讓所有人都做這個檢查。

這是第二個問題,您是否應該在業務邏輯中維護您的Add()方法不與已存在的條目保持一致。有時候,僅在一個點上解決這個問題很有意義,例如數據庫,由於併發問題或往返節省。另一方面,例如很高興地告訴用戶儘快已經有用戶名了。所以這取決於。

有一個愉快的一天

0

如果實體已存在,則可以拋出異常或更新現有實體的字段。

如果你選擇後者,該方法或許應該被稱爲像AddOrUpdate()

LINQ到SQL實例

如果我檢索一個記錄,我會用

public Entity GetEntity(int entityID) 
{ 
    return dataContext.Entities.SingleOrDefault(e => e.EntityID = entityID); 
} 

...而在調用方法中,我將在嘗試使用返回的實體之前檢查返回的內容是否爲null。

如果我正在更新記錄,我將按照所示檢索實體,編輯實體,然後調用UpdateEntity(entityID)存儲庫方法更新數據庫中的字段。

如果我正在添加一條記錄,那就更容易了。由於這是一個數據庫,並且我的表總是包含一個int類型的Identity字段(本質上是一個可自動分配的數字),因此添加記錄是所有操作的最簡單操作(它總是一個新記錄):

Public void InsertEntity(Entity entity) 
{ 
    dataContext.Entities.InsertOnSubmit(entity); 
    dataContext.SubmitChanges(); 
} 

業務規則(例如電子郵件地址是唯一的)可以在存儲庫中或在單獨的業務層中進行處理。如果您正在尋找最「正確」的方式,我認爲大多數人會同意業務規則屬於他們自己的業務邏輯層。

+0

這正是我的問題。正在檢查實體是否存在(如果存在,拋出異常,否則AddOrUpdate)是存儲庫的作業? – 2010-05-12 00:24:25

+0

看我的編輯.... – 2010-05-12 02:18:13

+0

是的,但。 「添加記錄是所有的最簡單操作(它總是一個新記錄)」如果規則聲明您只能輸入/推送唯一字段,如(用戶名和電子郵件),則不是這樣。因此您只能插入一次「[email protected]」的電子郵件。 – 2010-05-12 03:18:41

0

本質在哪裏處理這種情況取決於您的具體要求的決定。

如果您有業務規則定義清除剪切操作,例如,如果存在重複項,則應重新命名新項,然後將其構建到存儲庫類中。另一方面,如果存在更復雜的規則,例如在添加之前需要更多信息來更改該項目,則應該在食物鏈上進一步處理它。

存儲庫的概念表明它存在執行持久活動。 所以,如果你可以在存儲庫中完成這一切,那很好。如果您發現您開始在存儲庫外引用,或者您的存儲庫具有依賴關係,例如調用另一個存儲庫,服務或管理器(或您喜歡的任何處理器術語),那麼這是一個很好的跡象,可以讓它回退一步。