Freigeben über


Objektmodell für den Kontext von Entwicklererweiterungen (Dynamics CRM 2015)

 

Veröffentlicht: November 2016

Gilt für: Dynamics CRM 2015

Entwicklererweiterungen für Microsoft Dynamics CRM 2015 stellen einen Satz voneinander abhängiger Klassen bereit, die den Aufwand minimieren, der für die Einrichtung und Ausführung nötig ist. Das Basisprogramm erfordert nur die Verbindungszeichenfolge (oder den Namen einer Verbindungszeichenfolge in app.config) und einem Datenkontext, der durch CrmSvcUtil.exe erstellt wurde, wie im folgenden Beispiel gezeigt:

var connection = CrmConnection.Parse("Url=http://crm.contoso.com/xrmContoso");

using (var context = new XrmServiceContext(connection))
{
var accounts = context.AccountSet;

foreach (var account in accounts)
Console.WriteLine(account.Name);
}

Unter der Haube gibt es verschachtelte Objekte, die Vorgänge der unteren Ebenen steuern. Der Datenkontext ist die Zusammensetzung all dieser Objekte; deshalb ist das Verhalten des Datenkontexts von den Objekten abhängig. Diese Abhängigkeiten können über die Verwendung bestimmter Konstruktoren verfügbar gemacht werden. Wenn sie erweitert wird, sieht die standardmäßige Objektzusammensetzung wie das folgende Beispiel aus:

var myConnection = CrmConnection.Parse("Url=http://crm.contoso.com/xrmContoso");
var myObjectCache = MemoryCache.Default;
var myServiceCache = new OrganizationServiceCache(myObjectCache, myConnection);
using (var myService = new CachedOrganizationService(myConnection, myServiceCache))
using (var myContext = new XrmServiceContext(myService))
{
}

Abhängigkeiten

In der folgenden Tabelle sind die verfügbaren Abhängigkeiten und ihr Verhalten aufgelistet.

Schnittstelle

Basisklasse

Standardtyp

Beschreibung

Konfigurationselement

CrmConnection

CrmConnection

Die Verbindungsdetails werden als Verbindungszeichenfolge angezeigt.

<connectionStrings>

ObjectCache

MemoryCache

Der Rohdatenencachedienst, der unabhängig von den anderen Komponenten des SDK ist.

<objectCache>

IOrganizationServiceCache

OrganizationServiceCache

OrganizationServiceCache

Ein weiterer Cachingdienst für abstrahierte Daten, der die Ergebnisse der IOrganizationService-Vorgänge zwischenspeichert. Richtet Cacheelementabhängigkeiten automatisch ein; die Ausführung von Aktualisierungsvorgängen macht abhängige Cacheelemente ungültig.

<serviceCache>

IOrganizationService

OrganizationService

CachedOrganizationService

Eine Wrapperklasse des IOrganizationService, die die Details der Einrichtung eines OrganizationServiceProxy oder beliebiger IOrganizationService-Objekten verwaltet. Wenn sie mit einem OrganizationServiceCache-Objekt paarweise auftritt, wird daraus ein zwischengespeicherter Service.

<services>

OrganizationServiceContext

Der OData- und LINQ-fähige Datenkontext. Muss speziell deklariert oder so konfiguriert, dass kein Standardtyp vorhanden ist.

<contexts>

IDiscoveryService:

DiscoveryService

Eine Wrapperklasse des IDiscoveryService, die die Details der Einrichtung eines DiscoveryServiceProxy oder beliebiger IDiscoveryService-Objekten verwaltet. Hierfür ist keine Zwischenspeicherimplementierungen vorhanden; kann somit nicht in app.config konfiguriert werden.

Eine Implementierung die Schnittstellen, wobei die verfügbaren Basisklassen geerbt werden, oder einfache Neuanordnung der Objektverschachtelung kann durchgeführt werden, um das endgültige Verhalten zu ändern. Beispielsweise besteht eine Möglichkeit, Zwischenspeicherfunktionen zu deaktivieren, darin, Cacheobjekte wegzulassen und die rohen Basisklassen zu verwenden.

var myConnection = CrmConnection.Parse("Url=http://crm.contoso.com/xrmContoso");
using (var myService = new OrganizationService(myConnection))
using (var myContext = new XrmServiceContext(myService))
{
}

Um die Abhängigkeit vom Code zu entfernen, der von CrmSvcUtil.exe generiert wurde, und stattdessen dynamischen Code zu verwenden, können Sie die CrmOrganizationServiceContext-Klasse verwenden. Ein anderes Szenario wäre, den Datenkontext ganz wegzulassen und den IOrganizationService nur direkt aufzurufen. Dies ist auch der Ansatz für den Aufruf von IDiscoveryService.

var myConnection = CrmConnection.Parse("Url=http://crm.contoso.com/xrmContoso");
using (var myContext = new CrmOrganizationServiceContext(myConnection))
{
}
using (var myService = new OrganizationService(myConnection))
{
var response = myService.Execute(new WhoAmIRequest()));
}
var discoveryConnection = CrmConnection.Parse("Url=http://crm.contoso.com");
using (var myDiscoveryService = new DiscoveryService(discoveryConnection))
{
var response = myDiscoveryService.Execute(new RetrieveOrganizationsRequest()));
}

Kontexterweiterungen

Der bedeutendste Unterschied zwischen CrmOrganizationServiceContext, was die direkte Basisklasse von XrmServiceContext, von Entwicklererweiterungen für Microsoft Dynamics 365 und den Basis- OrganizationServiceContext im Kern-SDK darstellt, ist die Implementierung von IUpdatable- und IExpandProvider-Schnittstellen. Diese benutzerdefinierte Implementierung ermöglicht dem generierten Datenkontext und den Entitätsobjekten, die von dem Datenkontext erstellt wurden, am WCF-Datendienste-Framework teilzunehmen. Um dem Datenkontext als OData-Endpunkt zu dienen, muss ein neuer WCF-Datendienst-Endpunkt (.svc) einer vorhandenen Webanwendung hinzugefügt werden.

<%@ ServiceHost Language="C#" Factory="System.Data.Services.DataServiceHostFactory, System.Data.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" Service="MySite.MyContext" %>

Hier ist ein Beispiel für ein Dienstendpunkt-Code-Behind (.svc.cs), das für die Entwicklung verwendet werden kann. Geben Sie XrmServiceContext als generischen Typparameter der DataService<T>-Klasse an.

using System.Data.Services;
using System.Data.Services.Common;
using System.ServiceModel;
using Xrm;

namespace MySite
{
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyContext : DataService<XrmServiceContext>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
// Set rules to indicate which entity sets and service operations are visible, updatable, etc.
config.UseVerboseErrors = true;
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
}

Siehe auch

Entwicklererweiterungen für Microsoft Dynamics CRM 2015
Den Kontext der Konfigurationsdatei konfigurieren (Dynamics CRM 2015)
Zugreifen auf Entitätsbeziehungen (Dynamics CRM 2015)
Anhängen von Entitäten an den Kontext (Dynamics CRM 2015)
Exemplarische Vorgehensweisen zu Portalen für Dynamics CRM 2015

© 2017 Microsoft. Alle Rechte vorbehalten. Copyright