Domänendienste

Domänendienste sind Windows Communication Foundation (WCF)-Dienste, die die Geschäftslogik einer WCF RIA Services-Anwendung kapseln. Ein Domänendienst macht einen Satz verwandter Vorgänge in Form einer Dienstschicht verfügbar. Wenn Sie einen Domänendienst definieren, geben Sie die über den Domänendienst ausführbaren Datenvorgänge an.

Wenn Sie einen Domänendienst entwerfen, betrachten Sie den Domänendienst als Satz verwandter Aufgaben, die voraussichtlich von Benutzern der Anwendung ausgeführt werden. In der Regel zählt dazu eine kleine Gruppe eng miteinander verknüpfter Entitäten. In einer Anwendung für Spesenabrechnungen werden z. B. Entitäten für Spesenabrechnungen, Positionen und Details verfügbar gemacht. Sie können dann Entitäten für Konten und Zahlungen in einen separaten Domänendienst einfügen.

Domänendienste und ihre Datenquellen

Die DomainService-Klasse ist die Basisklasse für alle Klassen, die als Domänendienste fungieren. Um einen Domänendienst zu erstellen, der an ein benutzerdefiniertes Datenobjekt gebunden wird, erstellen Sie eine Klasse, die sich direkt von DomainService ableitet. Wenn jedoch ein vorhandener Domänendienst entweder an ein ADO.NET-Entitätsmodell gebunden ist oder von diesem ein LINK zu einer SQL-Datenbank verfügbar gemacht wird, gibt es spezielle abstrakte Klassen, die sich von dem DomainService ableiten, den Sie stattdessen verwenden.

  • Um einen Domänendienst zu erstellen, der an ein ADO.NET-Entitätsmodell gebunden wird, erstellen Sie eine Klasse, die sich von LinqToEntitiesDomainService ableitet. RIA Services stellt die LinqToEntitiesDomainService-Klasse bereit.

  • Wenn Sie einen Domänendienst erstellen möchten, der LINQ to SQL-Klassen in der Anwendung verfügbar macht, erstellen Sie eine Klasse, die sich von LinqToSqlDomainService ableitet. Diese Klasse wird im RIA Services Toolkit bereitgestellt. Wenn Sie einen Domänendienst erstellen möchten, der mithilfe dieser Klasse LINQ to SQL-Klassen in der Anwendung verfügbar macht, müssen Sie das RIA Services -Toolkit herunterladen.

Wenn Sie das Dialogfeld Neue DomainService-Klasse hinzufügen verwenden, um einen Domänendienst zu erstellen, basiert der Domänendienstetyp, der erstellt wird, auf den verfügbar gemachten Entitäten.

Eine Domänendienstklasse muss mit dem EnableClientAccessAttribute-Attribut markiert werden, um den Dienst für das Clientprojekt verfügbar zu machen. Wenn Sie im Dialogfeld Neue DomainService-Klasse hinzufügen das Kontrollkästchen Clientzugriff aktivieren aktivieren, wird das EnableClientAccessAttribute-Attribut automatisch auf einen Domänendienst angewendet. Wenn das EnableClientAccessAttribute-Attribut für einen Domänendienst übernommen wird, generiert RIA Services die entsprechenden Klassen für das Clientprojekt. Wenn Sie z. B. das EnableClientAccessAttribute-Attribut auf einen Domänendienst mit der Bezeichnung HRService anwenden, der eine Entität namens Employee verfügbar macht, generiert RIA Services einen Domänenkontext mit der Bezeichnung HRContext im Clientprojekt und eine Clientversion der Employee-Entität.

WCF-Dienste und Domänendienste

Als Windows Communication Foundation (WCF)-Dienst basiert der Domänendienst auf WCF-Konzepten. Für den Domänendienst wird Folgendes beibehalten:

  • Standardverwendung der WCF-Dienste

  • Vorhandene WCF-Programmiermodellkonstrukte, z. B. Vorgangsverträge, Vorgangsverhaltensweisen und Dienstverhaltensweisen

  • Standardmäßige WCF-Anpassungsfunktionen, z. B. Bindungskonfiguration, Verhaltenskonfiguration und Verwaltungsinfrastruktur

Der Domänenkontext kommuniziert mit dem RIA Services -Domänendienst, indem er mit WCF ChannelFactory einen Channel erstellt und ihn als Dienstvertrag übergibt, der mit dem Domänendienst generiert wurde.

Standardmäßig wird nur der binäre Endpunkt für Domänendienste aktiviert. Für die Verwendung des binären Endpunkts ist keine zusätzliche Konfiguration erforderlich. Wenn Sie einen anderen Endpunkt (z. B. OData, JSON, SOAP oder einen benutzerdefinierten Host) verwenden möchten, müssen Sie eine Endpunktfactory in der Datei "Web.config" registrieren (siehe unten).

<configSections>
  <sectionGroup name="system.serviceModel">
    <section name="domainServices" type="System.ServiceModel.DomainServices.Hosting.DomainServicesSection, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" allowDefinition="MachineToApplication" requirePermission="false" />
  </sectionGroup>
</configSections>

<system.serviceModel>
  <domainServices>
    <endpoints>
      <add name="json" type="Microsoft.ServiceModel.DomainService.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainService.Hosting" />
    </endpoints>
  </domainServices>
<system.serviceModel>

Der System.ServiceModel.DomainServices.Hosting-Namespace enthält die Endpunkte, die in RIA Services unterstützt werden. Der Microsoft.ServiceModel.DomainServices.Hosting-Namespace enthält die Endpunkte, die mit dem RIA Services -Toolkit unterstützt werden, z. B. die JsonEndpointFactory aus dem vorherigen Beispiel. Um einen benutzerdefinierten Endpunkt zu erstellen, müssen Sie eine Klasse erstellen, die sich von der DomainServiceEndpointFactory-Klasse ableitet, und die CreateEndpoints-Methode überschreiben.

Datenvorgänge

Sie fügen einem Domänendienst, der den Datenvorgang ausführt, den Sie verfügbar machen möchten, Methoden hinzu. Sie können z. B. Methoden hinzufügen, von denen die folgenden Vorgänge ausgeführt werden:

  • Query

  • Update

  • Insert

  • Delete

Sie können u. a. auch die folgenden komplizierteren Vorgänge hinzufügen:

  • Invoke: zur Implementierung von Vorgängen, die ohne Nachverfolgung oder verzögerte Ausführung ausgeführt werden müssen. Diese Methode wird nur mit nicht entitätsbezogenen Daten und nur dann verwendet, wenn stattdessen keine Abfrage-, Update-, Einfüge- oder Löschvorgänge verwendet werden können.

  • Named Update: zur Implementierung von benutzerdefinierten Vorgängen, bei denen es sich nicht um einfache Änderungsvorgänge handelt.

Wenn Sie einen Domänendienst verfügbar machen, wird im Domänenkontext ein EntitySet-Objekt mit Eigenschaften generiert, die angeben, welche Vorgänge (Einfügen, Aktualisieren oder Löschen) vom Client gestattet werden. Sie führen Datenänderungen aus, indem Sie die Entitätsauflistung ändern und anschließend die SubmitChanges-Methode aufrufen.

In fast allen Szenarien sollten Sie zum Laden von Daten statt Startvorgängen Abfragevorgänge verwenden. Abfragemethoden geben entweder ein einzelnes Entity-Objekt, ein IQueryable<Entity>-Objekt oder ein IEnumerable<Entity>-Objekt zurück. Abfragemethoden sind ein wesentlicher Bestandteil des Datenmusters, das von DomainService auf der mittleren Ebene und von DomainContext auf dem Client unterstützt wird. Das RIA Services -Framework generiert Entitäten im Clientprojekt nur für die Entitäten, die von Abfragemethoden in einem DomainService zurückgegeben werden.

Startvorgänge stellen einen Out-of-Band-Mechanismus für die Rückgabe von nicht entitätsbezogenen Daten und die Ausführung von Vorgängen mit Nebeneffekten bereit. Weitere Informationen zu Nebenwirkungen finden Sie in der HasSideEffects-Eigenschaft. Startvorgänge sind normalerweise nicht für Abfragemethoden geeignet. Selbst wenn ein Startvorgang eine Entität zurückgibt, wird die Entität nur dann für das Clientprojekt generiert, wenn sie von einer Abfragemethode zurückgegeben wird.

Konventionen

Wenn Sie Methoden hinzufügen, um diese Vorgänge auszuführen, muss die Methode der erwarteten Signatur für diesen Vorgang entsprechen. Neben einer Übereinstimmung mit der Signatur muss die Methode auch ein Namenspräfix einschließen, das der Benennungskonvention für diesen Datenvorgang entspricht. Wenn der Name der Methode nicht mit dem erwarteten Präfix beginnt, müssen Sie das entsprechende Attribut für diesen Vorgang übernehmen. Das Attribut ist optional, wenn der Name des Vorgangs mit der Benennungskonvention übereinstimmt. Die Verwendung der Benennungskonvention ermöglicht eine konsistentere Erfahrung für Entwickler.

Sie können keine Methoden überladen, bei denen es sich um Domänenvorgänge handelt. Sie müssen einen eindeutigen Namen für jede Methode angeben, die vom Clientprojekt aufgerufen werden kann. Alle Methoden, die Domänendienstvorgänge darstellen, müssen öffentlich sein. Die Methoden müssen serialisierbare Typen für Parameter und Rückgabetypen verwenden.

Sie können verhindern, dass eine Methode verfügbar gemacht wird, indem Sie das IgnoreAttribute-Attribut der Methode hinzufügen.

Die Datenvorgangssignaturen werden in den folgenden Tabellen bereitgestellt.

Abfrage

Eine Abfragemethode muss eine einzelne Instanz einer Entität oder ein Element vom Typ IEnumerable oder IQueryable zurückgeben, wobei T ein gültiger Entitätstyp ist. Da überladene Methoden nicht zulässig sind, müssen Sie einen eindeutigen Namen für jede Methode bereitstellen, die andere Eingabeparameter akzeptiert (z. B. GetEmployees() und GetEmployeesByLastName(string lastname)).

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen Abfragevorgang aufgeführt.

