EntityFramework.SqlServer,編譯通過。FileNotFoundException: Could not load file or assembly 'EntityFramework.SqlServer'。.NET 編譯器在編譯 UI 層時,需要完整了解 Service 層公共 API 中涉及的所有類型,包括:
DbContext、DbSet<T>、SqlProviderServices)。DbContext 來自 EF 核心程序集)。[DbConfigurationType])。若 UI 層不引用 EntityFramework.SqlServer.dll,編譯器無法解析這些類型的完整元數據(PublicKeyToken、版本、泛型實例化),導致運行時 CLR 找不到程序集。
| 場景 | UI 是否需引用實現程序集 | 原因 |
|---|---|---|
| Service 返回 POCO/DTO(純數據類) | 否 | 類型定義在共享程序集,無第三方依賴 |
| Service 返回 DbContext/Entity(EF 類型) | 是 | 類型來自 EF 程序集,元數據必須可見 |
| Service 使用 反射/動態類型 | 否 | 編譯期不解析具體類型,運行時自行加載 |
Domain.dll,無 EF 依賴,UI、Service 共同引用。IUserRepository 返回 User (POCO)。EfUserRepository : IUserRepository 內部用 DbContext,引用 EntityFramework.SqlServer。// 目錄結構
MyApp.Domain // 純 C# 類,零第三方依賴
MyApp.Services // 引用 Domain,定義接口
MyApp.Infrastructure // 引用 Domain, EF, SqlServer,實現接口
MyApp.Web/UI // 引用 Domain, Services,零 EF 依賴
DbContext 或實體類帶有 EF Core 註解,UI 仍需引用 Provider 包。「UI 層未用到 EF 方法」是表象,本質是 Service 公共 API 洩露了 EF 類型。通過領域模型隔離、接口導向編程、依賴倒置,可實現 UI 與 ORM 框架完全解耦,同時解決「運行時找不到程序集」問題。