簡體   English   中英

存儲庫模式和服務層實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM