2011-01-26 70 views
1

我有folllowing:問題與MEF

private void ConfigureMEFContainer() 
    { 
     _catalog = new DirectoryCatalog(_pluginsPath); 
     _container = new CompositionContainer(_catalog); 
    } 

     private readonly string _pluginsPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Plugins"); 
    private DirectoryCatalog _catalog; 
    private CompositionContainer _container; 

容器傳遞到另一個類:以上

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

     container.Compose(batch); 

     [ImportMany(typeof(IOnAnnotationCreatedPlugin))] 
    public Lazy<IOnAnnotationCreatedPlugin, IAnnotationPluginMetadata>[] OnCreatedPlugins { get; set; } 

    [ImportMany(typeof(IOnAnnotationCreatingPlugin))] 
    public Lazy<IOnAnnotationCreatingPlugin, IAnnotationPluginMetadata>[] OnCreatingPlugins { get; set; } 

    [ImportMany(typeof(IOnAnnotationUpdatedPlugin))] 
    public Lazy<IOnAnnotationUpdatedPlugin, IAnnotationPluginMetadata>[] OnUpdatedPlugins { get; set; } 

    [ImportMany(typeof(IOnAnnotationUpdatingPlugin))] 
    public Lazy<IOnAnnotationUpdatingPlugin, IAnnotationPluginMetadata>[] OnUpdatingPlugins { get; set; } 

所有的集合是空的!

任何幫助?

回答

1

感謝您的回覆。我將代碼更改爲以下,現在它工作正常。我相信,我在定製導出屬性和元數據界面時遇到了問題。這裏是萬一別人的完整代碼有同樣的問題:

public interface IAnnotationServicePluginMetadata 
{ 
    string Name { get; } 

    [DefaultValue(0)] 
    int Priority { get; } 
} 

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

    public string Name { get; set; } 
    public int Priority { get; set; } 
} 

使用上面:

[Export(typeof(IOnAnnotationUpdatedPlugin))] 
[AnnotationServicePluginMetadata(Name = "OnUpdatedPlugin", Priority = 1)] 
public class OnUpdatedPlugin : IOnAnnotationUpdatedPlugin 
{ } 

屬性如下:

[ImportMany(typeof(IOnAnnotationUpdatedPlugin))] 
    public IEnumerable<Lazy<IOnAnnotationUpdatedPlugin, IAnnotationServicePluginMetadata>> OnUpdatedPlugins { get; set; } 

希望有所幫助。 Regards

1

我看不出有什麼不對,但這裏有一個關於如何調試這種類型的事情博客文章:http://blogs.msdn.com/b/dsplaisted/archive/2010/07/13/how-to-debug-and-diagnose-mef-failures.aspx

+0

您好,感謝您的回覆。我調試了目錄,並且能夠看到在「插件」文件夾中找到的唯一程序集。似乎問題在於自己編寫的出口/進口不匹配。有任何想法嗎? – Bill 2011-01-27 07:33:14

+0

@bhaidar出口可能與進口不匹配的原因很多。他們列在我鏈接的博客文章中。 – 2011-01-27 20:07:59

0

你有沒有嘗試過的選擇:

container.ComposeParts(this); 

此外,有你確保您已經指定了導出類型,例如

[Export(typeof(IOnAnnotationCreatedPlugin))] 

而不是簡單地:

[Export] 

後者將導出的具體類型與具體類型,而不是接口的合同。