Как реализовать шаблон Open Session in View в NHibernate? - PullRequest
1 голос
/ 26 марта 2010

Я использую ASP.NET MVC + NHibernate + Fluent NHibernate и у меня проблема с отложенной загрузкой.

С помощью этого вопроса ( Как исправить ошибку отложенной загрузки NHibernate «ни одна сессия или сессия не была закрыта»? ) я обнаружил, что должен реализовать Open Session в шаблоне просмотра, но я не знаю, как.

В моих классах репозиториев я использую такие методы

    public ImageGallery GetById(int id) {
        using(ISession session = NHibernateSessionFactory.OpenSession()) {
            return session.Get<ImageGallery>(id);
        }
    }

    public void Add(ImageGallery imageGallery) {
        using(ISession session = NHibernateSessionFactory.OpenSession()) {
            using(ITransaction transaction = session.BeginTransaction()) {
                session.Save(imageGallery);
                transaction.Commit();
            }
        }
    }

А это мой вспомогательный класс Session Factory:

public class NHibernateSessionFactory {
    private static ISessionFactory _sessionFactory;
    private static ISessionFactory SessionFactory {
        get {
            if(_sessionFactory == null) {
                _sessionFactory = Fluently.Configure()
                    .Database(MySQLConfiguration.Standard.ConnectionString(MyConnString))
                    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ImageGalleryMap>())
                    .ExposeConfiguration(c => c.Properties.Add("hbm2ddl.keywords", "none"))
                    .BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }
    public static ISession OpenSession() {
        return SessionFactory.OpenSession();
    }
}

Кто-нибудь может помочь мне реализовать шаблон Open Session in View?

Спасибо.

1 Ответ

2 голосов
/ 27 марта 2010

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

  • Используйте это (код вопроса, измененный с ответом) в global.asax: Application_EndRequest не срабатывает на 404
  • Используйте один и тот же сеанс и экземпляр транзакции для каждого метода, выполняемого во время веб-запроса.

public class Repository
{
  private readonly ISession session;

  public Repository()
  {
    session = CurrentSessionContext.CurrentSession();
  } 

  public ImageGallery GetById(int id) 
  {
    return session.Get<ImageGallery>(id);
  }

  public void Add(ImageGallery imageGallery)
  {
    session.Save(imageGallery);
  }
}

Вы также можете управлять сеансом с помощью контейнера ioc и оболочки рабочей единицы вместо текущего контекста сеанса.

...