簡體   English   中英

如何使表示層(ASP.NET MVC)的數據訪問技術(Entity Framework)無知?

[英]How to make the data access technology (Entity Framework) ignorance from the presentation layer (ASP.NET MVC)?

前提:

我正在執行域驅動設計,並將解決方案分為4層:

  • 表示層
    • 用於RESTful API Web服務的ASP.NET Web API 2項目
    • 用於文檔和管理屏幕的ASP.NET Web MVC5項目
  • 應用層
    • 一個類庫項目,負責從表示層獲取命令並使用任何域服務
  • 域層
    • 包含業務模型和邏輯的類庫項目
    • 包含域服務的類庫項目
  • 基礎設施層
    • 一個包含所有具體實現的類庫項目,例如使用Entity Framework進行dataq持久性,使用Log4net進行日志記錄,使用Simple Injector進行IoC等

域層僅具有一組為聚合定義的存儲庫接口,這取決於基礎結構層中隱藏實現細節的實現數據訪問機制。

在本練習中,我決定使用實體框架數據庫優先方法。 當然,基礎結構項目中有一個app.config ,其中包含一個連接字符串。


問題:

好的,我花了大量時間來嘗試分離所有問題並專注於領域模型。 在表示層(即API和MVC項目)中,沒有直接引用基礎結構項目。 並且已經設置了IoC容器,因此所需接口的所有具體實現都將注入到控制器構造函數中。

例如,當我選擇API項目作為開始項目並運行它時,我得到了

An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code.

Additional information: No connection string named 'xxxxxx' could be found in the application config file.


題:

現在,我知道如果將Entity Framework安裝到API項目中,將基礎結構項目的app.config中的連接字符串復制並粘貼到API項目的web.config中,則一切正常。 但這違反了我們分離關注點的初衷,不是嗎? 如果這樣做,那么使用域驅動設計並使表述層的數據訪問技術變得無知的意義何在?

我們之所以沒有直接引用數據訪問技術的直接實現(即,使用dbContextLinq具體實現)的原因是,我們可以輕松地將地下訪問技術轉換為其他東西。

那么什么是正確的方法呢?

我不想在表示層中安裝Entity Framework,也不想在各處復制連接字符串。 我希望所有數據訪問和存儲庫的具體實現都存在於一個庫中。

實體框架配置必須在使用它的項目中。 這並不意味着它將破壞您的分層結構或您的關注點分離。

從您的app.config中刪除所有entityframework元素。 創建您自己的連接字符串元素,並在應用啟動時將其提供給entityframework。

暫無
暫無

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

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