相依性解析

注意

僅限 EF6 及更新版本 - Entity Framework 6 已引進此頁面中所討論的功能及 API 等等。 如果您使用的是較早版本,則不適用部分或全部的資訊。

從EF6開始,Entity Framework 包含一般用途機制,可用來取得所需的服務實作。 也就是說,當EF使用某些介面或基類的實例時,它會要求使用介面或基類的具體實作。 這可透過使用 IDbDependencyResolver 介面來達成:

public interface IDbDependencyResolver
{
    object GetService(Type type, object key);
}

GetService 方法通常是由 EF 呼叫,並由 EF 或應用程式提供的 IDbDependencyResolver 實作來處理。 呼叫時,type 自變數是所要求服務的介面或基類類型,而索引鍵物件為 Null 或提供所要求服務內容信息的物件。

除非另有說明,傳回的任何對象都必須是線程安全的,因為它可以用作單例。 在許多情況下,傳回的物件是工廠,在此情況下,工廠本身必須是執行緒安全的,但從工廠傳回的物件則不必具備執行緒安全,因為每次使用時都會從工廠請求新的實例。

本文不包含如何實作 IDbDependencyResolver 的完整詳細資料,而是作為一個服務類型的參考,這些類型也就是介面和基類型,EF 將在這些類型的呼叫中使用 GetService,並討論每個呼叫中索引鍵物件的語意。

System.Data.Entity.IDatabaseInitializer<TContext>

引進的版本:EF6.0.0

傳回的物件:指定之內容類型的資料庫初始化表達式

鍵值:未使用;會是 Null

Func<System.Data.Entity.Migrations.Sql.MigrationSqlGenerator>

引進的版本:EF6.0.0

傳回的物件:一個用於建立 SQL 生成器的工廠,可用於遷移,以及其他會導致資料庫建立的操作,例如使用資料庫初始化器進行資料庫建立。

Key:包含 ADO.NET 提供者不變名稱(Invariant Name)的字串,用以指定將產生 SQL 的資料庫類型。 例如,對於鍵「System.Data.SqlClient」,會返回 SQL Server SQL 產生器。

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Entity.Core.Common.DbProviderServices

引進的版本:EF6.0.0

傳回的物件:指定的提供者固定名稱所使用的 EF 提供者

索引鍵:字串,包含 ADO.NET 提供者不變的名稱,指定提供者所需的資料庫類型。 例如,針對密鑰 "System.Data.SqlClient" 會傳回 SQL Server 提供者。

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Entity.Infrastructure.IDbConnectionFactory

引進的版本:EF6.0.0

傳回的物件:EF 依慣例建立資料庫連接時將使用的連接處理站。 也就是說,未將任何連線或連接字串提供給 EF,且在app.config或web.config中找不到任何連接字串,則此服務會用來按照慣例建立連接。 變更連線處理站可讓 EF 預設使用不同類型的資料庫(例如 SQL Server Compact Edition)。 永遠不要將密碼或其他敏感性資料儲存在設定提供者程式碼或純文字設定檔中。 請在專案外部指定機密資訊,以防止其意外提交至原始碼存放庫。 請考慮使用 受保護的組態來保護組態檔的內容。

鍵值:未使用;會是 Null

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Entity.Infrastructure.IManifestTokenService

引進的版本:EF6.0.0

傳回的物件:一種服務,它可以從連接中生成提供者清單令牌。 此服務通常會以兩種方式使用。 首先,它可以用來避免在建置模型時使用 Code First 連線到資料庫。 其次,它可以用來強制 Code First 建置特定資料庫版本的模型,例如,強制使用 SQL Server 2005 的模型,即使有時使用 SQL Server 2008 也一樣。

物件存留期:Singleton -- 同一個物件可以多次使用,並同時由不同的線程使用

鍵值:未使用;會是 Null

System.Data.Entity.Infrastructure.IDbProviderFactoryService

引進的版本:EF6.0.0

返回的物件:可以從指定的連線取得提供者工廠的服務。 在 .NET 4.5 上,提供者可從聯機公開存取。 在 .NET 4 上,此服務的默認實作會使用一些啟發學習法來尋找比對提供者。 如果這些失敗,則可以註冊此服務的新實作,以提供適當的解決方案。

鍵值:未使用;會是 Null

Func<DbContext、System.Data.Entity.Infrastructure.IDbModelCacheKey>

引進的版本:EF6.0.0

傳回的物件:將針對指定內容產生模型快取索引鍵的處理站。 根據預設,EF 會為每個提供者快取每個 DbContext 類型一個模型。 此服務的不同實作可用來將架構名稱等其他資訊新增至快取索引鍵。

鍵值:未使用;會是 Null

System.Data.Entity.Spatial.DbSpatialServices

