ASP.NET MVC + MEF + MefContrib: не получается получить метаданные из экспорта - PullRequest
1 голос
/ 25 февраля 2011

Я использую asp.net mvc3 с MEF + MEFContrib для загрузки некоторых служб на мои контроллеры.Происходит то, что я могу загрузить службы - IEnumerable<IPublishService> publishers - [ImportingConstructor], но когда я пытаюсь загрузить службы метаданными - Lazy<IPublishService, IPluginMetaData>[] publishers - я получаю пустой массив.

Любые мысли о том, почему?Спасибо.

Мой код:

public interface IPluginMetaData
{
    string Name { get; }
    string Version { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
    public PluginMetadataAttribute(string name, string version)
        : base(typeof(IPluginMetaData))
    {
        Name = name;
        Version = version;
    }

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

[Export(typeof(IPublishService))]
[PluginMetadata("Default", "1.0.0.0")]
public class SamplePublishService : IPublishService
{

}

[ImportingConstructor]
public HomeController(Lazy<IPublishService, IPluginMetaData>[] publisher /* Empty Array */ , IEnumerable<IPublishService> publishers /* Array with 1 service */)
{
}

ОБНОВЛЕНИЕ (основано на ответе Даниила, но все еще ничего)

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class PluginMetadataAttribute : ExportAttribute
{
    public PluginMetadataAttribute(string name, string version)
        : base(typeof(IPublishService))
    {
        Name = name;
        Version = version;
    }

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

[PluginMetadata("Default", "1.0.0.0")]
public class GoogleSampleGroupPublishService : IPublishService
{
}

[ImportingConstructor]
public HomeController([ImportManyAttribute]Lazy<IPublishService, IPluginMetaData>[] publisher)
{
}

1 Ответ

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

Обычно вам нужно поставить ImportManyAttribute для аргументов вашего конструктора, так как они являются импортом коллекции. Поскольку один из них работает, я подозреваю, что MEFContrib что-то делает, так что вам не нужно это делать, но он работает только для IEnumerable<T>, а не для массива T. Поэтому попробуйте изменить первый аргумент на IEnumerable<Lazy<IPublishService, IPluginMetadata>> или добавив ImportManyAttribute перед ним.

Некоторые другие проблемы, которые я заметил: Ваш PluginMetadataAttribute является производным от ExportAttribute. Причина, по которой вы это сделаете, заключается в том, что вам не нужно добавлять атрибуты экспорта и метаданных в ваши службы. Однако тип, передаваемый конструктору базового класса, является экспортированным контрактом. Так что это должно быть IPublishService вместо IPluginMetadata. Внесите это изменение и удалите атрибут Export из SamplePublishService.

...