2016-10-05 7 views
1

Ich versuche, etwas Code aus dem Targeting von .NET Framework auf .NET Core zu portieren, und ein Teil davon beinhaltet den Wechsel von MEF1 zu MEF2. Es scheint nicht viel Dokumentation über die Verwendung von MEF in .NET Core zu geben, und ich kann keine Beispiele finden, die zeigen, wie Teile herausgefiltert werden können, wie es mit MEF1 möglich war.Wie können Sie Teile in MEF2 herausfiltern?

In meinem ursprünglichen Code (mit MEF1) wollte ich alle Teile aus einer Reihe von Baugruppen mit Ausnahme von MockCommunicationService exportiert werden. Ich implementierte dies wie folgt:

Was wäre das Äquivalent dazu in MEF2? Ich stelle mir vor, dass es wahrscheinlich die Verwendung von ConventionBuilder beinhaltet, aber ich weiß nicht, ob es eine Möglichkeit gibt, eine Konvention nach dem Motto "Erlaube alles außer x" zu definieren.

Idealerweise so etwas wie dies wäre toll:

var conventions = new ConventionBuilder(); 
conventions.ForType<MockCommunicationService>().SuppressExports(); 

var configuration = new ContainerConfiguration() 
    .WithAssemblies(assemblies, conventions); 

Antwort

1

Es ist kaum eine optimale Lösung, aber das ist die Abhilfe, die ich verwendet habe, für den Augenblick.

bei the source der Suche nach ContainerConfiguration, ich sehe, dass WithAssemblies wie folgt definiert ist:

public ContainerConfiguration WithAssemblies(IEnumerable<Assembly> assemblies, AttributedModelProvider conventions) 
{ 
    if (assemblies == null) throw new ArgumentNullException(nameof(assemblies)); 
    return WithParts(assemblies.SelectMany(a => a.DefinedTypes.Select(dt => dt.AsType())), conventions); 
} 

statt mit WithAssemblies, so verwende ich WithParts wie folgt:

// Filter out invalid exports. 
Predicate<Type> filterParts = part => !part.Equals(typeof(MockCommunicationService)); 

var parts = from name in DependencyContext.Default.GetDefaultAssemblyNames() 
      where name.Name.StartsWith("<<Company>>") 
      let assembly = Assembly.Load(name) 
      from definedType in assembly.DefinedTypes 
      let part = definedType.AsType() 
      where filterParts(part) 
      select part; 

var configuration = new ContainerConfiguration() 
    .WithParts(parts); 

return configuration.CreateContainer(); 

Auch dies mehr scheint eine hacky Workaround als eine ordnungsgemäße Möglichkeit, so werde ich diese Antwort nicht akzeptieren. Wenn keine anderen Antworten gepostet werden, kann dies für andere nützlich sein.

Verwandte Themen