Проблема с MEF - PullRequest
       5

Проблема с MEF

1 голос
/ 26 января 2011

У меня есть следующее:

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 ]

1 голос
/ 28 января 2011

Спасибо за ваши ответы.Я изменил код на следующий, и теперь он работает нормально.Я считаю, что у меня была проблема с пользовательским атрибутом экспорта и интерфейсом метаданных.Вот полный код на тот случай, если у кого-то еще возникла такая же проблема:

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
{ }

Свойства:что помогает.Привет

1 голос
/ 26 января 2011

Я не вижу, что не так, но вот сообщение в блоге о том, как отлаживать подобные вещи: http://blogs.msdn.com/b/dsplaisted/archive/2010/07/13/how-to-debug-and-diagnose-mef-failures.aspx

0 голосов
/ 27 января 2011

Вы пробовали альтернативу:

container.ComposeParts(this);

Кроме того, вы убедились, что указали тип при экспорте, например,

[Export(typeof(IOnAnnotationCreatedPlugin))] 

Вместо простого:

[Export]

Последний будет экспортировать конкретный тип с контрактом для конкретного типа, а не интерфейса.

...