首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Entity Framework 依賴傳遞:為什麼 UI 層也必須引用 EntityFramework.SqlServer.dll?

     編輯:程式設計綜合問答

現象還原

  • Service 層引用 EntityFramework.SqlServer,編譯通過。
  • UI 層僅引用 Service 層,未直接引用 EF.SqlServer。
  • 運行時拋出 FileNotFoundException: Could not load file or assembly 'EntityFramework.SqlServer'。

根本原因:元數據與類型身份

.NET 編譯器在編譯 UI 層時,需要完整了解 Service 層公共 API 中涉及的所有類型,包括:

  • 方法參數/返回值類型(如 DbContext、DbSet<T>、SqlProviderServices)。
  • 基類/接口繼承鏈(Service 繼承的 DbContext 來自 EF 核心程序集)。
  • 屬性/註解類型(如 [DbConfigurationType])。

若 UI 層不引用 EntityFramework.SqlServer.dll,編譯器無法解析這些類型的完整元數據(PublicKeyToken、版本、泛型實例化),導致運行時 CLR 找不到程序集。

對比:為什麼「只引用接口」有時可行?

場景UI 是否需引用實現程序集原因
Service 返回 POCO/DTO(純數據類) 否 類型定義在共享程序集,無第三方依賴
Service 返回 DbContext/Entity(EF 類型) 是 類型來自 EF 程序集,元數據必須可見
Service 使用 反射/動態類型 否 編譯期不解析具體類型,運行時自行加載

最佳實踐:分層架構中的依賴管理

  1. 領域模型獨立程序集:POCO 實體類放在 Domain.dll,無 EF 依賴,UI、Service 共同引用。
  2. Repository 接口定義在 Domain:IUserRepository 返回 User (POCO)。
  3. EF 實現放在 Infrastructure:EfUserRepository : IUserRepository 內部用 DbContext,引用 EntityFramework.SqlServer。
  4. UI 僅引用 Domain + Service 接口,完全隔離 EF 實現細節。
// 目錄結構
MyApp.Domain          // 純 C# 類,零第三方依賴
MyApp.Services        // 引用 Domain,定義接口
MyApp.Infrastructure  // 引用 Domain, EF, SqlServer,實現接口
MyApp.Web/UI          // 引用 Domain, Services,零 EF 依賴

補充:.NET Core / EF Core 時代的變化

  • EF Core 設計為輕量、可擴展,Provider (SqlServer, PostgreSQL) 作為獨立 NuGet 包。
  • 同樣原理:若 Service 返回 DbContext 或實體類帶有 EF Core 註解,UI 仍需引用 Provider 包。
  • 推薦 Repository + DTO 模式徹底切斷 UI 對 EF 的編譯時依賴。

總結

「UI 層未用到 EF 方法」是表象,本質是 Service 公共 API 洩露了 EF 類型。通過領域模型隔離、接口導向編程、依賴倒置,可實現 UI 與 ORM 框架完全解耦,同時解決「運行時找不到程序集」問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved