Share via


相依性解析

注意

僅限 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 產生器的處理站,可用於移轉,以及導致建立資料庫的其他動作,例如使用資料庫初始化運算式建立資料庫。

索引鍵 :字串,包含 ADO.NET 提供者不因名稱而異,指定將產生 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.IDb連線ionFactory

引進 的版本: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 建置特定資料庫版本的模型,例如,強制使用 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 提供者。

機碼 :DbSptialServices 會以兩種方式要求。 首先,會使用 DbProviderInfo 物件(其中包含不因名稱與資訊清單權杖)作為金鑰,要求提供者特定的空間服務。 其次,可以要求 DbSpatialServices 沒有金鑰。 這可用來解析建立獨立 DbGeography 或 DbGeometry 類型時所使用的「全域空間提供者」。

注意

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

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

引進 的版本:EF6.0.0

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

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

注意

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

Func < Db連線ion, 字串, 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 知道哪些元件包含預先產生的檢視,而不需要進行任何探索。

機碼 :未使用;會是 Null

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

傳回 的物件:將用來建立資料庫記錄格式子的處理站,將在內容時使用。Database.Log 屬性是在指定的內容上設定。

機碼 :未使用;會是 Null。

Func < System.Data.Entity.DbCoNtext>

引進 的版本:EF6.1.0

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

索引鍵 :需要處理站之衍生 DbCoNtext 類型的 Type 物件。

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

引進 的版本:EF6.1.0

傳回 的物件:將用來建立序列化程式進行強型別自訂批註序列化的處理站,以便將其序列化並還原成 XML,以用於Code First 移轉。

索引鍵 :正在序列化或還原序列化的批註名稱。

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

引進 的版本:EF6.1.0

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

機碼 :ExecutionStrategyKey 物件,其中包含提供者不變的名稱,以及選擇性地使用交易處理程式的伺服器名稱。