只需要澄清這一個,如果我有以下接口Repository模式:添加項目
public interface IRepository<T>
{
T Add(T entity);
}
實現它的時候,不檢查複製如果實體已經存在之前堅持它仍然是在一個工作存儲庫,或者它應該處理一些地方?
只需要澄清這一個,如果我有以下接口Repository模式:添加項目
public interface IRepository<T>
{
T Add(T entity);
}
實現它的時候,不檢查複製如果實體已經存在之前堅持它仍然是在一個工作存儲庫,或者它應該處理一些地方?
是的 - 我建議在存儲庫中進行這些檢查。
長答案:「知識庫」這個術語有點含糊,但它越來越多地用作持久化抽象層的名稱。這個名字很好,但沒有太多說明:如果你以Asp.Net MVC爲例,示例應用程序(如Neirds dinner)等,或者codeplex項目封裝了存儲庫類的數據訪問。如果這樣的圖層是通過關係數據庫實現的,那麼表的主鍵將不允許重複的條目,這意味着在這種情況下,如果插入具有相同關鍵字的2個條目,則存儲庫實現將拋出異常。換句話說,一個RDBMS實現一個倉庫總是會由於這個檢查而無法避免。因此,爲了使世界各地的轉售站的行爲最相似,並避免出現意外,讓所有人都做這個檢查。
這是第二個問題,您是否應該在業務邏輯中維護您的Add()方法不與已存在的條目保持一致。有時候,僅在一個點上解決這個問題很有意義,例如數據庫,由於併發問題或往返節省。另一方面,例如很高興地告訴用戶儘快已經有用戶名了。所以這取決於。
有一個愉快的一天
如果實體已存在,則可以拋出異常或更新現有實體的字段。
如果你選擇後者,該方法或許應該被稱爲像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();
}
業務規則(例如電子郵件地址是唯一的)可以在存儲庫中或在單獨的業務層中進行處理。如果您正在尋找最「正確」的方式,我認爲大多數人會同意業務規則屬於他們自己的業務邏輯層。
這正是我的問題。正在檢查實體是否存在(如果存在,拋出異常,否則AddOrUpdate)是存儲庫的作業? – 2010-05-12 00:24:25
看我的編輯.... – 2010-05-12 02:18:13
是的,但。 「添加記錄是所有的最簡單操作(它總是一個新記錄)」如果規則聲明您只能輸入/推送唯一字段,如(用戶名和電子郵件),則不是這樣。因此您只能插入一次「[email protected]」的電子郵件。 – 2010-05-12 03:18:41
本質在哪裏處理這種情況取決於您的具體要求的決定。
如果您有業務規則定義清除剪切操作,例如,如果存在重複項,則應重新命名新項,然後將其構建到存儲庫類中。另一方面,如果存在更復雜的規則,例如在添加之前需要更多信息來更改該項目,則應該在食物鏈上進一步處理它。
存儲庫的概念表明它存在執行持久活動。 所以,如果你可以在存儲庫中完成這一切,那很好。如果您發現您開始在存儲庫外引用,或者您的存儲庫具有依賴關係,例如調用另一個存儲庫,服務或管理器(或您喜歡的任何處理器術語),那麼這是一個很好的跡象,可以讓它回退一步。
@Alastair Pitts,這是否意味着檢查唯一字段也是存儲庫工作的一部分? – 2010-05-12 04:58:23