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
}
}
fonte
2012-07-20 19:50:13