2010-08-16 10 views
8

¿Puedo hidratar esto dentro del constructor estático de la clase?¿Puedes hidratar una propiedad estática usando MEF?

public class Connect:IDTExtensibility2, IDTCommandTarget 
    static Connect() 
    { 
     //hydrate static properties? 
    } 
    [Import] 
    public static Action<ProjectLogicChecks> Display { get; set; } 

[Export(typeof(Action<ProjectLogicChecks>))] 
    private static void DisplayResults(CheckProcesses _checkResults) 
{ 
    MessageBox.Show(_checkResults.ProjectLogicCheck.AssemblyName + " has problems=" + 
        _checkResults.ProjectLogicCheck.HasProblems); 
} 
+2

"Hidratar" es un término de hibernación que significa deserializar, es decir, convertir datos en un objeto de dominio. ¿Querías decir "inicializar" en su lugar? –

+1

@Wim - Lo tomé para significar llenar una clase con sus valores. – Maslow

+0

@Wim: ¿puedes vincular los recursos que denotan que la hidratación tiene que deserializarse? No voy a encontrar mucho en google que no se ajuste a mi definición. – Maslow

Respuesta

1

Fue más fácil de lo que pensé.

static Connect() 
    { 
     var batch = new CompositionBatch(); 
     CompositionContainer container; 
     var reflectionCatalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()); 

     var extensionPath = System.IO.Path.Combine(Environment.CurrentDirectory, "extensions"); 
     if (System.IO.Directory.Exists(extensionPath)) 
     { 
      var directoryCatalog = new DirectoryCatalog(extensionPath); 
      var defaultCatalogEp = new CatalogExportProvider(reflectionCatalog); 
      container=new CompositionContainer(directoryCatalog, defaultCatalogEp); 
      defaultCatalogEp.SourceProvider=container; 
     } 
     else 
      container = new CompositionContainer(reflectionCatalog); 

     container.Compose(batch); 
//Setting a static property 
     Display=container.GetExportedValue<Action<IEnumerable< ProjectLogicChecks>>>(); 
    } 

cambiado el tipo de Action<IEnumerable<ProjectLogicChecks>> para que pudiera mostrar los resultados de varios proyectos o una solución integral en lugar de sólo una.

Seguí el artículo this para obtener el conjunto de propiedades estáticas, luego this para proporcionar los valores predeterminados locales en caso de que no haya una extensión.

+3

Esta es una solución fea. Usando MEF no deberías necesitar cosas estáticas. Solo puede importar algo con una política de creación de piezas compartida y se comporta como estático. –

14

No, MEF no admite importaciones estáticas.

+1

-1 Lo logré, mira mi respuesta. – Maslow

+8

+1 extraer un valor de un contenedor y rellenarlo en una propiedad estática no es una importación. El objetivo de usar un contenedor es que se encargue de inyectar dependencias automáticamente. Si va a hacer eso usted mismo, también puede tirar el contenedor por completo. El código reutilizable, comprobable por unidad, vagamente acoplado debe evitar los miembros estáticos. Los miembros estáticos pegan todo en una gran bola de barro. –

+0

@Wim: Visual Studio lo llama importación, no hay referencias al código que proporciona el complemento y la composición funciona. Solo porque usar una estática en algunas situaciones es una mala práctica no significa que no sea MEF. Además, tengo TypeMock, los miembros estáticos son verificables por unidad. Entonces, ¿qué estás tratando de decir aquí? – Maslow

2

Puede usar [ImportingConstructor] y establecer la propiedad estática en el constructor.

private static RandomService Random { get; set; } 
[ImportingConstructor] 
public ClientViewModel(RandomService random) 
{ 
Random = random; 
} 

Simplemente no lo fije en un campo estático.

Cuestiones relacionadas