引進的版本:EF6.0.0

傳回的物件:一個 EF 空間提供者,為基本 EF 提供者新增對地理和幾何空間類型的支援。

重點: DbSpatialServices 會以兩種方式被要求。 首先,會使用 DbProviderInfo 物件(其中包含不變名稱與清單令牌)作為鍵,來請求提供者特定的空間服務。 其次,可以在沒有密鑰的情況下請求 DbSpatialServices。 這可用來解析建立獨立 DbGeography 或 DbGeometry 類型時所使用的「全域空間提供者」。

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

Func<System.Data.Entity.Infrastructure.IDbExecutionStrategy>

引進的版本:EF6.0.0

傳回的物件:用來建立服務的工廠,讓提供者在對資料庫執行查詢和命令時實作重試或其他行為。 如果未提供任何實作,則 EF 只會執行命令並傳播擲回的任何例外狀況。 對於 SQL Server,此服務用來提供重試原則,在針對 SQL Azure 等雲端式資料庫伺服器執行時特別有用。

鍵:ExecutionStrategyKey 物件,其中包含提供者不變名稱,以及(選擇性地)提供執行策略的伺服器名稱。

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

Func<DbConnection, string, System.Data.Entity.Migrations.History.HistoryContext>

引進的版本:EF6.0.0

傳回的物件:一個處理站,可讓提供者設定 HistoryContext 與 __MigrationHistory EF 移轉所使用的數據表的對應。 HistoryContext 是 Code First DbContext,可以使用一般的 Fluent API 來設定,例如變更數據表名稱及欄位映射規範等。

鍵值:未使用;會是 Null

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Common.DbProviderFactory

引進的版本:EF6.0.0

傳回的物件:用於指定提供者不變名稱的 ADO.NET 提供者。

索引鍵:包含 ADO.NET 提供者不可變名稱的字串

注意

此服務通常不會直接變更,因為預設實作會使用一般 ADO.NET 提供者註冊。 如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Entity.Infrastructure.IProviderInvariantName

引進的版本:EF6.0.0

傳回的物件:一種服務,用來判斷特定 DbProviderFactory 類型的提供者不變異名稱。 此服務的預設實作會使用 ADO.NET 提供者註冊。 這表示如果 ADO.NET 提供者未以正常方式註冊,因為 EF 正在解析 DbProviderFactory,則也必須解析此服務。

機碼:需要不因名稱而異的 DbProviderFactory 實例。

注意

如需 EF6 中提供者相關服務的詳細資訊,請參閱 EF6 提供者模型 一節。

System.Data.Entity.Core.Mapping.ViewGeneration.IViewAssemblyCache

引進的版本:EF6.0.0

傳回的物件:包含預先生成檢視的組件快取。 替代方案通常用來讓 EF 知道哪些組件包含預先生成的檢視,而不需要進行任何探索。

鍵:未使用;會是空值

System.Data.Entity.Infrastructure.Pluralization.IPluralizationService

引進的版本:EF6.0.0

傳回的物件:EF 所使用的服務,用於將名稱變為複數或單數。 預設會使用英文複數服務。

鍵值:未使用;會是 Null

System.Data.Entity.Infrastructure.Interception.IDbInterceptor

引進的版本:EF6.0.0

傳回的物件:應用程式啟動時應該註冊的任何攔截器。 請注意,這些物件是使用 GetServices 呼叫要求,而任何相依性解析程式所傳回的所有攔截器都會註冊。

機碼:未使用;會是 Null。

Func<System.Data.Entity.DbContext, 動作<字串>, System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter>

引進的版本:EF6.0.0

傳回的物件:用於建立資料庫記錄格式器的工廠,當在指定的內容上設定 context.Database.Log 屬性時將使用。

機碼:未使用;會是 Null。

Func<System.Data.Entity.DbContext>

引進的版本:EF6.1.0

傳回的物件:當內容沒有可存取的無參數建構函式時,將用來建立移轉的內容實例的處理站。

Key:需要工廠的衍生 DbContext 類型的 Type 物件。

Func<System.Data.Entity.Core.Metadata.Edm.IMetadataAnnotationSerializer>

引進的版本:EF6.1.0

傳回的物件:一個工廠,將用於建立串行化器,旨在對強型別的自定義註解進行串行化和反串行化為 XML,以供 Code First 移轉使用。

Key:被序列化或反序列化的註解名稱。

Func<System.Data.Entity.Infrastructure.TransactionHandler>

引進的版本:EF6.1.0

傳回的物件:將用來建立交易處理程式的處理站,以便針對處理認可失敗等情況套用特殊處理。

鍵:ExecutionStrategyKey 物件,包含提供者不變名稱,以及可選的伺服器名稱,用於事務處理程式。