2011-01-31 15 views
9

Biorąc tradycyjne podejście 3 warstwy (niekoniecznie 3 szczeblami):Jak zaimplementować trójwarstwowy model z NHibernate?

UI BLL DAL

Jak NHibernate pasuje? W większości przypadków widzę ludzi, którzy pozwalają NHibernate na bezpośrednie wypełnianie obiektów/obiektów domeny, co oczywiście wymaga odniesienia od NHibernate do tych podmiotów. Jeśli encje domeny są częścią BLL, wydaje się, że wymaga to odniesienia z DAL (gdzie znajduje się NHibernate) do BLL (gdzie znajdują się obiekty domeny).

Czy nie jest to sprzeczne z typowym myśleniem o oddzielaniu każdej warstwy, przy czym każda warstwa jest zależna tylko od tej pod nią? Czego tu mi brakuje?

+0

Można przejść przez [link] (http://www.primaryobjects.com/cms/article119.aspx), która przedstawia najlepszy sposób projektowania aplikacji NHibernate przy użyciu warstwowej [Repository modelu] (http: // www. primaryobjects.com/cms/article119.aspx) – viento

Odpowiedz

9

mogę dać przykład, jak to zwykle warstwa z NHibernate dla architektury n-warstwowej:

Data Access warstwy

Przykład odwzorowania:

public class CategoryMap : ClassMap<Domain.Entities.Category> 
{ 
    public CategoryMap() 
    { 
     ... 
    } 
} 

firmy warstwy

  • Repositories: BaseRepository

Przykład repozytorium:

public class CategoryRepository : BaseRepository<Domain.Entities.Category>, 
    Domain.DataInterfaces.Business.Repositories.ICategoryRepository 
{ 
    public CategoryRepository(ISession session) 
     : base(session) 
    { 
    } 
} 
  • BaseRepository (CRUD, GetById, getAll)

Przykład repozytorium podstawowego:

public class BaseRepository<T> : IBaseRepository<T> 
{ 
    public ISession Session { get; set; } 

    public BaseRepository(ISession session) 
    { 
     Session = session; 
    } 
} 

domeny warstwy

  • DataInterfaces (IRepository, IBaseRepository)
  • podmioty: BaseEntity
  • Trwałość (IEntity, IBaseEnity)

Więc jedyna warstwa, która odwołuje NHibernate jest faktycznie warstwa danych i firmy (NHibernate.ISession).Warstwa domeny jest współdzielona między wszystkimi warstwami i nie zna NHibernate. Dla uproszczenia można połączyć warstwę biznesową i danych w jedną warstwę. Zazwyczaj staram się je oddzielić, ale zależy to od wielkości projektu.

enter image description here

Jeśli naprawdę chcesz separacja, ja też proponujemy, aby rzucić okiem na dependency injection zmniejszenia zależności pomiędzy różnymi warstwami.

nadzieja, że ​​pomaga.

+0

Dzięki Martin. Czym dokładnie jest NHibernate powracający do warstwy biznesowej? Może wyjaśniłby to krótki przykład kodu? –

+0

DAL jest wywoływana tylko przez BL i zwraca sesji NHibernate i mapowania NHibernate. Nic więcej. Dodałem kilka przykładów, mam nadzieję, że stanie się to bardziej jasne. –

+1

Repozytoria nie powinny zawierać Business Logic ... Powinny być w DAL. – Phill

4

NHibernate jest najbardziej odpowiedni dla różnych architektur (wciąż warstwami, ale ułożone w taki sam sposób).

warstwa

Prezentacja wykorzystuje NHibernate jako Data Mapper (i Unit of Work) oddzielenie jej Domain Model (czyli jego logiki biznesowej) z obawy wytrwałości.

+0

W architekturze, którą opisujesz, jakie są warstwy i jak się do siebie odnoszą? –

+0

Powiedziałbym, że dostaniesz ** warstwę prezentacji **, która wie o ** odwzorowaniu obiektowo-relacyjnym ** i ** modelu domeny ** (warstwa biznesowa, jeśli chcesz), podczas gdy ORM zna również model domeny . –

+1

To jest dokładnie to. NHibernate jest idealny do użytku z architekturą cebuli. Zobacz http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=onion+architektura. – jason