martedì 5 luglio 2011

Creazione di un Data Access Layer utilizzando Dynamics in WebMatrix

di Steve Lydford

Così abbiamo visto tutti la demo WebMatrix dove mettere un po 'in linea di SQL nella pagina e tirare qualche disco giusto? E sto indovinando che la maggior parte di voi appena visto che e pensò: "YUK! Cosa succede se le modifiche allo schema o mi vogliono accedere allo stesso insieme di dati in luoghi diversi?Voglio che tutto il codice in un posto. "

Bene, abbiamo potuto trascorrere un paio d'ore la scrittura di un tradizionale della vecchia scuola strato di accesso ai dati, utilizzando le classi per rappresentare il nostro modello di dominio e metodi per eseguire query e persistere al database, ecc, ecc .... ma questo è il modo in cui il papà lo ha fatto!WebMatrix dovrebbe essere tutto fresco, dinamico, groovyness scripting veloce - così lascia farlo nel modo dinamico ...

Il programma di installazione

Prima di tutto, permette di creare un database SQL Server Compact nel nostro progetto WebMatrix denominato "Catalogo" e dargli una tabella chiamata "Prodotti" (originale eh?):

dalTable

E noi aggiungeremo alcuni record:

dalData

E questo è tutto, siamo tutti insieme.

Il "5 Minuti Demo" via

Dopo la forma del codice demo al solito facciamo qualcosa del genere per visualizzare un elenco di nomi di prodotto:

