2010-08-16 11 views
8

posso idratarlo all'interno del costruttore statico della classe?Puoi idratare una proprietà statica 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

"Hydrate" è un termine da ibernare che significa deserializzare, cioè riconvertire i dati in un oggetto dominio. Intendevi invece "inizializzare"? –

+1

@Wim - L'ho preso per il riempimento di una classe con i suoi valori. – Maslow

+0

@Wim - puoi collegare qualsiasi risorsa che denoti che l'idratazione deve essere deserializzante? Non mi viene in mente molto su google che non sembra adattarsi alla mia definizione. – Maslow

risposta

1

Era più facile di quanto pensassi.

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>>>(); 
    } 

cambiato il tipo di Action<IEnumerable<ProjectLogicChecks>> modo da poter visualizzare i risultati per diversi progetti o tutta una soluzione invece di quello.

Ho seguito l'articolo this per ottenere il set di proprietà statiche, quindi this per fornire valori predefiniti locali nel caso in cui non sia presente alcuna estensione.

+3

Questa è una brutta soluzione. Usando MEF non dovresti aver bisogno di cose statiche. Puoi semplicemente importare qualcosa con una politica di creazione di parti condivisa e si comporta come statica. –

14

No, MEF non supporta le importazioni statiche.

+1

-1 L'ho raggiunto, guardo la mia risposta. – Maslow

+8

+1 estraendo un valore da un contenitore e inserendolo in una proprietà statica non è un'importazione. L'intero punto di utilizzo di un contenitore è che si occupa di iniettare automaticamente le dipendenze. Se lo farai tu stesso, potresti anche buttare via il contenitore. Il codice riutilizzabile, testabile unitamente e liberamente accoppiato dovrebbe evitare membri statici. I membri statici incollano tutto insieme in una grande palla di fango. –

+0

@Wim - visual studio lo chiama import, non ci sono riferimenti al codice che fornisce il plugin e la composizione funziona. Solo perché usare una statica in alcune situazioni è una cattiva pratica, non significa che non sia MEF. Inoltre, ho TypeMock, i membri statici sono testabili dell'unità. Allora, cosa stai cercando di dire qui? – Maslow

2

È possibile utilizzare [ImportingConstructor] e impostare la proprietà statica nel costruttore.

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

Basta non impostarlo su un campo statico.

Problemi correlati