Asp MVC проблема настройки приложения с помощью Windsor и NHibernate

У меня возникли проблемы с настройкой приложения с использованием windsor, средств и nhibernate.

Я получаю это исключение:

ObjectDisposedException: Session is closed   

Разве Виндзор не должен заботиться о создании сессии для каждого запроса и ее открытии, когда у меня есть такая конфигурация? Могу ли я пропустить некоторые настройки? Вот моя конфугурация:

public class PersistenceFacility : AbstractFacility
{

    protected override void Init()
    {
        Configuration config = BuildDatabaseConfiguration();

        Kernel.Register(
            Component.For<ISessionFactory>()
                .LifeStyle.Singleton
                .UsingFactoryMethod(config.BuildSessionFactory),
            Component.For<ISession>()
                .LifeStyle.PerWebRequest
                .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()));
    }

    private Configuration BuildDatabaseConfiguration()
    {
        return Fluently.Configure()
            .Database(SetupDatabase)
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<RnUlice>())
            .ExposeConfiguration(ConfigurePersistence)
            .BuildConfiguration() ;
    }
   ......
}

2 ответа

Решение

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

Вот почему в большинстве случаев вам не нужен синглтон, в зависимости от других компонентов с "более коротким" образом жизни (например, для каждого веб-запроса или переходного процесса).

Смотрите эту статью для более тщательного анализа общих проблем образа жизни.

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

            container.Register(Component.For(typeof(IRepository<>))
                                    .ImplementedBy(typeof(Repository<>)).LifeStyle.Transient);

Интересно, каков стиль жизни по умолчанию тогда? Я читал в документах, что это синглтон?! Как это может быть проблемой?

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