Настройка Fluent NHibernate и StructureMap для веб-приложения - PullRequest
0 голосов
/ 30 сентября 2010

Я использую это приложение http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/ для настройки fnh с Structuremap, но после одного запроса я получаю следующее исключение

Сессия закрыта! Имя объекта: «ISession».

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

Сведения об исключении: System.ObjectDisposedException: сессия закрыта! Имя объекта: «ISession».

Мой класс хранилища выглядит так:

public class Repository : IRepository {
    private readonly ISession _session;
    public Repository(ISession session) {
        _session = session;
    }
    public T Get<T>(Expression<Func<T, bool>> predicate) {
        return _session.CreateCriteria(typeof(T)).Add(predicate).UniqueResult<T>();
    }

и я регистрирую свой репозиторий в Structuremap следующим образом:

public class RepositoryRegistry : Registry {
    public RepositoryRegistry() {
        Scan(a => {
            a.AssembliesFromApplicationBaseDirectory();
            a.AddAllTypesOf<IRepository>();
        });
    }
}

Как я могу предотвратить закрытие сессии?

1 Ответ

0 голосов
/ 01 октября 2010

Регистрируете ли вы ISession так же, как в примере? Это должен быть формат HttpContext примерно так:

      x.For<ISession>()
        .HttpContextScoped()
        .Use(context => context.GetInstance<ISessionFactory>().OpenSession());

Другая возможность состоит в том, что что-то регистрируется как одноэлементное (и удерживается на закрытом сеансе, а не воссоздается с текущим сеансом.

После просмотра вашего вопроса в списке StructureMap: http://groups.google.com/group/structuremap-users/browse_thread/thread/8023e0acc43ceeb3#, Я вижу проблему.

Вы вводите свой репозиторий в карту сайта, которая является одноэлементной. Таким образом, вам нужно будет давать SiteMap новый сеанс каждый запрос, например, так:

public class MvcSiteMapProvider : SiteMapProvider { 
     public static IRepository Repository { get; set; }; 
     public MvcSiteMapProvider() { }
} 

protected void Application_BeginRequest() { 
     MvcSiteMapProvider.Repository = ObjectFactory.GetInstance<ISession>();
}
...