Asp MVC проблема настройки приложения с помощью Windsor и NHibernate - PullRequest
2 голосов
/ 20 июня 2011

У меня проблемы с настройкой приложения с использованием 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 ]

7 голосов
/ 21 июня 2011

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

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

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

2 голосов
/ 20 июня 2011

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

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

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

...