2016-08-31 11 views
5

Я работаю над образцом приложения PRISM, и я хочу использовать MEF RegistrationBuilder для создания всего моего экспорта. Эквивалент использования ExportAttribute выглядит следующим образом:Возможно ли использовать MEF RegistrationBuilder для создания модуля PRISM ModuleExport?

[Export(typeof(IFooService))] 
public class FooService : IFooService { ... } 

Builder.ForTypesMatching(typeof(IFooService).IsAssignableFrom(type)).Export<IFooService>(); 

Однако модули используют другой атрибут, то ModuleExportAttribute, например:

[ModuleExport(typeof(ModuleA), DependsOnModuleNames = new string[] { "ModuleB" })] 
public sealed class ModuleA : IModule { ... } 

Я не знаю, как использовать RegistrationBuilder класс создайте экспорт модуля вместо использования ModuleExportAttribute. Возможно ли это, поскольку он экспортируется иначе, чем стандартный экспорт?

ответ

1

The ModuleExport attribute по существу только Export(typeof(IModule)) atttibute с безопасными по типу метаданными (IModuleExport). Вы можете легко «скопировать» его поведение с RegistrationBuilder, добавив эти метаданные самостоятельно. Например

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>(eb => eb 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA))); 

Вы можете проверить это работает импортировать модули, как это так, что в основном то, что делает за кулисами Prism:

[ImportMany] 
Lazy<IModule, IModuleExport>[] Modules { get; set; } 

следует отметить, что необходимо указать в метаданных все свойства в интерфейсе IModuleExport или модули не будут импортированы (так как они не удовлетворяют интерфейс IModuleExport)


Добавление к ответу:

Код выше правильный, рабочий способ; приведенный ниже код выглядит правильно, но не работает.

Важно отметить, что это работает только при использовании перегрузки PartBuilder.Export(Action<ExportBuilder> exportConfiguration).

RegistrationBuilder builder = new RegistrationBuilder(); 
builder.ForType<ModuleA>().Export<IModule>() 
    .AddMetadata("DependsOnModuleNames", new string[] { "ModuleB" }) 
    .AddMetadata("InitializationMode", InitializationMode.WhenAvailable) 
    .AddMetadata("ModuleName", "ModuleA") 
    .AddMetadata("ModuleType", typeof(ModuleA)); 
+0

Предлагаемый код; Важно отметить, что вы должны использовать правильную 'Export()' перегрузку. Кроме того, нет необходимости добавлять все метаданные, только те части, которые вам нужны, остальное будет иметь значение по умолчанию, и это нормально, если вы не хотите указывать такие вещи, как 'InitializationMode' или зависимости. Спасибо! –

+0

Когда я проверил его, я не смог загрузить модули, в которых были только метаданные «DependsOnModuleNames», поэтому я предположил, что требуется добавить все метаданные. Возможно, некоторые свойства требуются, а некоторые необязательны, но я не уверен, как можно узнать, какие именно. –

 Смежные вопросы

  • Нет связанных вопросов^_^