Servizi del dominio

I servizi del dominio sono servizi Windows Communication Foundation (WCF) che incapsulano la logica di business di un'applicazione WCF RIA Services. Un servizio del dominio espone un set di operazioni correlate sotto forma di livello di servizio. Quando si definisce un servizio del dominio, è necessario specificare le operazioni sui dati in esso consentite.

In caso di progettazione di un servizio del dominio, considerare tale servizio come un set di attività correlate di cui è prevista l'esecuzione da parte degli utenti all'interno dell'applicazione. In genere, tali attività consistono in un piccolo gruppo di entità strettamente correlate. Ad esempio, in un'applicazione di nota spese è possibile esporre entità per le note spese, per le voci e per i dettagli. È quindi possibile inserire entità per account e pagamenti in un servizio del dominio separato.

Servizi del dominio e relative origini dati

La classe DomainService è la classe base per tutte le classi che fungono da servizi del dominio. Per creare un servizio del dominio che si associ a un oggetto dati personalizzato, è necessario creare una classe che deriva direttamente da DomainService. Tuttavia, se si tratta di un servizio del dominio che si associa a ADO.NET Entity Model o che espone un collegamento a un database SQL, vengono utilizzate delle classi astratte speciali che derivano da DomainService.

  • Per creare un servizio del dominio che si associ a ADO.NET Entity Model, è necessario creare una classe che derivi da LinqToEntitiesDomainService. In RIA Services viene fornita la classe LinqToEntitiesDomainService.

  • Se si desidera creare un servizio del dominio che esponga classi LINQ to SQL nell'applicazione, è necessario creare una classe che derivi da LinqToSqlDomainService. Tale classe è fornita in RIA Services Toolkit. Se si desidera creare un servizio del dominio che esponga classi LINQ to SQL nell'applicazione utilizzando questa classe, è necessario scaricare il toolkit di RIA Services .

Quando si utilizza la finestra di dialogo Aggiungi una nuova classe DomainService per creare un servizio del dominio, il tipo di servizio del dominio creato dipende dalle entità esposte.

Una classe di servizi del dominio deve essere contrassegnata con l'attributo EnableClientAccessAttribute per rendere il servizio disponibile per il progetto client. L'attributo EnableClientAccessAttribute viene applicato automaticamente a un servizio del dominio quando si seleziona la casella di controllo Abilita l'accesso client nella finestra di dialogo Aggiungi una nuova classe DomainService. Quando l'attributo EnableClientAccessAttribute viene applicato a un servizio del dominio, in RIA Services vengono generate le classi corrispondenti per il progetto client. Ad esempio, quando si applica l'attributo EnableClientAccessAttribute a un servizio del dominio denominato HRService che espone un'entità denominata Employee, in RIA Services viene generato un contesto del dominio denominato HRContext nel progetto client e una versione client dell'entità Employee.

WCF e servizi del dominio

Come servizio Windows Communication Foundation (WCF), il servizio del dominio viene compilato in base ai concetti WCF. Nel servizio del dominio viene conservato quanto segue:

  • Utilizzo standard dei servizi WCF

  • Costrutti dei modelli di programmazione WCF esistenti, ad esempio contratti di operazione, comportamenti dell'operazione e comportamenti del servizio

  • Funzionalità di personalizzazione WCF standard, ad esempio configurazione di associazione, configurazione di comportamento e infrastruttura di gestione

Il contesto del dominio comunica con il servizio del dominio RIA Services tramite WCF ChannelFactory per creare un canale e passare a quest'ultimo un contratto di servizio generato dal servizio del dominio.

Per impostazione predefinita, solo l'endpoint binario è abilitato per i servizi del dominio. Per utilizzare l'endpoint binario non è necessaria alcuna configurazione aggiuntiva. Se si desidera utilizzare un altro endpoint (quale OData, JSON, SOAP o un host personalizzato) è necessario registrare una factory dell'endpoint nel file Web.config come illustrato di seguito:

<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>

