MEFプログラミングガイド(二):組合せ可能な部品と契約を定義する


コンビネーション可能部品(Componentable Parts)
 
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