Гибрид NHibernate DAL / BLL

У меня есть существующий проект веб-форм asp.net, который использует Microsoft Enterprise DAAB для DAL, мне нужно реализовать некоторые расширенные функции, и я хотел бы использовать NHibernate, чтобы упростить задачу.

Существуют ли какие-либо шаблоны проектирования / архитектуры, позволяющие использовать гибридный DAAB / NHibernate DAL? Это хорошая идея ?

Я думаю: если бы у меня был гибридный DAL, я все равно мог бы передавать запросы с высоким трафиком / нединамические запросы через сторону DAAB и сэкономить накладные расходы на динамическую генерацию sql. Но все же есть nhibernate для более сложных запросов.

Кроме того, как лучше всего настроить NHibernate DAL / BLL для приложения веб-форм asp.net? Я прочитал руководство на сайте NHibernate и несколько других, похоже, нет единого мнения о запуске / завершении сеанса nhib. Я просто ищу лучший пример из практики.

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 490
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Один из подходов, о котором я слышал, - это использование nHibernate, когда вы взаимодействуете с моделью предметной области. Имейте в виду, что nHibernate может вызывать хранимые процедуры, поэтому, если вы хотите избежать генерации SQL, вы можете, но я бы посоветовал этого не делать.

Если у вас есть запросы для отчетов или отображения данных, из которых вы не хотите создавать настраиваемые объекты, вы можете использовать DAAB, хотя я бы не рекомендовал делать это, если вы собираетесь создавать свои объекты.

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

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

Хорошей отправной точкой является статья Билли Маккафферти здесь: http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

В его коде есть ошибка / ограничение, ознакомьтесь с моим сообщением в блоге, если вы используете его метод: http://jberke.blogspot.com/2008/10/nhibernate-transaction-session-mgmt.html

У вас есть два вопроса - вы или модератор должны разделить его на два: 1) Как лучше всего использовать DAAB и NHibernate вместе?

2) Как лучше всего настроить NHibernate в приложении веб-форм?

Я могу ответить на второй вопрос: использовать HttpModule в ASP.NET для настройки контекста для каждого запроса. Пример модуля можно найти здесь: http://tinyurl.com/b5am9b

public class NHibernateSessionModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.EndRequest += new System.EventHandler(context_EndRequest);
        }

        void context_EndRequest(object sender, System.EventArgs e)
        {
            HybridSessionBuilder builder = new HybridSessionBuilder();
            ISession session = builder.GetExistingWebSession();
            if (session != null)
            {
                                Log.Debug(this, "Disposing of ISession " + session.GetHashCode());
                session.Dispose();
            }
        }

        public void Dispose()
        {

        }
    }

Другие вопросы по теме