Lo spazio dei nomi System.ServiceModel.DomainServices.Hosting contiene gli endpoint supportati in RIA Services . Lo spazio dei nomi Microsoft.ServiceModel.DomainServices.Hosting contiene gli endpoint supportati con il Toolkit RIA Services , ad esempio l'oggetto JsonEndpointFactory mostrato nell'esempio precedente. Per creare un endpoint personalizzato, è necessario creare una classe che derivi dalla classe DomainServiceEndpointFactory ed eseguire l'override del metodo CreateEndpoints.

Operazioni sui dati

Vengono aggiunti metodi a un servizio del dominio per eseguire l'operazione sui dati da esporre. È ad esempio possibile aggiungere metodi che eseguano le operazioni seguenti:

  • Query

  • Update

  • Insert

  • Delete

È inoltre possibile aggiungere operazioni più complesse, come le seguenti:

  • Invoke: per implementare operazioni che devono essere eseguite senza rilevamento o esecuzione posticipata. Utilizzare questa operazione solo con dati non di tipo entità e solo quando al suo posto non è possibile utilizzare operazioni di query, aggiornamento, inserimento o eliminazione.

  • Named Update: per implementare operazioni personalizzate che non rientrano nella categoria delle semplici operazioni di modifica.

Quando si espone un servizio del dominio, nel contesto del dominio viene generato un oggetto EntitySet con proprietà che indicano quali operazioni (inserimento, aggiornamento o eliminazione) sono consentite dal client. Vengono eseguite modifiche dei dati modificando la raccolta di entità, quindi chiamando il metodo SubmitChanges.

In quasi tutti gli scenari è consigliabile utilizzare operazioni di query anziché operazioni invoke per caricare i dati. I metodi di query restituiscono un singolo oggetto Entity, un oggetto IQueryable<Entity> o un oggetto IEnumerable<Entity>. I metodi di query formano parte integrante del modello di dati supportato da DomainService a livello intermedio e da DomainContext nel client. Tramite il framework RIA Services vengono generate entità nel progetto client solo per le entità restituite dai metodi di query in un oggetto DomainService.

Le operazioni invoke forniscono un meccanismo fuori banda per la restituzione di dati di tipo non entità e per l'esecuzione di operazioni con effetti collaterali. Per ulteriori informazioni sugli effetti collaterali, vedere la proprietà HasSideEffects. Le operazioni invoke non sono in genere adatte per i metodi di query. Anche quando un'operazione invoke restituisce un'entità, l'entità viene generata per il progetto client solo se viene restituita da un metodo di query.

Convenzioni

Quando si aggiungono metodi per l'esecuzione di queste operazioni, il metodo deve corrispondere alla firma prevista per quell'operazione. Oltre alla corrispondenza della firma, il metodo deve includere un prefisso del nome che corrisponda alla convenzione di denominazione per quell'operazione sui dati. Se il nome del metodo non inizia con il prefisso previsto, è necessario applicare l'attributo corrispondente per quell'operazione. L'attributo è facoltativo se il nome dell'operazione corrisponde alla convenzione di denominazione. L'utilizzo della convenzione di denominazione fornisce un'esperienza più coerente per gli sviluppatori.

Non è possibile eseguire l'overload di metodi che sono operazioni di dominio. È necessario specificare un nome univoco per ciascun metodo che può essere chiamato dal progetto client. Tutti i metodi che rappresentano operazioni del servizio del dominio devono essere pubblici. I metodi devono utilizzare tipi serializzabili per i parametri e i tipi restituiti.

È possibile evitare l'esposizione di un metodo aggiungendo l'attributo IgnoreAttribute al metodo.

Le firme dell'operazione sui dati sono riportate nelle tabelle seguenti.

Query

Un metodo di query deve restituire una sola istanza di un'entità o un oggetto IEnumerable o IQueryable dove T è un tipo di entità valido. Poiché non sono consentiti metodi di overload, è necessario fornire un nome univoco per ciascun metodo che ottenga parametri di input diversi (ad esempio GetEmployees() e GetEmployeesByLastName(string lastname).

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione query.

