2016-08-31 22 views
5

Pracuję nad przykładową aplikacją PRISM i chcę użyć MEF RegistrationBuilder, aby utworzyć cały mój eksport. Równowartość pomocą ExportAttribute jest następujący:Czy można użyć MEF RegistrationBuilder do utworzenia modułu PRISM ModuleExport?

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

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

Jednak moduły użyć innego atrybutu The ModuleExportAttribute, na przykład:

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

Nie jestem pewny jak używać klasy RegistrationBuilder do utwórz eksport modułu zamiast korzystać z ModuleExportAttribute. Czy jest to możliwe, ponieważ jest eksportowany inaczej niż standardowy eksport?

Odpowiedz

1

The ModuleExport attribute jest zasadniczo tylko atrybutem Export(typeof(IModule)) z metadanymi bezpiecznymi dla rodzaju (IModuleExport). Możesz łatwo "skopiować" jego zachowanie za pomocą RegistrationBuilder, samodzielnie dodając te metadane. Na przykład

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))); 

Można to sprawdzić, działa poprzez importowanie modułów jak to, które jest w zasadzie to, co robi Prism za kulisami:

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

Należy pamiętać, że należy określić w metadanych wszystko właściwości w interfejsie IModuleExport lub moduły nie są importowane (gdyż nie spełniają interfejs IModuleExport)


Dodawanie do odpowiedzi:

Powyższy kod jest poprawny, sposób pracy; poniższy kod wygląda poprawnie, ale nie działa.

Należy zauważyć, że działa to tylko w przypadku przeciążenia 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

Kod sugerowany działa; Ważne jest, aby pamiętać, że musisz użyć właściwego przeciążenia 'Export()'. Ponadto nie jest konieczne dodawanie wszystkich metadanych, tylko części, których potrzebujesz, reszta będzie miała domyślną wartość, co jest w porządku, jeśli nie chcesz określać rzeczy, takich jak 'InitializationMode' lub zależności. Dziękuję Ci! –

+0

Po sprawdzeniu nie mogłem załadować modułów, które zawierały metadane 'DependsOnModuleNames', więc założyłem, że wymagane jest dodanie wszystkich metadanych. Może niektóre właściwości są wymagane, a niektóre są opcjonalne, ale nie jestem pewien, w jaki sposób można wiedzieć, które są które. –