ObjectDisposedException возникает каждый раз при обновлении объекта User (членство)

  • Я использую asp.net mvc 3, структуру сущностей со структурной картой для IoC.
  • У меня есть собственный поставщик услуг членства.
  • У меня была такая же проблема, когда я вводил объект dbcontext и экземпляры членства с помощью StructureMap, поэтому удалил это для моего UserRepository.
  • У UserRepository теперь есть свойство DBContext, которое инициализируется в конструкторе.

Каждый раз, когда создается / обновляется новый пользователь (выполняющий это метод обертывает объект dbcontext в операторе using), при следующем обращении к dbcontext я получаю исключение ObjectDisposedException.

Я не понимаю, что делаю не так. Очевидно, что класс поставщика членства не создает экземпляр объекта userRepository каждый раз, когда он ему нужен, и когда пользователь обновляется, контекст удаляется из-за оператора using. Но я думал, что это стандартная практика?

Любая помощь приветствуется.

ИЗМЕНИТЬ:

На самом деле сложного кода нет. Настройка:

CustomMembershipProvider переопределяет стандартного поставщика членства (подробные сведения содержатся в файле конфигурации). CustomMembershipProvider использует объект IUserService, который использует IUserRepository, который реализуется UserRepository, имеющим закрытый объект DBContext на уровне класса.

В UserRepository у меня есть:

    public void UpdateUser(User user)
    {
        using(_db)
        {
            ... code to indicate that the user state has changed
            _db.SaveChanges();
        }
    }

После запуска этого кода запрос завершен. Но когда делается другой запрос для получения информации о роли или чтения пользователя из базы данных (в классе UserRepository), я получаю исключение ObjectDisposedException. На этом этапе ничего, связанное с User или Role, не работает, потому что они используют тот же класс UserRepository, чья переменная _db была удалена UpdateUser.

Первоначально у меня StructureMap разрешал объект DBContext, объект customMembership и т. Д., Но с тех пор мне пришлось удалить его из сопоставления StructureMap.


person amythn04    schedule 10.07.2011    source источник
comment
Можете ли вы показать код, который вы используете для связывания зависимостей, и код, который вызывает исключение?   -  person Bassetassen    schedule 11.07.2011


Ответы (1)


Каждый раз, когда создается / обновляется новый пользователь (выполняющий это метод обертывает объект dbcontext в операторе using), при следующем обращении к dbcontext я получаю исключение ObjectDisposedException.

DbContext - одноразовый ресурс (который реализует IDisposable). Поэтому, когда вы помещаете его в блок using, контекст становится удаленным когда поток управления выходит из блока using.

using(myContext)
{
   //do stuff
}

//try to access myContext after the using block throw ObjectDisposedException

Вы должны изменить дизайн того, как вы используете DbContext и когда собираетесь его утилизировать.

person Eranga    schedule 10.07.2011
comment
Я понимаю, что DBContext удаляется в операторе Using. Но это стандартная практика, не так ли? Я решил эту проблему, создав экземпляр нового объекта UserRepository в каждом из методов класса членства. Я думаю, что поставщики членства и ролей не создают экземпляр базового объекта, который ему нужно использовать для подключения к базе данных для аутентификации. По крайней мере, это то, что я видел. Использование structureMap для разрешения объекта не работает, потому что dbcontext будет удален при выполнении операции обновления для пользовательского объекта. Возможно, я что-то делаю не так, но я не уверен - person amythn04; 12.07.2011
comment
Я опубликую сопоставления StructureMap из Global.aspx.cs позже, но я уже отредактировал свой исходный вопрос, добавив немного дополнительной информации о настройке и коде. - person amythn04; 12.07.2011
comment
@ amythn04 мы также создаем новый контекст каждый раз, когда вызывается метод поставщика членства - person Eranga; 12.07.2011
comment
Означает ли это, что поставщик членства создаст объект DAL / Service (в моем случае IUserService) как синглтон, если мы сделаем его объектом уровня класса? Если да, то это для меня новость! Кроме того, вы используете какую-либо структуру DI / IoC? Если да, то подключаетесь ли вы к провайдеру членства? Я сделал это изначально, но это дает мне исключение с удаленным объектом - martinsantics.blogspot.com/2009/10/ - person amythn04; 12.07.2011
comment
Провайдер членства используется как одноэлементный. Framework не предоставляет точки входа для DI. Следовательно, вы не можете выполнить DI должным образом (но вы можете сделать это вручную, вызвав Resolve<>() методы). Образец API-оболочки оболочки (ваша ссылка) позволяет DI. - person Eranga; 12.07.2011