2011-06-30 9 views
3

私はMEFの初心者です。私はこのコードを書いているが、なぜこのプログラムがこの結果を示しているのか理解できない。予期しない結果が出ました

namespace ConsoleApplication1 
{ 
    public class MEFTest 
    { 
     [Import] 
     public string Text { get; set; } 

     [Import] 
     public IExtension Ext { get; set; } 

     public void ShowText() 
     { 
      AssemblyCatalog asscatalog = new AssemblyCatalog(typeof(Extension2).Assembly); 
      CompositionContainer container = new CompositionContainer(asscatalog); 

      CompositionBatch batch = new CompositionBatch(); 
      batch.AddPart(this); 

      container.Compose(batch); 

      Console.WriteLine(Text); 
      Console.WriteLine(Ext.Text); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      MEFTest mef = new MEFTest(); 

      mef.ShowText(); 

      Console.ReadKey(); 
     } 
    } 

    public interface IExtension 
    { 
     string Text { get; set; } 
    } 

    [Export] 
    public class Extension1 : IExtension 
    { 
     [Export] 
     public string Text { get; set; } 

     public Extension1() 
     { 
      Text = "From Extension1."; 
     } 
    } 

    [Export(typeof(IExtension))] 
    public class Extension2 : IExtension 
    { 
     // [Export(typeof(IExtension).GetProperties()[0].GetType())] 
     public string Text { get; set; } 

     public Extension2() 
     { 
      Text = "From Extension2."; 
     } 
    } 
} 

結果:のExtension1から

。 拡張機能2から。

+0

結果はForm Extenstion1ですか?フォームエクステンション2? – Jethro

+0

Hazai、下記のReedのように、[Import] public文字列Text {get; set;}を削除する必要があります。 – Jethro

答えて

2

これは、MEFがインポートとどのように一致しているかを示しています。あなたが持っているから:

[Import] 
    public string Text { get; set; } 

この場合、MEFは「文字列のテキスト」を見つけて一致します。これはExtention1から発生しますが、テキストプロパティにエクスポートを明示的に追加したためにのみが発生します。

[Import] 
    public IExtension Ext { get; set; } 

これはタイプIExtensionの実際のExportを見つけました。これらの唯一のものはExtension2クラスです。これはこの要件を満たす。

+0

Form Extension 1とForm Extension 2の両方が表示されていると彼は言っていると思います。 – Jethro

+0

@Jethro:はい、しかし、彼は2つの別々の輸入品を持っており、両方を印刷しています。上記のように、最初のインポートはExtension1を見つけ、2番目のExtensionはExtension2を見つけます。 –

+0

私は見ています。そのため、インポートはExtension1 Textプロパティと一致する場合に起こります。ありがとう。 – Jethro

0

Extension1は、自分自身をエクスポートし(インターフェイスではなくExtension1と入力します)、文字列型のTextという名前のプロパティをエクスポートすることを宣言します。

コンポジションでは、これはインポートとしてタグ付けされたTextプロパティにバインドされます。

Extension2は、タイプIExtensionをエクスポートすることを宣言します。これは、IExtensionをインポートするためにタグ付けされたExtプロパティにバインドされます。