2011-01-17 11 views
1

私は自分の心を失っていると思う。 :) 私は今この2日間苦労してきました。コードは正しく見えます。しかし、何らかの理由で[ImportMany]フィールドにアクセスしようとすると、null、または少なくとも値を返さない。MEFカスタム属性とレイジー

カタログに3つの部分がありますが、定義しているLazy []インポートには適用されません。

は、ここに私のコードです:

using System; 
using System.Linq; 
using System.ComponentModel.Composition; 
using System.ComponentModel.Composition.Hosting; 

namespace MefTest 
{ 

// Extension interface and metadata 

    public interface IUIExtension 
    { 
     void DoSomething(); 
    } 

    public interface IUIExtensionDetails 
    { 
     string Name { get; } 
     string Uri { get; } 
    } 

    [MetadataAttribute] 
    [AttributeUsage(AttributeTargets.Class, AllowMultiple=false)] 
    public class UIExtensionAttribute : ExportAttribute 
    { 
     public UIExtensionAttribute() : base(typeof(IUIExtensionDetails)) { } 

     public string Name { get; set; } 
     public string Uri { get; set; } 
    } 

     // Extensions 

    [UIExtension(Name="Test 01", Uri="http://www.yourmomma.com/")] 
    public class Test1Extension : IUIExtension 
    { 
     public void DoSomething() { } 
    } 

    [UIExtension(Name = "Test 02", Uri = "http://www.yourdaddy.com/")] 
    public class Test2Extension : IUIExtension 
    { 
     public void DoSomething() { } 
    } 

    [UIExtension(Name = "Test 03", Uri = "http://www.youruncle.com/")] 
    public class Test3Extension : IUIExtension 
    { 
     public void DoSomething() { } 
    } 

     // Main program 

    public class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.Run(); 
     } 

     [ImportMany] 
     public Lazy<IUIExtension, IUIExtensionDetails>[] Senders { get; set; } 

     public void Run() 
     { 
      Compose(); 
     } 

     public void Compose() 
     { 
      var catalog = new AssemblyCatalog(
       System.Reflection.Assembly.GetExecutingAssembly()); 
      var container = new CompositionContainer(catalog); 

      container.ComposeParts(this); 

      // This is always 3 
      Console.WriteLine(
       (from g in container.Catalog.Parts select g).Count()); 
      // This is always 0 
      Console.WriteLine(Senders.Length); 

      Console.ReadKey(); 
     } 
    } 

} 

答えて

2

あなたのメタデータ属性は、メタデータの契約であるtypeof(IUIExtensionDetails)などの輸出ではなく、実際の拡張機能を定義しています。あなたのエラーはここにある

public UIExtensionAttribute() : base(typeof(IUIExtension)) { } 
+0

+1ありがとうございます。 –

3

public UIExtensionAttribute() : base(typeof(IUIExtensionDetails)) 

あなたは、そこにいないメタデータ型契約型を渡す必要があります。また

public UIExtensionAttribute() : base(typeof(IUIExtension)) 

を(、中にコンストラクタをカスタム属性を変更しますあなたのカスタムエクスポートクラスがメタデータを持つインポートで期待通りに正しいプロパティを持っていることを確認するには、IUIExtensionDetailsインターフェイスを実装するようにしましょう。しかし、これは必須ではありません)

+0

+1ありがとうございます。 –