合約、檢視和配接器

本主題說明檢視和配接器、增益集管線兩端常見的區段,以及主應用程式和增益集兩者使用的合約。 下圖將顯示增益集管線的區段。

增益集管線

增益集管線模型。

如需程式碼範例,請參閱逐步解說:在主應用程式變更時確保回溯相容性逐步解說:在主應用程式和增益集之間傳遞集合

Contracts

開發通訊管線的第一步是定義合約,該合約必須衍生自 IContract 介面。 如果主應用程式和增益集載入不同的應用程式定義域中,則增益集端的管線和主應用程式端的管線之間會出現隔離界限。 合約是非版本控制介面,會定義隔離界限上通訊類型的通訊協定。 藉由使用合約在隔離界限上進行通訊,增益集模型就能避免主應用程式和增益集的型別實作跨越界限並造成版本控制問題。

必須跨應用程式定義域通訊的物件則必須為可遠端處理。 如需可遠端處理物件的詳細資訊,請參閱Remotable and Nonremotable Objects

ContractBase 類別會提供 IContract 成員的預設實作。 您的合約介面也可以繼承這個類別。

Bb384205.collapse_all(zh-tw,VS.110).gif合約需求

合約必須遵循一組需求,才能確保合約中表示的所有型別都是安全的、可進行版本控制,而且可跨越隔離界限在主應用程式和增益集之間傳遞。

合約必須繼承自 IContract,而且只能使用以下型別:

  • 繼承自 IContract 的其他合約。

  • 基本資料型別:整數和布林型別。

  • 合約組件中定義的可序列化型別。

  • Mscorlib.dll 中定義的可序列化型別,例如 Int32DateTime

  • 密封的可序列化參考型別。 例如,您可以讓 String 物件通過隔離界限,因為它是密封的可序列化參考型別。

  • 在合約或 Mscorlib.dll 中定義的列舉型別。

  • AddInToken 物件

  • 之前所列出任何型別的陣列,但不包括合約陣列。

若要傳遞物件集合,請使用實作泛型 IList<T> 介面的型別,例如 List<T>ArrayList 集合。 若要在隔離界限上傳遞這些集合,您可以暫時將它們轉換成 IListContract<T> 介面。 逐步解說:在主應用程式和增益集之間傳遞集合主題將示範如何傳遞集合。

若要建構管線,則必須使用 AddInContractAttribute 屬性識別代表增益集的合約。

管線開發工作的下一步是建立管線兩端的檢視和配接器區段。 這些區段能讓主應用程式和增益集檢視各自的物件模型,並且提供配接器來回轉換這些檢視與合約。

檢視

主應用程式的增益集檢視和增益集的主應用程式檢視都是組件,其中包含的介面或抽象類別代表彼此的檢視,以及彼此之間流動的型別檢視。 檢視不會倚賴彼此之間用來進行通訊的合約。 此外,檢視還會分隔增益集和主應用程式的實作。 如此能讓配接器和合約在不影響主應用程式或增益集的情況下進行變更。

若要建構管線,增益集實作或繼承的增益集檢視中的型別是由 AddInBaseAttribute 屬性識別,並且稱為增益集基底。 主應用程式檢視不需要探索性的屬性,因為主應用程式檢視會傳遞至 FindAddIns 方法。

配接器

增益集端和主應用程式端配接器都是組件,其中包含的配接器類別可用來在檢視和合約之間進行來回轉換。 「端」這個字是指配接器所在的管線端。 根據呼叫的方向而定,配接器會從檢視轉換成合約,或是從合約轉換成檢視。 如果您有兩個方向的呼叫 (也就是主應用程式至增益集的呼叫,以及增益集至主應用程式的呼叫),那麼您的管線兩端會各有一個配接器。 因此,配接器有兩種型別:

  • 檢視至合約配接器。

    配接器組件中的類別,會將檢視轉換成合約。 這個類別會藉由呼叫傳遞至其建構函式的檢視實作合約,並且會做為合約跨越界限進行封送處理。 這個類別必須繼承 ContractBase 和實作合約。

  • 合約至檢視配接器。

    配接器組件中的類別,會將合約轉換成檢視。 這個類別會根據檢視為介面或抽象基底型別,實作或繼承檢視轉換的區段,並且藉由呼叫傳遞至配接器建構函式的合約實作檢視的成員。

  • 若要建構管線,您必須套用 AddInAdapterAttribute 屬性識別增益集端配接器類別,並且套用 HostAdapterAttribute 屬性識別主應用程式端配接器類別。

  • 配接器不需要是公用的。

請參閱

概念

管線開發需求

管線開發