MEF问题

时间:2011-01-26 18:41:42

标签: asp.net 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; }

上面的所有收藏品都是空的!

任何帮助?

3 个答案:

答案 0 :(得分:1)

我看不出有什么问题,但这里有关于如何调试此类事情的博文:http://blogs.msdn.com/b/dsplaisted/archive/2010/07/13/how-to-debug-and-diagnose-mef-failures.aspx

答案 1 :(得分: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; }

希望有所帮助。 此致

答案 2 :(得分:0)

你有没有尝试过替代方案:

container.ComposeParts(this);

此外,您是否已确保在导出时指定了类型,例如

[Export(typeof(IOnAnnotationCreatedPlugin))] 

而不仅仅是:

[Export]

后者将使用具体类型的合同导出具体类型,而不是接口。