Поведение ObjectContext с использованием AutoFac и MVC3 - PullRequest
1 голос
/ 20 июня 2011

Я использую AutoFac в качестве IoC для ввода ObjectContext внутри контроллеров, которым он нужен.

ObjectContext зарегистрирован в AutoFac с использованием InstancePerLifetimeScope, и я создал собственную фабрику контроллеров, которая разрешает правильныйКонтроллер из DI-контейнера, и, следовательно, получает вставленный ObjectContext.

Когда я запрашиваю страницу, все выглядит хорошо, и данные выбираются из базы данных, используя EF4, как и ожидалось.

Мне интересно, что после того, как я запустил веб-приложение, и я собираюсь удалить или добавить некоторые записи из базы данных вручную, эти изменения не отражаются в моем веб-приложении.У меня было 10 записей в базе данных, удалено 5, но все равно все 10 записей извлекаются EF.Я думал, что когда я регистрировал ObjectContext в AutoFac с InstancePerLifetimeScope, это означало, что новый ObjectContext создавался для каждого веб-запроса.

Теперь кажется, что один и тот же ObjectContext используется всегда, если я не понял что-то о том, как EF кэшируется.

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

Кто-нибудь знает, где я здесь ошибся?

Ответы [ 3 ]

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

Я бы предположил, что ваш заказ IControllerFactory виноват.Если вы используете новейшую интеграцию Autofac / MVC, используйте AutofacDependencyResolver, а не фабрику контроллера.

Если вы используете более старый Autofac / MVC, используйте прилагаемую фабрику контроллера и убедитесь, что ContainerDisposalModule, описанный вAutofac Wiki правильно настроен в Web.config.

1 голос
/ 20 июня 2011

Вы должны настроить его следующим образом

builder.RegisterType<MyContext>().As<IDataContext>().AsSelf()
    .InstancePerHttpRequest();
0 голосов
/ 20 июня 2011

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

Так что я думаю, что вы не должны распоряжаться своей областью в конце запроса?

...