2009-06-25 5 views
2

Ich habe hoch gesucht und nach Beispielen über die Verwendung von MEF für DI suchen. Ich weiß, es ist nicht DI, aber von dem, was ich höre (wirklich in Podcasts zu hören) kann es als solches verwendet werden ... aber ich kann keine Blogposts oder Samples finden.Ressourcen und Beispiele für die Verwendung von MEF für DI/IoC

Ich benutze MEF in diesem Projekt bereits (Plugins zu unterstützen) und dachte, es wäre schön, für DI auch zu nutzen.

Vielleicht bell ich den falschen Baum?

Antwort

2

Dies kann durch ein Beispiel beschrieben werden. Nehmen wir an, Sie haben eine Kernbibliothek, auf der Sie alle Ihre maßgeschneiderten Anwendungen basieren. Nennen Sie es MyCompany.Core. Normalerweise muss jede Anwendung, die Sie schreiben, einen Verweis auf MyCompany.Core enthalten, und dann muss die Anwendung auf Bootstrapping aufpassen und in MyCompany.Core aufrufen, um die entsprechenden Dienste usw. in der richtigen Reihenfolge zu starten. Dies macht nicht viel Sinn machen, wenn man bedenkt, dass der Kern selbst wahrscheinlich besser weiß, wie es soll gestartet werden, usw.

MEF Zur Verwendung für Dependency Injection, Ihr Kern dies tun würde:

[Import("/Application", typeof(IBespokeApplication))] 
private IBespokeApplication bespokeApplication; 

der Kern selbst die Anwendung Startcode enthalten würde, und könnte etwa so nennen, wenn es auf alle seine Dienste begonnen hatte:

bespokeApplication.Start(); 

In der maßgeschneiderten Anwendung, müssen Sie sich selbst exportieren:

[Export("/Application", typeof(IBespokeApplication))] 
public class MyApplication : IBespokeApplication 
{ 
    public void Start() 
    { 
     /* start app */ 
    } 
} 

Jetzt könnte die maßgeschneiderte Anwendung einen direkten Verweis auf MyCompany.Core enthalten und könnte Dienste direkt aufrufen, oder Sie könnten sogar die Dienste als Exporte verfügbar machen und sie in die Anwendung importieren. Zum Beispiel im Kern:

[Export("/LoggingService", typeof(ILoggingService))] 
public class NLogLoggingService : ILoggingService 
{ 
    /* ... */ 
} 

Dann in der maßgeschneiderten Anwendung:

[Import("/LoggingService", typeof(ILoggingService))] 
private ILoggingService loggingService; 

... und, wenn Sie wollen, es zu benutzen:

loggingService.LogInformation("My Message"); 

Soweit ich kann erzählen Sie aus der Literatur, das ist die Essenz der Abhängigkeitsinjektion.

Verwandte Themen