2012-07-20 13 views
5

Esistono impostazioni di file di configurazione per MEF o tutto è fatto nel codice?Configurazione MEF

Se tutto è in codice, quali sono le migliori pratiche per passare da classi diverse a esportazioni? Ad esempio, se la Classe A e la Classe B esportano entrambi IMyExport, quali sono alcuni buoni modi per "configurare" l'app per usare A o per usare B?

risposta

7

Per quanto ne so, MEF non ha un file di configurazione. Nel caso in cui si desideri che la propria applicazione utilizzi un'implementazione rispetto all'altra, è possibile creare un nuovo ConfigurationCatalog che otterrà un file di configurazione come input e che esporterà solo le parti a cui lo comunica. È possibile che qualcosa del genere esista già in MefContrib, quindi vorrei controllare lì.

A parte questo, spetta alle classi stesse decidere quale implementazione si desidera utilizzare. Un modo possibile per ottenere ciò che si vuole è quello di utilizzare i nomi di contratto

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

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

allora la classe importazione IMyExport può specificare quale delle parti che vuole utilizzare

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

Se si sa che una certa dipendenza IMyExport può essere esportato più volte, è possibile add metadata to the export e decidere in fase di esecuzione quale delle esportazioni si desidera utilizzare in base ai relativi metadati. Se vai in quella direzione, il tuo codice sarà simile a questo

[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 
    } 
}