Гибрид NHibernate DAL/BLL
У меня есть существующий проект веб-форм asp.net, который использует Microsoft DAAB Microsoft для DAL, мне нужно реализовать некоторые обширные функции, и я хотел бы использовать NHibernate, чтобы упростить задачу.
Существуют ли какие-либо шаблоны / архитектуры проектирования, которые позволяют использовать гибридный DAAB/NHibernate DAL? Это хорошая идея?
Я думаю: если бы у меня был гибридный DAL, я мог бы все еще передавать запросы с высоким трафиком / нединамические через DAAB и сохранять издержки динамического создания SQL. Но все еще есть nhibernate для более сложных запросов.
Кроме того, как лучше всего настроить NHibernate DAL/BLL для приложения веб-формы asp.net? Я прочитал учебник на сайте NHibernate и несколько других, где, кажется, нет единого мнения по поводу начала / окончания сеанса nhib. Я просто ищу пример лучшей практики.
Спасибо
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()
{
}
}