2012-07-20 20 views
5

Gibt es Konfigurationsdateieinstellungen für MEF oder ist alles im Code ausgeführt?MEF-Konfiguration

Wenn alles in Code ist, was sind einige Best Practices für den Wechsel zwischen verschiedenen Klassen, die exportieren? Wenn Klasse A und Klasse B beide IMyExport exportieren, gibt es einige gute Möglichkeiten, die App für die Verwendung von A oder die Verwendung von B zu konfigurieren.

Antwort

7

Soweit ich weiß, hat MEF keine Konfigurationsdatei. Für den Fall, dass Ihre Anwendung eine Implementierung gegenüber der anderen verwenden soll, könnten Sie möglicherweise eine neue ConfigurationCatalog erstellen, die eine Konfigurationsdatei als Eingabe erhält und nur die Teile exportiert, an die sie weitergeleitet wird. Es ist möglich, dass sowas schon in MefContrib existiert, also würde ich dort nachsehen.

Darüber hinaus ist es Sache der Klassen selbst zu entscheiden, welche Implementierung sie verwenden möchten. Ein möglicher Weg zu erreichen, was Sie wollen, ist durch die Verwendung Vertrag Namen

[Export("My Contract Name", typeof(IMyExport))] 
public class A : IMyExport { } 

[Export("Another Contract Name", typeof(IMyExport))] 
public class B : IMyExport { } 

Dann wird die Klasse IMyExport importieren kann, welche der Teile angeben es will

[Import("Another Contract Name")] 
public IMyExport MyExport { get; set; } 

verwenden Wenn Sie wissen, dass eine gewisse Abhängigkeit IMyExport kann mehr als einmal exportiert werden, können Sie add metadata to the export und zur Laufzeit entscheiden, welche der Exporte Sie anhand seiner Metadaten verwenden möchten. Wenn Sie mit dieser Richtung gehen, würde Ihr Code in etwa so aussehen:

[MySpecialExport(SomeData = "ABC")] 
public class A : IMyExport { } 

[MySpecialExport(SomeData = "DEF")] 
public class B : IMyExport { } 

public class MyClass 
{ 
    [ImportMany(typeof(IMyExport))] 
    public IEnumerable<Lazy<IMyExport, IMyExportMetadata>> MyProperty { get; set; } 

    public void DoSomething() 
    { 
     var myLazyExport = MyProperty.FirstOrDefault(x => x.Metadata.SomeData == "DEF"); 
     IMyExport myExport = myLazyExport.Value; 

     // Do something with myExport 
    } 
}