Valore restituito

IEnumerable<T>, IQueryable<T> o entità

Parametri

Qualsiasi numero di parametri

Prefisso del nome

Qualsiasi nome

Attributo

[Query] (C#)

oppure

<Query()> (Visual Basic)

Per ulteriori informazioni, vedere QueryAttribute.

Esempio

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

oppure

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

Update

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione update.

Valore restituito

Nessuno

Parametri

Entità

Prefisso del nome

Update, Change o Modify

Attributo

[Update] (C#)

oppure

<Update()> (Visual Basic)

Per ulteriori informazioni, vedere UpdateAttribute.

Esempio

public void UpdateProduct(Product product) (C#)

oppure

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

Insert

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione insert.

Valore restituito

Nessuno

Parametri

Entità

Prefisso del nome

Insert, Add o Create

Attributo

[Insert] (C#)

oppure

<Insert()> (Visual Basic)

Per ulteriori informazioni, vedere InsertAttribute.

Esempio

public void InsertProduct(Product product) (C#)

oppure

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

Delete

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione delete.

Valore restituito

Nessuno

Parametri

Entità

Prefisso del nome

Delete o Remove

Attributo

[Delete] (C#)

oppure

<Delete()> (Visual Basic)

Per ulteriori informazioni, vedere DeleteAttribute.

Esempio

public void DeleteProduct(Product product) (C#)

oppure

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

Invoke

Le operazioni invoke forniscono un meccanismo fuori banda per la restituzione di dati di tipo non entità e per l'esecuzione di operazioni con effetti collaterali. Per ulteriori informazioni sugli effetti collaterali, vedere la proprietà HasSideEffects. Le operazioni invoke non sono in genere adatte per i metodi di query.

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione invoke.

Valore restituito

Qualsiasi

Parametri

Qualsiasi numero di parametri

Prefisso del nome

Qualsiasi

Attributo

[Invoke] (C#)

oppure

<Invoke> (Visual Basic)

Per ulteriori informazioni, vedere InvokeAttribute.

Esempio

[Invoke]

public decimal GetCompetitorsPrice(Product product) (C#)

oppure

<Invoke> _

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

Named Update

Nella tabella seguente vengono elencati i valori di firma previsti per un'operazione di aggiornamento denominato (Named Update).

Valore restituito

Nessuno

Parametri

Entità

Qualsiasi numero di altri parametri

Prefisso del nome

Qualsiasi nome che non inizi con i prefissi per Insert, Update o Delete

Attributo

[Update(UsingCustomMethod=true] (C#)

oppure

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

Per ulteriori informazioni, vedere UpdateAttribute.

Esempio

[Update(UsingCustomMethod=true]

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

oppure

<Update(UsingCustomMethod:=True)> _

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

Aggiunta della logica dell'applicazione a un servizio del dominio

Dopo avere definito l'operazione sui dati esposti, è possibile aggiungere la logica dell'applicazione necessaria alla classe del servizio del dominio. Il codice generato dalla procedura guidata è concepito soltanto per assistere l'utente che deve iniziare a scrivere la logica dell'applicazione. È possibile aggiungere la logica direttamente nei metodi dell'operazione o ai metodi chiamati dai metodi dell'operazione. È inoltre possibile aggiungere parametri a metodi esistenti, personalizzare l'implementazione di metodi o aggiungere i nuovi metodi per fornire la funzionalità richiesta dall'applicazione. Per ulteriori informazioni sull'implementazione della logica di business, vedere Procedura: aggiungere la logica di business al servizio del dominio.

Quando si implementa un servizio del dominio, è necessario considerare attentamente i rischi per la sicurezza correlati all'esposizione dei dati tramite un servizio. Per ulteriori informazioni sulla sicurezza, vedere Sicurezza per WCF RIA Services.

Vedere anche

Concetti

DomainContext e operazioni
Sicurezza per WCF RIA Services