Rückgabewert

IEnumerable<T>, IQueryable<T> oder Entität

Parameter

Beliebige Anzahl von Parametern

Namenspräfix

Beliebiger Name

Attribut

[Query] (C#)

-oder-

<Query()> (Visual Basic)

Weitere Informationen finden Sie unter QueryAttribute.

Beispiel

public IQueryable<Product> GetProducts() (C#)

-oder-

Public Function GetProducts() As IQueryable(Of Product) (Visual Basic)

Aktualisieren

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen Aktualisierungsvorgang aufgeführt.

Rückgabewert

Keiner

Parameter

Entität

Namenspräfix

Update, Change oder Modify

Attribut

[Update] (C#)

-oder-

<Update()> (Visual Basic)

Weitere Informationen finden Sie unter UpdateAttribute.

Beispiel

public void UpdateProduct(Product product) (C#)

-oder-

Public Sub UpdateProduct(ByVal product As Product) (Visual Basic)

Einfügen

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen Einfügevorgang aufgeführt.

Rückgabewert

Keiner

Parameter

Entität

Namenspräfix

Insert, Add oder Create

Attribut

[Insert] (C#)

-oder-

<Insert()> (Visual Basic)

Weitere Informationen finden Sie unter InsertAttribute.

Beispiel

public void InsertProduct(Product product) (C#)

-oder-

Public Sub InsertProduct(ByVal product As Product) (Visual Basic)

Löschen

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen Löschvorgang aufgeführt.

Rückgabewert

Keiner

Parameter

Entität

Namenspräfix

Delete oder Remove

Attribut

[Delete] (C#)

-oder-

<Delete()> (Visual Basic)

Weitere Informationen finden Sie unter DeleteAttribute.

Beispiel

public void DeleteProduct(Product product) (C#)

-oder-

Public Sub DeleteProduct(ByVal product As Product) (Visual Basic)

Invoke

Startvorgänge stellen einen Out-of-Band-Mechanismus für die Rückgabe von nicht entitätsbezogenen Daten und die Ausführung von Vorgängen mit Nebeneffekten bereit. Weitere Informationen zu Nebenwirkungen finden Sie in der HasSideEffects-Eigenschaft. Startvorgänge sind normalerweise nicht für Abfragemethoden geeignet.

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen Startvorgang aufgeführt.

Rückgabewert

Beliebig

Parameter

Beliebige Anzahl von Parametern

Namenspräfix

Beliebig

Attribut

[Invoke] (C#)

-oder-

<Invoke> (Visual Basic)

Weitere Informationen finden Sie unter InvokeAttribute.

Beispiel

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

-oder-

<Invoke> _

Public GetCompetitorsPrice(ByVal product As Product) As Decimal (Visual Basic)

Benanntes Update

In der folgenden Tabelle sind die erwarteten Signaturwerte für einen benannten Updatevorgang aufgeführt.

Rückgabewert

Keiner

Parameter

Entität

Eine beliebige Anzahl anderer Parameter

Namenspräfix

Ein beliebiger Name, der nicht mit einem der Präfixe für Insert, Update oder Delete beginnt

Attribut

[Update(UsingCustomMethod=true] (C#)

-oder-

<Update(UsingCustomMethod:=True)> (Visual Basic)

Weitere Informationen finden Sie unter UpdateAttribute.

Beispiel

[Update(UsingCustomMethod=true]

public void DiscountProduct(Product product, int percentage) (C#)

-oder-

<Update(UsingCustomMethod:=True)> _

Public Sub DiscountProduct(ByVal product As Product, ByVal percentage As Integer) (Visual Basic)

Hinzufügen von Anwendungslogik zu einem Domänendienst

Sie können der Domänendienstklasse die erforderliche Anwendungslogik hinzufügen, nachdem Sie den verfügbar gemachten Datenvorgang definiert haben. Der vom Assistenten generierte Code ist lediglich dafür vorgesehen, Sie anfangs beim Schreiben von Anwendungslogik zu unterstützen. Sie können die Logik direkt den Vorgangsmethoden oder Methoden hinzufügen, die von den Vorgangsmethoden aufgerufen werden. Sie können vorhandenen Methoden Parameter hinzufügen, die Implementierung von Methoden anpassen oder neue Methoden hinzufügen, um die für die Anwendung erforderliche Funktionalität bereitzustellen. Weitere Informationen zum Implementieren von Geschäftslogik finden Sie unter Gewusst wie: Hinzufügen der Geschäftslogik zum Domänendienst.

Wenn Sie einen Domänendienst implementieren, berücksichtigen Sie auf jeden Fall die Sicherheitsrisiken, die mit dem Verfügbarmachen von Daten über einen Dienst verbunden sind. Weitere Informationen zur Sicherheit finden Sie unter Sicherheit für WCF RIA Services.

Siehe auch

Konzepte

DomainContext und Vorgänge
Sicherheit für WCF RIA Services