[英]Repository pattern and service layer implementation
我正在為我的mvc4網站使用通用存儲庫和工作單元模式。
現在,我想刪除系統用戶。 在刪除代碼中,我必須刪除其他表中的其他條目(注釋,訪問權限,..)。
最簡單的解決方案是創建一個從GenericRepository<User>
繼承的UserRepository
,並修改delete方法以刪除其他表中的數據。 但這意味着我的UserRepository
將訪問其他表,這些表應該具有自己的存儲庫類,對嗎?
我已經閱讀了有關服務層的信息,該層位於我的業務邏輯和存儲庫之間。
這里的最佳實踐是什么,以及如何實現服務層?
而且,如果我使用服務層,還是需要自定義實現的存儲庫(如UserRepository
,還是只需要通用存儲庫,並且服務類中的邏輯是否對我有要求?
示例代碼:
class UserRepository
{
public void Delete(User entity)
{
var userComments = Context.UserComments.Get(comment => comment.UserId == entity.Id);
foreach (var comment in userComments)
{
Context.UserComments.Remove(comment);
}
//
// same for access rights here
//
Context.Users.Remove(entity);
}
}
存儲庫模式隨着DDD(域驅動設計)運動而流行。 在DDD中,建議您不要為每個表創建一個存儲庫,而不要為每個聚合根創建一個存儲庫。因此,盡管您可能有一個用於用戶,用戶訂單和用戶注釋的表,但您可以確定該用戶是聚合根,然后您將只創建一個用戶存儲庫並在其中添加您的方法。
無論如何,無論您是否關心DDD,我都將邏輯添加到您的用戶存儲庫中,這比任何其他存儲庫都有意義。
您可以創建一個服務層並為此創建一個服務類,但是服務類實際上對此沒有用-在這種情況下您並沒有真正受益。
采用
.WillCascadeOnDelete(true);
在modelBuilder
回答有關服務的問題。 理想情況下,您希望服務對存儲庫已為您檢索的實體/對象執行其他邏輯。 在這種情況下,您實際上並不希望服務刪除行,因為這是存儲庫的責任。
服務很好。 在MVC中,您可以從控制器中調用服務方法。 理想情況下,接口使您可以輕松對其進行測試。
如您所說,服務層可幫助您在業務邏輯和存儲庫之間進行區分。 這里的主要思想是依賴注入
public interface IUserService
{
public void Delete(User entity);
}
//
// This class would be used Linq to Entities
public class LinqUserService : IUserService
{
public void Delete (User entity)
{
}
}
//
// This class would be used Sql command
public class SqlUserService : IUserService
{
public void Delete (User entity)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.