Procedura dettagliata: creazione di un'applicazione dati a più livelli
Aggiornamento: novembre 2007
Le applicazioni dati a più livelli sono applicazioni con accesso ai dati separate in più livelli logici. La separazione dei componenti dell'applicazione in questi livelli discreti aumenta la gestibilità e la scalabilità dell'applicazione, mediante l'impiego di nuove tecnologie che possono essere applicate a un singolo livello senza la necessità di dovere riprogettare l'intera soluzione. L'architettura a più livelli include un livello di presentazione, un livello intermedio e un livello dati. Il livello intermedio di norma include un livello di accesso ai dati, un livello di logica di business e i componenti condivisi, ad esempio l'autenticazione e la convalida. Il livello dati include un database relazionale. Le applicazioni a più livelli di solito archiviano le informazioni riservate nel livello di accesso ai dati del livello intermedio per conservare l'isolamento dagli utenti finali che accedono al livello di presentazione. Per ulteriori informazioni, vedere Cenni preliminari sull'applicazione dati a più livelli.
Per separare i vari livelli in un'applicazione a più livelli, è possibile creare progetti discreti per ogni livello che si desidera includere nell'applicazione. I dataset tipizzati contengono una proprietà DataSet Project che determina in quali progetti deve essere inserito il codice generato del TableAdapter e del dataset.
In questa procedura dettagliata viene illustrato come separare il codice del TableAdapter e del dataset in progetti libreria di classi discreti utilizzando Progettazione DataSet. Una volta separato il codice del TableAdapter e del dataset, si creerà un servizio Servizi Windows Communication Foundation e ADO.NET Data Services per effettuare le chiamate nel livello di accesso ai dati. Infine, si creerà un'applicazione Windows Form come livello di presentazione, ossia il livello che accede ai dati dal servizio dati.
In particolare, verranno illustrate le seguenti attività:
Creare una nuova soluzione a più livelli per contenere più progetti.
Aggiungere due progetti libreria di classi alla soluzione a più livelli.
Creare un dataset tipizzato mediante la Configurazione guidata origine dati.
Separare il codice generato dei dataset e dei TableAdapter in progetti discreti.
Creare un servizio Windows Communication Foundation (WCF) per effettuare chiamate nel livello di accesso ai dati.
Creare funzioni nel servizio per recuperare i dati dal livello di accesso ai dati.
Creare un'applicazione Windows Form come livello di presentazione.
Creare i controlli Windows Form associati all'origine dati.
Scrivere il codice per popolare le tabelle dati.
Per una dimostrazione video, vedere la procedura video per creare un'applicazione dati a più livelli (informazioni in lingua inglese).
Prerequisiti
Per completare questa procedura dettagliata, sono necessari gli elementi riportati di seguito:
- Accesso al database di esempio Northwind. Per ulteriori informazioni, vedere Procedura: installare database di esempio.
Creazione della soluzione a più livelli e della libreria di classi per contenere il dataset (DataEntityTier)
Il primo passaggio di questa procedura dettagliata prevede la creazione di una soluzione e due progetti libreria di classi. La prima libreria di classi conterrà il dataset (la classe DataSet tipizzata e le DataTable generate che conterranno i dati dell'applicazione). Il progetto viene usato come livello di entità di dati dell'applicazione e di norma si trova nel livello intermedio. È possibile utilizzare Progettazione DataSet per creare il dataset iniziale e separare automaticamente il codice in due librerie di classi.
Nota: |
---|
Assicurarsi di assegnare al progetto e alla soluzione il nome corretto prima di fare clic su OK. In tal modo sarà più semplice completare questa procedura dettagliata. |
Per creare la soluzione a più livelli e la libreria di classi DataEntityTier
Scegliere il comando per la creazione di un nuovo progetto dal menu File.
Nota: Progettazione DataSet è supportato nei progetti Visual Basic e C#. Creare il nuovo progetto in uno di questi linguaggi.
Nella finestra di dialogo Nuovo progetto selezionare Windows nel riquadro Tipi progetto.
Fare clic sul modello Libreria di classi.
Specificare DataEntityTier come nome del progetto.
Specificare NTierWalkthrough come nome della soluzione.
Scegliere OK.
Viene creata una soluzione NTierWalkthrough contenente il progetto DataEntityTier che viene aggiunta a Esplora soluzioni.
Creazione della libreria di classi per contenere i TableAdapter (DataAccessTier)
Il passaggio successivo alla creazione del progetto DataEntityTier consiste nella creazione di un altro progetto libreria di classi. Questo progetto, che conterrà i TableAdapter generati, è definito come il livello di accesso ai dati dell'applicazione. Tale livello contiene le informazioni richieste per la connessione al database e di norma si trova nel livello intermedio.
Per creare la nuova libreria di classi per i TableAdapter
Dal menu File, aggiungere un nuovo progetto alla soluzione NTierWalkthrough.
Nel riquadro Modelli della finestra di dialogo Nuovo progetto fare clic su Libreria di classi.
Assegnare al progetto il nome DataAccessTier, quindi scegliere OK.
Il progetto DataAccessTier viene creato e aggiunto alla soluzione NTierWalkthrough.
Creazione del dataset
Il passaggio successivo consiste nella creazione del dataset tipizzato. I dataset tipizzati sono creati con la classe dataset (comprese le classi DataTable) e le classi TableAdapter, in un singolo progetto. Tutti le classi vengono generate in un unico file. Quando il dataset e i TableAdapter vengono separati in progetti diversi, è la classe dataset che viene spostata nell'altro progetto, lasciando le classi TableAdapter nel progetto originale. Di conseguenza, creare il dataset nel progetto che alla fine conterrà i TableAdapter (il progetto DataAccessTier). Il dataset verrà creato mediante la Configurazione guidata origine dati.
Nota: |
---|
Per creare la connessione è necessario disporre dell'accesso al database di esempio Northwind. Per informazioni sulla configurazione del database di esempio Northwind, vedere Procedura: installare database di esempio. |
Per creare il dataset
Fare clic su DataAccessTier in Esplora soluzioni.
Scegliere Mostra origini dati dal menu Dati.
Nella finestra Origini dati fare clic su Aggiungi nuova origine dati per avviare la Configurazione guidata origine dati.
Nella pagina Seleziona un tipo di origine dati fare clic su Database e quindi su Avanti.
Nella pagina Seleziona connessione dati effettuare una delle seguenti operazioni:
Selezionare la connessione dati al database di esempio Northwind nell'elenco a discesa, se presente.
-oppure-
Fare clic su Nuova connessione per aprire la finestra di dialogo Aggiungi connessione. Per ulteriori informazioni, vedere Finestra di dialogo Aggiungi/Modifica connessione (generale).
Se il database richiede una password, selezionare l'opzione che consente di includere dati riservati, quindi scegliere Avanti.
Nota: Se è stato selezionato un file di database locale al posto della connessione a SQL Server, è possibile che venga richiesto di aggiungere il file al progetto. Fare clic su Sì per aggiungere il file di database al progetto.
Scegliere Avanti nella pagina Salva stringa di connessione nel file di configurazione dell'applicazione.
Espandere il nodo Tabelle nella pagina Seleziona oggetti di database.
Selezionare le caselle di controllo per le tabelle Customers e Orders, quindi fare clic su Fine.
NorthwindDataSet viene aggiunto al progetto DataAccessTier e viene visualizzato nella finestra Origini dati.
Separazione dei TableAdapter dal dataset
Dopo avere creato il dataset, separare la classe dataset generata dai TableAdapter. A tale scopo, impostare la proprietà Progetto DataSet sul nome del progetto nel quale archiviare la classe dataset separata.
Per separare i TableAdapter dal dataset
Fare doppio clic su NorthwindDataSet.xsd in Esplora soluzioni per aprire il dataset in Progettazione DataSet.
Fare clic su un'area vuota della finestra di progettazione.
Individuare il nodo Progetto DataSet nella finestra Proprietà.
Nell'elenco Progetto DataSet, fare clic su DataEntityTier.
Scegliere Compila soluzione dal menu Compila.
Il dataset e i TableAdapter sono separati nei due progetti libreria di classi. Il progetto che originalmente conteneva tutto il dataset (DataAccessTier) ora contiene solo i TableAdapter. Il progetto definito nella proprietà Progetto DataSet (DataEntityTier) contiene il dataset tipizzato NorthwindDataSet.Dataset.Designer.vb or NorthwindDataSet.Dataset.Designer.cs.
Nota: |
---|
Quando si separano i dataset e i TableAdapter impostando la proprietà Progetto DataSet, le classi dataset parziali del progetto non vengono spostate automaticamente e quindi devono essere spostate manualmente nel progetto dataset. |
Creazione di una nuova applicazione di servizio
Dal momento che in questa procedura dettagliata viene spiegato come accedere al livello di accesso ai dati con un servizio WCF, creare una nuova applicazione del servizio WCF.
Per creare una nuova applicazione del servizio WCF
Dal menu File, aggiungere un nuovo progetto alla soluzione NTierWalkthrough.
Nella finestra di dialogo Nuovo progetto selezionare WCF nel riquadro Tipi progetto. Nel riquadro Modelli fare clic su Libreria Servizio WCF.
Assegnare al progetto il nome DataService, quindi scegliere OK.
Il progetto DataService viene creato e aggiunto alla soluzione NTierWalkthrough.
Creazione di metodi nel livello di accesso ai dati per restituire i dati dei clienti e degli ordini
Il servizio dati chiama due metodi nel livello di accesso ai dati: GetCustomers e GetOrders. Questi metodi restituiscono le tabelle Customers e Orders di Northwind. Creare i metodi GetCustomers e GetOrders nel progetto DataAccessTier.
Per creare un metodo nel livello di accesso ai dati per restituire la tabella Customers
Fare doppio su NorthwindDataset.xsd in Esplora soluzioni per aprire il dataset in Progettazione DataSet.
Fare clic con il pulsante destro del mouse su CustomersTableAdapter e selezionare Aggiungi query per aprire la Configurazione guidata query TableAdapter
Nella pagina Seleziona un tipo di comando lasciare il valore predefinito Usa istruzioni SQL, quindi fare clic su Avanti.
Nella pagina Scegli tipo di query lasciare il valore predefinito SELECT che restituisce righe, quindi scegliere Avanti.
Nella pagina Specifica un'istruzione SQL SELECT lasciare la query predefinita e scegliere Avanti.
Nella pagina Scegliere i metodi per generare digitare GetCustomers per il Nome metodo nella sezione Restituisci un DataTable.
Scegliere Fine.
Per creare un metodo nel livello di accesso ai dati per restituire la tabella Orders
Fare clic con il pulsante destro del mouse su OrdersTableAdapter e scegliere Aggiungi query.
Nella pagina Seleziona un tipo di comando lasciare il valore predefinito Usa istruzioni SQL, quindi fare clic su Avanti.
Nella pagina Scegli tipo di query lasciare il valore predefinito SELECT che restituisce righe, quindi scegliere Avanti.
Nella pagina Specifica un'istruzione SQL SELECT lasciare la query predefinita e scegliere Avanti.
Nella pagina Scegliere i metodi per generare digitare GetOrders per il Nome metodo nella sezione Restituisci un DataTable.
Scegliere Fine.
Scegliere Compila soluzione dal menu Compila.
Aggiunta di un riferimento ai livelli di entità di dati e di accesso ai dati nel servizio dati
Dal momento che il servizio dati richiede le informazioni dal dataset e dai TableAdapter, aggiungere i riferimenti ai progetti DataEntityTier e DataAccessTier.
Per aggiungere riferimenti al servizio dati
In Esplora soluzioni fare clic con il pulsante destro del mouse su DataService e scegliere Aggiungi riferimento.
Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda Progetti.
Selezionare entrambi i progetti DataAccessTier e DataEntityTier.
Scegliere OK.
Aggiunta delle funzioni al servizio per chiamare i metodi GetCustomers e GetOrders nel livello di accesso ai dati
Ora che il livello di accesso ai dati contiene i metodi per restituire i dati, creare i metodi nel servizio dati per chiamare i metodi nel livello di accesso ai dati.
Nota: |
---|
Per i progetti C#, è necessario aggiungere un riferimento all'assembly System.Data.DataSetExtensions per eseguire la compilazione del codice riportato di seguito. |
Per creare le funzioni GetCustomers e GetOrders nel servizio dati
Nel progetto DataService, fare doppio clic su IService1.vb o IService1.cs.
Aggiungere il seguente codice sotto il commento Aggiungere qui le operazioni del servizio:
<OperationContract()> _ Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable <OperationContract()> _ Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable
[OperationContract] DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers(); [OperationContract] DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
Nel progetto DataService, fare doppio clic su Service1.vb o Service1.cs.
Aggiungere il codice seguente alla classe Service1.
Public Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable Implements IService1.GetCustomers Dim CustomersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter Return CustomersTableAdapter1.GetCustomers() End Function Public Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable Implements IService1.GetOrders Dim OrdersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter Return OrdersTableAdapter1.GetOrders() End Function
public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers() { DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter(); return CustomersTableAdapter1.GetCustomers(); } public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders() { DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter OrdersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter(); return OrdersTableAdapter1.GetOrders(); }
Scegliere Compila soluzione dal menu Compila.
Creazione di un livello di presentazione per visualizzare i dati dal servizio dati
Ora che la soluzione contiene il servizio dati contenente i metodi che effettuano chiamate nel livello di accesso ai dati, creare un altro progetto che effettuerà le chiamate nel servizio dati e presenterà i dati agli utenti. In questa procedura dettagliata, creare un'applicazione Windows Form che costituisce il livello di presentazione dell'applicazione a più livelli.
Per creare il progetto livello di presentazione
Dal menu File, aggiungere un nuovo progetto alla soluzione NTierWalkthrough.
Nella finestra di dialogo Nuovo progetto selezionare Windows nel riquadro Tipi progetto. Nel riquadro Modelli fare clic su Applicazione Windows Form.
Assegnare al progetto il nome PresentationTier, quindi scegliere OK.
Il progetto PresentationTier viene creato e aggiunto alla soluzione NTierWalkthrough.
Impostazione del progetto PresentationTier come progetto di avvio
Dal momento che il livello di presentazione è in realtà l'applicazione client utilizzata per presentare e interagire con i dati, è necessario impostare il progetto PresentationTier come progetto di avvio.
Per impostare il nuovo progetto livello di presentazione come progetto di avvio
- In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier quindi scegliere Imposta come progetto di avvio.
Aggiunta di riferimenti al livello di presentazione
Per accedere ai metodi nel servizio, l'applicazione client PresentationTier richiede un riferimento al servizio dati. È richiesto inoltre un riferimento al dataset per attivare la condivisione dei tipi dal servizio WCF. Se non si attiva la condivisione dei tipi tramite il servizio dati, il codice aggiunto alla classe dataset parziale non sarà disponibile per il livello di presentazione. Dal momento che di norma si aggiunge un codice, ad esempio il codice per la convalida agli eventi di modifica di righe e colonne di una tabella dati, probabilmente si desidera accedere al codice dal client. Per ulteriori informazioni, vedere Utilizzo dei servizi WCF in Visual Studio.
Per aggiungere un riferimento al livello di presentazione
In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier e scegliere Aggiungi riferimento.
Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda Progetti.
Selezionare DataEntityTier e scegliere OK.
Per aggiungere il riferimento a un servizio al livello di presentazione
In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier, quindi scegliere Aggiungi riferimento a servizio.
Nella finestra di dialogo Aggiungi riferimento a servizio fare clic su Individua.
Selezionare Service1 e scegliere OK.
Nota: Se sono presenti più servizi nel computer in uso, selezionare il servizio creato in precedenza in questa procedura dettagliata, ossia quello contenente i metodi GetCustomers e GetOrders.
Aggiunta di DataGridView al form per visualizzare i dati restituiti dal servizio dati
Una volta aggiunto il riferimento a un servizio dati, i dati restituiti dal servizio vengono aggiunti automaticamente alla finestra Origini dati.
Per aggiungere due DataGridView con associazione a dati al form
In Esplora soluzioni selezionare il progetto PresentationTier.
Nella finestra Origini dati espandere NorthwindDataSet, quindi trovare il nodo Customers.
Trascinare il nodo Customers nel Form1.
Nella finestra Origini dati, espandere il nodo Customers e trovare il nodo correlato Orders, nidificato nel nodo Customers.
Trascinare il nodo correlato Orders nel Form1.
Creare un gestore per l'evento Form1_Load facendo doppio clic su un'area vuota del form.
Aggiungere il codice seguente al gestore eventi Form1_Load.
Dim DataSvc As New ServiceReference1.Service1Client NorthwindDataSet.Customers.Merge(DataSvc.GetCustomers) NorthwindDataSet.Orders.Merge(DataSvc.GetOrders)
ServiceReference1.Service1Client DataSvc = new ServiceReference1.Service1Client(); northwindDataSet.Customers.Merge(DataSvc.GetCustomers()); northwindDataSet.Orders.Merge(DataSvc.GetOrders());
Aumento della dimensione massima dei messaggi consentita dal servizio
Dal momento che il servizio restituisce i dati dalle tabelle Customers e Orders, il valore predefinito per maxReceivedMessageSize non è sufficiente per contenere i dati e deve essere aumentato. In questa procedura dettagliata si imposterà il valore su 6553600. Il valore verrà cambiato nel client e automaticamente verrà aggiornato il riferimento al servizio.
Nota: |
---|
La dimensione predefinita più bassa è utilizzata per limitare l'esposizione ad attacchi Denial of Service (DoS). Per ulteriori informazioni, vedere MaxReceivedMessageSize. |
Per aumentare il valore di maxReceivedMessageSize
In Esplora soluzioni fare doppio clic sul file app.config nel progetto PresentationTier.
Trovare l'attributo di dimensione maxReceivedMessage e cambiare il valore su 6553600.
Test dell'applicazione
Eseguire l'applicazione. I dati vengono recuperati dal servizio dati e visualizzati nel form.
Per eseguire il test dell'applicazione
Premere F5.
I dati delle tabelle Customers e Orders vengono recuperati dal servizio dati e visualizzati nel form.
Passaggi successivi
A seconda dei requisiti dell'applicazione, è possibile eseguire diverse operazioni dopo il salvataggio dei dati correlati nell'applicazione basata su Windows. È possibile ad esempio apportare i seguenti miglioramenti a questa applicazione:
Aggiungere la convalida al dataset. Per informazioni, vedere Procedura dettagliata: aggiunta della convalida a un'applicazione dati a più livelli.
Aggiungere un database locale all'applicazione. Per ulteriori informazioni, vedere Procedura dettagliata: aggiunta di una cache database locale a un'applicazione a più livelli.
Aggiungere al servizio altri metodi per l'aggiornamento dei dati nel database.