01.@ {
. 02db var = Database.Open ( "Catalogo" );
03.var sql = "SELECT * FROM prodotti" ;
04.var qry = db.Query (sql);
05.}
06.
07.
08.@ foreach (var prodotto in qry) {
09.
  • @ product.Name
  • 10.}
    11.

    Allora qual è il problema? Beh, se questa era una pagina di un sito, allora non sarebbe davvero un problema a tutti. Il problema nasce quando si desidera ottenere i dati in luoghi diversi su più pagine - si trasforma in un incubo di manutenzione. I gattini possono morire.

    Immaginate di avere il codice di accesso dati in 20 luoghi diversi nel tuo sito (che è un numero realistico di un sito piuttosto piccolo) e di modificare il database o rinominare la tabella prodotti? Cosa succede nel caso di query prodotti su diverse pagine e le modifiche specifiche per includere una colonna 'inStock' ed è necessario modificare tutte le liste prodotto per mostrare solo gli elementi che hanno segnato questo campo come vero? Mi rendo conto che io sono probabilmente "predicare ai convertiti" qui, ma si ottiene il mio punto.


    Ecco come i ragazzi lo stanno facendo raffreddare ....

    Creiamo un nuovo file Razor nella nostra cartella App_Code (crearne uno se non esiste già) chiamato ProductsData.cshtml e aggiungere il codice seguente:

    01.@ utilizzando System.Dynamic;
    02.
    03.@ funzioni {
    04.
    05.pubblici statici catalogo database {
    06.ottiene {
    07.ritorno Database.Open ( "Catalogo" );
    08.}
    09.}
    10.
    11.pubblici statici GetProducts IEnumerable () {
    12.var sql = "SELECT * FROM prodotti" ;
    13.ritorno Catalog.Query (sql);
    14.}
    15.}

    Ora, se abbiamo bisogno di cambiare il nostro SQL lista dei prodotti abbiamo solo bisogno di farlo in un posto e rende il file di vista Razor molto più facile da leggere. Il GetProducts () restituisce IEnumerable

    1.< ul >
    2.@ foreach (var prodotto in ProductsData.GetProducts ()) {
    3.< li > @ product.Name li >
    4.}
    5.ul >

    Ora che è meglio! Che altro possiamo fare? Beh, potremmo aggiungere un metodo ProductsData.cshtml per tirare fuori un singolo prodotto, passando nel suo ID del prodotto:

    1.pubblici statici GetProductById dinamico ( int id)
    2.{
    3.var sql = "SELECT * FROM Prodotti WHERE ID = @ 0" ;
    4.restituire Catalog.Query (sql, id) Singolo ().;
    5.}

    Che possiamo usare in questo modo nella pagina di contenuto:

    1.@ {
    2.productId var = 1;
    3.prodotto var = ProductsData.GetProductById (ProductID);
    4.
    5.}
    6.
    7.
    @ product.Name - @ product.Price

    E ancora, tutto il nostro codice di accesso ai dati è in un posto e le nostre pagine di contenuto sono molto più pulito.Abbiamo salvato molti cuccioli.

    Inserti e aggiornamenti

    Siamo in grado di ottenere gli stessi benefici con inserti e aggiornamenti con un po 'di magia Expando! Il metodo seguito in ProductsData.cshtml ci dà inserti:

    1.pubblici static void AddProductO (prodotto dinamico) {
    2.var sql = "INSERT INTO Prodotti (nome, descrizione, prezzo)" +
    3."VALUES (@ 0, @ 1, @ 2)" ;
    4.Catalog.Execute (sql, product.Name, product.Description, product.Price);
    5.}

    Il metodo ha un parametro che accetta un dinamico. La suggestione delle dinamiche significa che possiamo passare un ExpandoObject, che avrà i suoi membri risolto a runtime. Usando la dinamica in questo modo il compilatore semplicemente non importa se si può risolvere product.Name, product.Price, ecc e lascia solo alla fase di esecuzione per risolvere.

    A nostro parere siamo in grado di ottenere i dati di cui abbiamo bisogno da parte dell'utente in un "nuovo prodotto" forma e utilizzare il metodo AddProductO in questo modo:

    01.@ utilizzando System.Dynamic;
    02.@ {
    03.se (isPost) {
    04.
    05.prodotto dinamico = nuovo ExpandoObject ();
    06.product.Name Richiesta = [ "Nome" ];
    07.product.Description = Request [ "Descrizione" ];
    08.product.Price = Request [ "Prezzo" ];
    09.
    10.ProductsData.AddProduct (prodotto);
    11.}
    12.}

    Qui dobbiamo solo creare un nuovo ExpandoObject, aggiungere membri ad esso a partire dai dati presentati modulo e passare al metodo AddProductO. Peasy facile.

    Gli aggiornamenti sono realizzati in modo molto simile. Questo è il metodo SaveProduct:

    1.pubblici static void SaveProduct (prodotto dinamico) {
    2.var sql = "Prodotti UPDATE SET Nome = @ 0, Descrizione = @ 1, Prezzo = @ 2 where id = @ 3" ;
    3.Catalog.Execute (sql, product.Name, product.Description, product.Price, product.Id);
    4.}

    E questo è il codice nella vista:

    01.@ utilizzando System.Dynamic;
    02.@ {
    03.se (isPost) {
    04.
    05.elemento dinamico = nuovo ExpandoObject ();
    06.item.Id = Request [ "Id" ];
    07.item.Name = Request [ "Nome" ];
    08.item.Description = Request [ "Descrizione" ];
    09.item.Price = Request [ "Prezzo" ];
    10.
    11.ProductsData.SaveProduct (voce);
    12.
    13.Response.Redirect ( "~ / Index.cshtml" );
    14.}
    15.}

    Ancora una volta stiamo creando un nuovo ExpandoObject, aggiungere membri ad esso a partire dai dati presentati modulo e passando al metodo SaveProduct in ProductData.cshtml.

    Riassunto

    Ecco come possiamo usare la dinamica e Razor @ funzioni per creare un semplice strato di accesso ai dati per i siti WebMatrix nostro sito. Tutti i cuccioli salvati, il tempo di andare a letto.

    Corso Visual Studio - Corsi Visual Studio
    Corso .Net- Corso Dot.Net - Corso Vb.net
    Corso C# - Corso PHP - Corso Joomla


    Nessun commento:

    Posta un commento