sobota, 7 sierpnia 2010

NHibernate 3.0 i FluentNHibernate pierwsze kroki i pierwsze problemy...

Jako że postanowiłem zastosować do mojej aplikacji NHibernate 3.0 w konsekwencji również chciałem móc używać FluentNhibernate. I tutaj pojawił się mały problem. Ponieważ oficjalnie autorzy nie wspierają jeszcze nowej wersji NHibernate ponieważ jest to wersja alpha. Natomiast gdy chciałem użyć aktualnej wersji to wyrzucał błędy ze wersja biblioteki mu nie odpowiada. Troszeczkę poszperałem w internecie i znalazłem rozwiązanie. Otóż wystarczy ściągnąć źródła FluentNHibernate, następnie w owym projekcie podmienić stare biblioteki na nowe z NHibernate 3.0. Następnie zbudować i wszystko działa.

Jak już uporałem się z wcześniejszym problem napisałem podstawowe klasy obsługi bazy danych takie jak: DatabaseContext i DatabaseFactory. W dużej mierze były one wzorowane na projekcie shrinkr z codeplexa.

Database Context
DatabaseContext zawiera podstawowe metody takie jak zapisywanie, usuwanie obiektów z bazy, zatwierdzanie zmian.
public class DatabaseContext : IDisposable
{
    private readonly ISession _session;
    private ITransaction _transaction;

    private IQueryable<User> _users;

    public DatabaseContext(ISession session)
    {
        Check.Argument.IsNotNull(session, "session");

        _session = session;
    }

    public IQueryable<User> Users
    {
        [DebuggerStepThrough]
        get
        {
            return _users ?? (_users = CreateQuery<User>());
        }
    }

    public virtual IQueryable<TEntity> CreateQuery<TEntity>() where TEntity : class, IEntity
    {
        return _session.Query<TEntity>();
    }

    public virtual TEntity GetById<TEntity>(long id) where TEntity : class, IEntity
    {
        Check.Argument.IsNotNegative(id, "id");
        return _session.Get<TEntity>(id);
    }

    public virtual void Save<TEntity>(TEntity entity) where TEntity : class, IEntity
    {
        Check.Argument.IsNotNull(entity, "entity");
        EnsureTransaction();
        _session.SaveOrUpdate(entity);
    }

    public virtual void Delete<TEntity>(TEntity entity) where TEntity : class, IEntity
    {
        Check.Argument.IsNotNull(entity, "entity");
        EnsureTransaction();
        _session.Delete(entity);
    }

    public virtual void Commit()
    {
        EnsureTransaction();
        _transaction.Commit();
    }

    private void EnsureTransaction()
    {
        if (_transaction == null || !_transaction.IsActive || _transaction.WasCommitted || _transaction.WasRolledBack)
        {
            _transaction = _session.BeginTransaction();
        }
    }
}


Database Factory
Natomiast DatabaseFactory jest głównym obiektem związanym z zarządzaniem baza ponieważ to w nim odbywa się konfiguracja całego Nhibernate za pomoc wcześniej wspomnianej składni Fluent. Jest ona umieszczona w metodzie prywatnej jednak nie będę jej tutaj pokazywał. Interfejs tej klasy posiada tylko 1 metodę z pomocą której możemy otrzymać DatabaseContext.
public interface IDatabaseFactory
{
    DatabaseContext Get();
}

Unit of Work
Ostatnim obiektem związanym z baza który dziś dodałem jest UnitOfWork. Ponieważ większość operacji na danych odbywa się za pomocą transakcji. Musimy mieć obiekt pozwalający nam zatwierdzać zmiany. Po to właśnie ten obiek został stworzony. Interfejs wyglada tak:
public interface IUnitOfWork
{
    void Commit();
}
Po implementacje samej klasy zapraszam do źródeł.

Acha i jeszcze dodałem do solucji projekt testowy związany z Nhibernatem. To tyle na dziś. W kolejnym wpisie będzie co nieco na temat implementacji bazowych repozytoriów i pewnie wstepna implementacja repozytorium użytkownika.

Brak komentarzy:

Prześlij komentarz