MEFプログラミングガイド(二):組合せ可能な部品と契約を定義する
4478 ワード
コンビネーション可能部品(Componentable Parts)
MEF内部での組込み可能な構成要素は組込み可能なユニットである.コンビネーション可能部品は、他のコンビネーション可能部品に必要なサービスをエクスポートし、他のコンビネーション可能部品からサービスをインポートする.MEFプログラミングモデルでは、コンポーネントを組み合わせて[System.componentModel.Composition.Import]および[System.ComponentModel.Composition.Export]プロパティで識別し、エクスポートポイントとインポートポイントを宣言します.コンビネーション可能なコンポーネントには、少なくとも1つのエクスポートポイントが含まれている必要があります.コンポーネントを組み合わせるか、コンテナに明示的に追加するか、ディレクトリを使用して作成できます.MEFは、デフォルトディレクトリ識別Exportプロパティ識別の組合せ可能な部品にアクセスします.
契約(Contacts)
コンビネーション可能な部品は、他の部品に直接依存せず、逆に文字列識別の契約に依存する.各導出ポイントは、契約を有し、各導入ポイントが明示する彼に必要な契約を有する.コンテナは,契約情報を用いてインポートポイントとエクスポートポイントとの間でマッチングする.契約が指定されていない場合、MEFは完全限定名の契約タイプを暗黙的に使用します.タイプが渡されると、完全限定名も使用されます.
注:デフォルトでは、タイプによって契約に渡されます.契約は任意の文字列であってもよいが、曖昧さ(Ambiguity)を引き起こす可能性がある.たとえば、「Sender」は、別のライブラリの「Sender」と重複する可能性があります.このため、文字列の契約を指定する必要がある場合は、契約名に会社名を含めることを強くお勧めします.
げんてい
名前空間(Contoso.Exports.Senderなど)
以下のコードフラグメントは、すべてのエクスポート契約が等価である(Equivalent).
インタフェース/抽象契約
コンポーネントを組み合わせる一般的なモードの1つは、特定のタイプではなく、インタフェースまたは抽象タイプをエクスポートすることである.これにより、インポート者が特定のエクスポートインプリメンテーションから完全にデカップリングされ、注目点の分離をもたらす.たとえば、IMessageSenderをエクスポートする2つのSender実装を次に示します.NotifierクラスはIMessageSenderセットをインポートし、彼のSend()メソッドを呼び出します.新しいMessageSenderはシステムに簡単に追加できます.
契約プログラムセット(Contract Assemblies)
MEFを使用して拡張可能なアプリケーションを構築する際の一般的なパターンは、契約プログラムセットをパブリッシュすることです.契約プログラムセットには、ユーザがアプリケーションを拡張できる契約タイプのみが含まれます.通常はインタフェースですが、抽象クラスである可能性もあります.さらに、契約プログラムセットには、インポートポイントで使用されるメタデータ(Metadata)ビューインタフェース、および任意のカスタムMEFエクスポートプロパティが含まれます.
注意:特定のエクスポートインタフェースタイプ(IMessageSender)を指定する必要があります.そうしないと、タイプ(EmailSender)自体がエクスポートされます.
原文住所:
http://mef.codeplex.com/wikipage?title=Parts&referringTitle=Guide
MEF内部での組込み可能な構成要素は組込み可能なユニットである.コンビネーション可能部品は、他のコンビネーション可能部品に必要なサービスをエクスポートし、他のコンビネーション可能部品からサービスをインポートする.MEFプログラミングモデルでは、コンポーネントを組み合わせて[System.componentModel.Composition.Import]および[System.ComponentModel.Composition.Export]プロパティで識別し、エクスポートポイントとインポートポイントを宣言します.コンビネーション可能なコンポーネントには、少なくとも1つのエクスポートポイントが含まれている必要があります.コンポーネントを組み合わせるか、コンテナに明示的に追加するか、ディレクトリを使用して作成できます.MEFは、デフォルトディレクトリ識別Exportプロパティ識別の組合せ可能な部品にアクセスします.
契約(Contacts)
コンビネーション可能な部品は、他の部品に直接依存せず、逆に文字列識別の契約に依存する.各導出ポイントは、契約を有し、各導入ポイントが明示する彼に必要な契約を有する.コンテナは,契約情報を用いてインポートポイントとエクスポートポイントとの間でマッチングする.契約が指定されていない場合、MEFは完全限定名の契約タイプを暗黙的に使用します.タイプが渡されると、完全限定名も使用されます.
注:デフォルトでは、タイプによって契約に渡されます.契約は任意の文字列であってもよいが、曖昧さ(Ambiguity)を引き起こす可能性がある.たとえば、「Sender」は、別のライブラリの「Sender」と重複する可能性があります.このため、文字列の契約を指定する必要がある場合は、契約名に会社名を含めることを強くお勧めします.
げんてい
名前空間(Contoso.Exports.Senderなど)
以下のコードフラグメントは、すべてのエクスポート契約が等価である(Equivalent).
[Export]
public class Exporter { }
[Export(typeof(Exporter))]
public class Exporter1 { }
[Export("Chapter02.Exporter")]
public class Exporter2 { }
インタフェース/抽象契約
コンポーネントを組み合わせる一般的なモードの1つは、特定のタイプではなく、インタフェースまたは抽象タイプをエクスポートすることである.これにより、インポート者が特定のエクスポートインプリメンテーションから完全にデカップリングされ、注目点の分離をもたらす.たとえば、IMessageSenderをエクスポートする2つのSender実装を次に示します.NotifierクラスはIMessageSenderセットをインポートし、彼のSend()メソッドを呼び出します.新しいMessageSenderはシステムに簡単に追加できます.
[Export(typeof(IMessageSender))]
public class EmailSender : IMessageSender
{
public void Send(string message)
{
Console.WriteLine("Invoke EmailSender Send() method");
Console.WriteLine(message);
}
}
[Export(typeof(IMessageSender))]
public class TCPSender : IMessageSender
{
void IMessageSender.Send(string message)
{
Console.WriteLine("Invoke TCPSender Send() method");
Console.WriteLine(message);
}
}
public interface IMessageSender
{
void Send(string message);
}
契約プログラムセット(Contract Assemblies)
MEFを使用して拡張可能なアプリケーションを構築する際の一般的なパターンは、契約プログラムセットをパブリッシュすることです.契約プログラムセットには、ユーザがアプリケーションを拡張できる契約タイプのみが含まれます.通常はインタフェースですが、抽象クラスである可能性もあります.さらに、契約プログラムセットには、インポートポイントで使用されるメタデータ(Metadata)ビューインタフェース、および任意のカスタムMEFエクスポートプロパティが含まれます.
注意:特定のエクスポートインタフェースタイプ(IMessageSender)を指定する必要があります.そうしないと、タイプ(EmailSender)自体がエクスポートされます.
原文住所:
http://mef.codeplex.com/wikipage?title=Parts&referringTitle=Guide