Как реализовать трехслойную модель с помощью NHibernate? - PullRequest
9 голосов
/ 31 января 2011

Используя традиционный трехслойный подход (не обязательно 3 уровня):

UI BLL DAL

Как подходит NHibernate?В большинстве случаев я вижу людей, позволяющих NHibernate напрямую заполнять доменные объекты / сущности, что, очевидно, требует ссылки из NHibernate на эти сущности.Если доменные объекты являются частью BLL, для этого, по-видимому, требуется ссылка из DAL (где находится NHibernate) на BLL (где находятся объекты домена).

Разве это не противоречит типичному пониманию разделениякаждый слой, причем каждый слой зависит только от того, что под ним?Что мне здесь не хватает?

Ответы [ 2 ]

9 голосов
/ 01 февраля 2011

Я могу привести пример того, как я обычно работаю с NHibernate для n-уровневой архитектуры:

Уровень доступа к данным

Пример для сопоставления:

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

Бизнес-уровень

  • Репозитории: BaseRepository

Пример хранилища:

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

Пример базового репозитория:

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

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

Доменный уровень

  • DataInterfaces (IRepository, IBaseRepository)
  • Объекты: BaseEntity
  • Сопротивление (IEntity, IBaseEnity)

Итак, единственный уровень, который ссылается на NHibernate, на самом деле это уровень данных и бизнес (NHibernate.ISession). Доменный слой является общим для всех слоев и не знает о NHibernate. Для простоты вы можете объединить бизнес и уровень данных в один слой. Я, как правило, разделяю их, но это зависит от размера проекта.

enter image description here

Если вы действительно хотите разделить, я также предлагаю вам посмотреть внедрение зависимостей , чтобы уменьшить зависимости между различными уровнями.

Надеюсь, это поможет вам.

4 голосов
/ 01 февраля 2011

NHibernate наиболее подходит для другой архитектуры (все еще многоуровневой, но не сгруппированной по-разному).

Уровень представления использует NHibernate в качестве Data Mapper Unit)работы ), чтобы отделить модель предметной области (то есть ее бизнес-логику) от проблем постоянства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...