MEF2: импорт не найден, если явно не экспортирован

Я пытаюсь заставить работать в моем приложении регистрацию MEF2 без атрибутов / на основе соглашений. Я вижу, что если я опущу атрибут [Export], ни вызов ComposeParts, ни вызов GetExports не приведут ни к каким элементам.

Если я добавлю в свой класс атрибут [Export(typeof(IGuiModule))], он будет поднят нормально, но с (разумным) предупреждением:

  "An Export specification convention that would apply to type 'Core.Models.DeviceListView' has been overridden by attributes applied in the source file or by a prior convention."

Я что-то здесь упустил или у меня неправильные ожидания? Я склонен полагать, что подход MEF2 позволяет импортировать без необходимости явного атрибута экспорта?

Информация, которую я нашел, немного смешана и фрагментирована, причем различные источники показывают различную информацию (я полагаю, что по мере развития MEF).

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class)]
public class ModuleMetadata : Attribute, IModuleMetadata
{
    public ModuleMetadata(string aName)
    {
        Name = aName;
    }
    public string Name { get; private set; }
}

public class Core
{
    [ImportMany(typeof(IGuiModule))]
    public List<ExportFactory<IGuiModule, IModuleMetadata>> GuiModuleImports;

    public Core()
    {
        var rb = new RegistrationBuilder();
        rb.ForTypesDerivedFrom<IGuiModule>().Export<IGuiModule>();
        var catalog = new DirectoryCatalog(@"d:\prog\core\", "*.dll", rb);
        var container = new CompositionContainer(catalog);
        var gx = container.GetExports<IGuiModule, IModuleMetadata>();
        container.ComposeParts(this);
    }
}

Экспортируемый класс:

// We appear to *need* this attribute: [Export(typeof(IGuiModule))]
[ModuleMetadata("Device List")]
public partial class DeviceListView : UserControl, IGuiModule
{
    public DeviceListView() {...}
}

0 ответов

Другие вопросы по тегам