2010-03-31 19 views
5

Ich arbeite gerade mit MEF, aber die Antwort, die ich suche, ist wahrscheinlich für MEF irrelevant - es ist alles Abhängigkeitsinjektion - ich benutze nur die MEF-Terminologie als ein Beispiel hier.Wie Exportieren und Importieren von Anwendungsdiensten mit sagen MEF?

Kurze Hintergrundgeschichte, las ich diesen Artikel zu MSDN über mit Fokus auf Composite Applications

In dieser Figur gibt es drei Dinge, die Shell, die Anwendungsdienste und die Module. Das ist also eine zusammengesetzte Anwendung.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

Was ich nicht vollständig erhalten, ist der Anwendungsdienst teil. Wie sieht der Service aus, wie sieht er aus? Wie stellen Sie einen Service über ein Modul bereit und wie verbrauchen Sie einen Service von einem anderen Modul?

Ich würde wirklich gerne ein paar nette kleine Codebeispiele sehen, nichts Besonderes, aber etwas, um zu veranschaulichen, wie all das zum Leben erwacht (der Teil der Anwendungsdienste).

+5

Meine Augen, MEINE AUGEN! –

+0

Ja, die Auswahl der Farben in diesem Bild ist schrecklich ... –

Antwort

3

Anwendungsdienste, soweit MEF betroffen ist, sind nur ein weiteres zusammensetzbares Teil. Jede Schnittstelle oder Klasse, die Sie erstellen können, kann sich wie ein Dienst verhalten.

Jeder Dienst hat eine Schnittstelle oder Basisklasse, die Sie implementieren möchten. Sie können diese massenweise über eine Art von IService Schnittstelle (und verwenden Sie [ImportMany], um sie alle zu importieren), aber oft möchten Sie verschiedene Service-Typen.

Sie würden dies dann nach Bedarf in Ihre Klassen importieren. Zum Beispiel, sagen Sie eine gemeinsame Schnittstellenbibliothek für Dienstleistungen haben, und Sie bieten:

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

Sie können dann einen separaten Bibliothek Export bestimmte Typen haben:

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

Ihr Hauptprogramm wäre dann in der Lage sein, Importieren Sie dies nach Bedarf und schreiben Sie Code dagegen. Angenommen, Sie möchten Kunden anzeigen, müssen Sie die Kunden von Ihrer Datenebene laden. Wenn Sie über das Repository laden möchten, können Sie das Repository in einen bestimmten Teil Ihrer Anwendung importieren:

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

Sie würden dann dieser Dienst direkt in Ihre Anwendung zusammengesetzt bekommen.

Dies wird als "Anwendungsdienst" angesehen, da es sich um eine anwendungsspezifische Implementierung eines generischen Dienstes handelt - es handelt sich nicht um eine sichtbezogene Komponente und kann in Ihrer gesamten Anwendung verwendet werden.

+0

Wenn mehr als 1 Anwendung Service den Import erfüllt, wie würden Sie zwischen den beiden unterscheiden? Metadaten? oder gibt es einen besseren Weg? oder ist das einfach falsch?Ich weiß, MEF löst eine Ausnahme, wenn dies passiert, also möchte ich wirklich nur 1 Schnittstelle und 1 konkrete Implementierung? –

+0

@John: Sie müssen [ImportMany] verwenden und dann entweder den Dienst abfragen oder Metadaten verwenden, um zu bestimmen, welche verwendet werden sollen. Andernfalls erhalten Sie eine Ausnahme. –

+0

@John: Wenn mehrere Dienste die gleiche Importschnittstelle/-klasse verwenden, dann verwenden Sie [ImportMany] und importieren in ein IEnumerable

0

Deklarieren Sie Schnittstelle für Service und exportieren Sie Klasse, die diese Schnittstelle implementiert. Zum Beispiel haben Sie möglicherweise IPersonBuilder, in gemeinsamen Assembly deklariert. Sie sind Hauptmodul hat MyPersonBuilder Implementierungsschnittstelle und exportieren Sie dies. Alle Ansichten verwendet Importe IPersonBuilder, um Methode darauf aufzurufen, und mit MEF Zusammensetzung können sie sagen CreatePerson() auf Ihrem MyPersonBuilder von Ihrem Hauptmodul.

Verwandte Themen