相依性解析
注意
僅限 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.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 建置特定資料庫版本的模型,例如,強制使用 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 提供者。
機碼:D bSpatialServices 會以兩種方式要求。 首先,會使用 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 知道哪些元件包含預先產生的檢視,而不需要進行任何探索。
機碼:未使用;會是 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 物件,其中包含提供者不變的名稱,以及選擇性地使用事務處理程式的伺服器名稱。