簡體   English   中英

適當的對象設計抽象層?

[英]Appropriate layers of design abstraction for objects?

我最近又回到了ASP MVC開發中,在使用EF 6時,我對設計邏輯有一些疑問。

我正在使用以下模式:控制器->服務->存儲庫-> DbContext->數據庫

我讀了一些有關UnitOfWork模式的內容,但是我總是做類似的事情:

public abstract class BaseRepository : IDisposable
{
    SiteContext Context;
    public BaseRepository(SiteContext context) { 
        Context = context; 
        IsContextDisposable = false; 
    }

    public BaseRepository() { 
        Context = new SiteContext(); 
        IsContextDisposable = true; 
    }
}

public class ForumRepository : BaseRepository
{
}

因此,如果某些方法需要多個存儲庫,則只需將其傳遞給單個DbContext,然后再進行處理即可。

問題

  1. 我的存儲庫是否應使用實體框架模型(用於構建我的代碼優先數據庫)? 還是倉庫應該獲取它們並立即使用Automapper或類似方法將EF模型轉換為域對象?

  2. 服務的重點是什么? 為什么不能直接從控制器實例化存儲庫? 服務的責任是什么?

  3. 將實體模型轉換為域對象然后轉換為ViewModel是正常的流程嗎?

問題2的答案是松散耦合。 如果您直接在控制器中使用存儲庫,這會產生緊密的耦合,並且如果您想更改數據訪問權限,則必須更改控制器。 如果您具有服務層,則無需更改控制器。 現在,如果您的存儲庫基於定義您可能需要的所有數據訪問方法(例如GetBooksByAuthor等)的接口(我們將其稱為IDAL),則可以取消服務層並將存儲庫直接注入到控制器中。 這樣,如果您想更改數據訪問權限,則可以從IDAL接口派生並將此新的具體數據訪問層注入到控制器中。

1和3的答案取決於應用程序的復雜性。 如果您的數據庫表與您的域對象緊密匹配,則存儲庫可以直接使用實體模型。 如果不是,那么最好將它們轉換為域對象,並將其傳遞給服務或控制器以獲取進一步的業務邏輯。 在將域模型發送到視圖之前,通常會在控制器中將其轉換為ViewModel。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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