2012-07-20 19 views
5

¿Hay alguna configuración de archivo de configuración para MEF, o todo está hecho en código?Configuración MEF

Si todo está en el código, ¿cuáles son algunas de las mejores prácticas para cambiar entre las diferentes clases que exportan? es decir, si la Clase A y la Clase B exportan IMyExport, ¿cuáles son algunas buenas maneras de "configurar" la aplicación para usar A o usar B?

Respuesta

7

Por lo que sé, MEF no tiene un archivo de configuración. En el caso de que desee que su aplicación use una implementación sobre la otra, posiblemente pueda crear una nueva ConfigurationCatalog que obtendrá un archivo de configuración como entrada y solo exportará las partes que le indique. Es posible que algo como eso ya exista en MefContrib, así que lo verificaría allí.

Aparte de eso, depende de las clases decidir qué implementación desearían usar. Una posible manera de lograr lo que desea es mediante el uso de nombres de contrato

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

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

Entonces la clase importación IMyExport puede especificar cuál de las partes que quiere usar

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

Si usted sabe que una cierta dependencia IMyExport se puede exportar más de una vez, puede add metadata to the export y decidir en tiempo de ejecución cuál de las exportaciones desea usar según sus metadatos. Si va en esa dirección, su código se parecería a este

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