(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Übersicht über das auf Konventionen basierende Programmiermodell

.NET Framework 4.5

Ab .NET Framework 4.5 unterstützt MEF neben dem standardmäßigen Modell der attributierten Programmierung auch ein auf Konventionen basierendes Programmiermodell. In diesem Artikel wird beschrieben, wie Sie mit dem auf Konventionen basierenden Programmiermodell MEF-Anwendungen erstellen.

Im Managed Extensibility Framework (MEF) ist ein Programmiermodell eine Methode zum Definieren des Satzes der konzeptionellen Objekte, mit denen MEF ausgeführt wird. Zu den konzeptionellen Objekten zählen Teile, Importe und Exporte. MEF verwendet diese Objekte, gibt jedoch nicht an, wie sie dargestellt werden sollen. Daher ist eine Vielzahl von Programmiermodellen möglich, einschließlich benutzerdefinierter Programmiermodelle.

Hinweis Hinweis

Dieser Artikel setzt voraus, dass Sie mit grundlegenden MEF-Konzepten wie Importen, Exporten, Katalogen und Kompositionscontainern vertraut sind. Wenn Sie zum ersten Mal mit MEF arbeiten, sollten Sie sich zunächst mit der MEF-Übersicht und der Übersicht über das Modell der attributierten Programmierung vertraut machen.

Für viele Anwendungen, insbesondere solche, die so entworfen wurden, dass Erweiterungen möglich sind, bietet das attributbasierte Programmiermodell eine gute Lösung für das explizite Angeben von Importen und Exporten und deren Eigenschaften. MEF kann jedoch auch verwendet werden, um eine lose Kopplung zwischen Komponenten in einer einzelnen Anwendung bereitzustellen. In diesem Kontext, insbesondere in einer großen Anwendung, kann es umständlich sein, Attribute explizit auf jeden Typ anzuwenden. Das auf Konventionen basierende Programmiermodell ermöglicht Ihnen, Konventionen (Regeln) zu erstellen, um die erforderlichen Attribute vom Typ eines Objekts oder den anderen Qualitäten des Objekts abzuleiten.

Angenommen, Sie verwenden den folgenden Typ mit dem Modell der attributierten Programmierung:


    [Export()]
    public class HomeController :  Controller
    {
        // Class contents.
    }

Der Anwendungs-Designer möchte vielleicht eine große Anzahl dieser Controller exportieren. Im Modell der attributierten Programmierung müssten Sie das Export-Attribut auf jede Unterklasse anwenden. Mit dem auf Konventionen basierenden Programmiermodell können Sie eine einzelne Regel erstellen, die angibt, dass Unterklassen der Controller-Klasse exportiert werden sollen. Dies wirkt sich automatisch auf alle neuen Unterklassen aus, die der Anwendung hinzugefügt werden. Außerdem müssen alle Änderungen oder Erweiterungen, die bei der weiteren Entwicklung für die Regel erforderlich werden, nur an einer Stelle eingegeben werden.

Bei Verwendung des auf Konventionen basierenden Programmiermodells ist die RegistrationBuilder-Klasse das primäre Tool. Ein RegistrationBuilder-Objekt ermöglicht es Ihnen, Regeln zu erstellen, die angeben, welche Typen als Teile behandelt werden sollen. Es gibt PartBuilder-Objekte zurück, mit denen Sie konfigurieren können, wie diese Typen behandelt werden sollen.

Zum Erstellen einer Regel können Sie eine von drei RegistrationBuilder-Methoden verwenden:

  • Die ForType-Methode erstellt eine Regel, die für einen einzelnen Typ gilt.

  • Wie im Controller-Beispiel im vorherigen Abschnitt gezeigt, erstellt die ForTypesDerivedFrom-Methode eine Regel, die für alle Typen gilt, welche von einem angegebenen Typ abgeleitet werden, jedoch nicht für den Typ selbst. Der angegebene Typ kann auch eine Schnittstelle sein. In diesem Fall gilt die Regel für alle implementierenden Typen.

  • Die ForTypesMatching-Methode bietet maximale Flexibilität. Sie erstellt eine Regel, die für jeden Typ gilt, der dem angegebenen Prädikat entspricht.

Für alle drei Methoden gibt es auch generische Varianten, die PartBuilder<T>-Objekte bereitstellen, deren Hilfsmethoden eine vereinfachte Syntax bereitstellen, um auf einen bekannten Typ zu verweisen.

Wenn Sie beispielsweise eine Regel erstellen möchten, die für alle Unterklassen von Controller gilt, sollten Sie den folgenden Code verwenden:

    // RB is the RegistrationBuilder object
    PartBuilder PB = RB.ForTypesDerivedFrom(typeof(Controller));

Hh925579.collapse_all(de-de,VS.110).gifKonfigurieren von Exporten

Sie können das von RegistrationBuilder erhaltene PartBuilder-Objekt verwenden, um die Importe und Exporte des entsprechenden Teils bzw. mehrere entsprechender Teile zu konfigurieren. Im folgenden Code werden mehrere Möglichkeiten zum Exportieren des Typs gezeigt:

// A simple export.
PB.Export();
// Export as a superclass, in this case Controller.
PB.Export<Controller>();
// Export as a controller with additional metadata.
PB.Export<Controller>(x => x.AddMetadata("Name", "Main"))

Wenn Sie eine bestimmte Eigenschaft bzw. mehrere Eigenschaften der ausgewählten Typen exportieren möchten, können Sie folgendermaßen ein Prädikat verwenden, das den erforderlichen Eigenschaften entspricht:

// Export all properties whose names contain the word "People"
PB.ExportProperties(pi => pi.Name.Contains("People"));

Konfigurationen sind additiv, sodass ein PartBuilder-Element mehrere Konfigurationen anwenden kann. Darüber hinaus kann ein Typ mehr als einer Regel entsprechen. Wenn dies der Fall ist, werden alle entsprechenden Regeln angewendet. Wenn eine Regel beispielsweise angibt, dass alle Untertypen von Controller als Controller exportiert werden sollen, und eine andere Regel angibt, dass ein bestimmter Untertyp zusätzliche Metadaten abrufen soll, werden beide Regeln auf diesen Untertyp angewendet.

Hh925579.collapse_all(de-de,VS.110).gifKonfigurieren von Importen und importierenden Konstruktoren

Eigenschaftimporte können auf die gleiche Weise wie Exporte konfiguriert werden. MEF verfügt auch über das Konzept von importierenden Konstruktoren. Hierbei handelt es sich um die Konstruktoren, mit denen das Kompositionsmodul Objekte zum Ausfüllen übereinstimmender Importe erstellt. Standardmäßig wird der Konstruktor verwendet, der über die meisten Parameter verfügt. Mit der SelectConstructor-Methode können Sie jedoch auch ein PartBuilder-Element mit einem bestimmten importierenden Konstruktor manuell konfigurieren:

// Select the constructor with the fewest parameters as the importing constructor.
PB.SelectConstructor(ctors =>ctors.Min(ctor => ctor.GetParameters().Length));

Hh925579.collapse_all(de-de,VS.110).gifKonfigurieren einer Richtlinie für die Erstellung von Teilen und Konfigurieren von Metadaten

Standardmäßig verfügen die Teile, die von einem RegistrationBuilder-Objekt erstellt werden, die Any Erstellungsrichtlinieneinstellung. Sie können diese Einstellung überschreiben, indem Sie ein SetCreationPolicy-Objekt verwenden, wie im folgenden Beispiel gezeigt:

// Set the part to use the NonShared creation policy.
PB.SetCreationPolicy(CreationPolicy.NonShared);

Ebenso können Sie PartBuilder folgendermaßen verwenden, um der Komponente Metadaten hinzuzufügen:

// Add company name information as metadata.
PB.AddMetadata("Name", "MyCompanyName");

Hh925579.collapse_all(de-de,VS.110).gifAusnahmen und Konflikte

Manchmal ist es notwendig, einmalige Ausnahmen oder Sonderfälle für eine Regel zu erstellen. Dies erfordert jedoch keine Änderungen am Code oder der Regel selbst. Stattdessen überschreiben die Attribute, die auf den Quellcode angewendet werden, die Regeln, die diesen Aspekt des Teils ändern.

Angenommen, Sie haben eine Regel erstellt, mit der alle Unterklassen der Controller-Klasse unter dem Typ IController exportiert werden. Sie möchten jedoch eine neue Unterklasse von Controller, PrimaryController, als dessen eigenen Typ exportieren. Sie können das Export-Attribut auf PrimaryController anwenden, um die Regel zu überschreiben und das gewünschte Verhalten zu erzeugen.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft