Это хорошее решение для обработки NHibernate Isession как PerWebRequest - PullRequest
3 голосов
/ 17 февраля 2010

Я боролся с управлением сессиями NHibernate и теперь нашел два возможных решения для удовлетворения сеанса на веб-запрос.

Я использую Windsor для IoC в проекте ASPNET MVC

Первое решение - открыть сеанс в begin_request и снова закрыть / удалить его в end_request. В виндзорской настройке я бы container.Register (Component.For (). UsingFactoryMethod (() => SessionFactory.GetCurrentSession ()). LifeStyle.Transient;

Это решение создает сеанс для каждого запроса и передает его через GetCurrentSession.

Второе решение - использовать Виндзор как

container.Register (Component.For (). UsingFactoryMethod (() => SessionFactory.OpenSession ()). LifeStyle.PerWebRequest);

Это также может дать мне сеанс для каждого веб-запроса и поддержки конструктора. Это немного более просто, но мне нужно второе мнение.

Пожалуйста, дайте мне знать, что вы предпочитаете использовать,

С наилучшими пожеланиями Rasmus

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

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

1 голос
/ 17 февраля 2010

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

public interface INHiberanteUnitOfWork
{
    ISession session { get; }
    void Commit();
    void RollBack();
}
...