BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Model realizujący różne warstwy pośredniczące pomiędzy aplikacją i bazą danych

14-06-2007 20:24 | User 94244
Pisząc aplikację w .Net 2.0 mamy do wyboru kilka rozwiązań, które realizują warstwę pośredniczącą pomiędzy aplikacją i bazą danych. Niektóre z nich to Nhibernate, typowane datasety, Active Record, Sooda oraz mający się pojawić w nowej wersji Visual Studio LINQ. Jako, że trudno od razu zdecydować się na jedno rozwiązanie postanowiłem stworzyć taki model, który będzie umożliwiał stosowanie dowolnego rozwiązania.

    Pisząc aplikację w .Net 2.0 mamy do wyboru kilka rozwiązań, które realizują warstwę pośredniczącą pomiędzy aplikacją i bazą danych. Niektóre z nich to Nhibernate, typowane datasety, Active Record, Sooda oraz mający się pojawić w nowej wersji Visual Studio LINQ. Jako, że trudno od razu zdecydować się na jedno rozwiązanie postanowiłem stworzyć taki model, który będzie umożliwiał stosowanie dowolnego rozwiązania. Artykuł podzieliłem na dwie części. W pierwszej części opisze sam model. W drugiej przedstawię istotę serwisów, które będą opierały się na tym co przedstawię w pierwszej części artykułu. Żeby przykładowy program, który tu opisze działał potrzebny nam będzie nhibernate. Należy go pobrać i zainstalować.

    Zaczynamy od stworzenia przykładowego projektu Windows Application. Dodajemy folder DataBase, a do niego plikową bazę danych Database.mdf. Oprócz pliku .mdf Visual Studio dodaje domyślnie plik DataSet1.xsd, który należy od razu usunąć, ponieważ raz nie jest nam on na razie potrzebny a dwa będzie w innym miejscu. Następnie klikając dwa razy na plik bazodanowy tworzymy przykładową tabele Dokument. Tabela nie ma znaczenia, służy on jedynie do zaprezentowania modelu. Dla przykładu niech zawiera cztery kolumny Id, Nazwa, Rodzaj, Data. Zapisujemy tabelę i przechodzimy z powrotem do drzewa projektu. Do projektu dodajemy folder Model. W nim przechowywany będzie model danych dla każdej warstwy obsługującej bazę danych. Do folderu Model dodajemy interface IDokumentModel.cs o zawartości:

using System;
using System.Collections.Generic;
using System.Text;
using Nullables;

namespace main.Model
{
    public interface IDokumentModel
    {
        int Id
        {
            get;
            set;
        }

        string Nazwa
        {
            get;
            set;
        }

        string Rodzaj
        {
            get;
            set;
        }

        Nullables.NullableDateTime Data_Nullable
        {
            get;
            set;
        }
    }
}

Interfejs ten korzysta z przestrzeni Nullables dlatego musimy dodać do naszego programu referencję  Nullables.dll.
 
    Pierwsza warstwa od której zaczniemy to typowane datasety. Do folderu Model dodajemy folder TypedDataSet a do niego plik typu DataSet o nazwie DSDokument.xsd. Klikamy w niego dwa razy, następnie klikamy na Database Exlporer i przeciągamy wcześniej utworzoną przez nas tabelę Dokument. Kolejny plik jaki jest nam potrzebny w folderze TypedDataSet to DSDokument.cs czyli jest to konkretna implementacja modelu dla typowanych datasetów. Jego zawartość:

using System;
using System.Collections.Generic;
using System.Text;

namespace main.Model.TypedDataSet
{
    public partial class DSDokument
    {
        public partial class DokumentRow : IDokumentModel
        {
            public Nullables.NullableDateTime Data_Nullable
            {
                set
                {
                    if (value != null)
                    {
                        this.Data = value.Value;
                    }
                }
                get
                {
                    if (this.IsDataNull())
                    {
                        return null;
                    }
                    else
                    {
                        return this.Data;
                    }
                }
            }
        }
    }
}

    Można zauważyć, że mamy tylko jedną definicję dla kolumny Data. Bierze się to stąd, iż klasa DokumentRow zawiera już implementację innych kolumn. Niestety Visual studio nie obsługuje typów null podczas generowania DataSetów. Co jest jak dla mnie dużym błędem ze strony twórców tego środowiska. Dlatego należy implementację tej kolumny dopisać. Implementacja typowanych datasetów mamy za sobą, przystępujemy do implementacji modelu dla nhibernate. Do folderu Model dodajemy folder NHibernate a do niego plik Document.cs, jego zawartość:

using System;
using System.Collections.Generic;
using System.Text;

namespace main.Model.NHibernate
{
    public class Dokument : IDokumentModel
    {
        int id;
        string nazwa;
        string rodzaj;
        Nullables.NullableDateTime data;

        public virtual int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        public virtual string Nazwa
        {
            get
            {
                return nazwa;
            }
            set
            {
                nazwa = value;
            }
        }

        public virtual string Rodzaj
        {
            get
            {
                return rodzaj;
            }
            set
            {
                rodzaj = value;
            }
        }

        public virtual Nullables.NullableDateTime Data_Nullable
        {
            get
            {
                return data;
            }
            set
            {
                data = value;
            }
        }
    }
}

    W tym momencie nasz model jest gotowy. Jak widać dodanie nowej warstwy pośredniczącej pomiędzy aplikacją i bazą danych nie powinno sprawić problemu. Wystarczy dodać odpowiedni folder do już istniejącego folderu Model a do niego klasę, która implementuje interfejs IDokumentModel.cs. Jako, że model jest gotowy należało by przedstawić jego zastosowanie w praktyce. Przechodzimy do formatki MainWindow.cs i dodajemy zdarzenie Load, w którym przetestujemy nasz model. Zaczynamy od dodania przestrzeni nazw: using main.Model,using main.Model.TypedDataSet i using main.Model.NHibernate. Tworzymy prosty kod:

            DSDokument.DokumentDataTable dt = new DSDokument.DokumentDataTable();

             // Implementacja typowanych datasetów.
            IDokumentModel model = dt.NewDokumentRow();

            model.Id = 5;

            model.Data_Nullable = DateTime.Now;

            // Implementacja  nhibernate.
            model = new Dokument();

            model.Id = 6;

            model.Data_Nullable = DateTime.Now;

Jak widać powyżej model jaki zaprezentowałem w tym artykule pozwala korzystać zarówno z typowanych datasetów jak i nhibernate zamiennie. Jest to o tyle istotne, że jeśli pisząc za pomocą, np. nhibernate zdecydujemy się użyć jakiejś innej warstwy dostępu do danych nie trzeba przepisywać sporej ilości kodu od nowa. Bardziej szczegółowe przypadki użycia zamierzam przedstawić w drugiej części artykułu.


Link:
NHibernate: http://www.hibernate.org/343.html

Załączniki:

Podobne artykuły

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.