Как реализовать datcontext для каждого запроса / потока с использованием заводского шаблона

#c# #.net #entity-framework-4.1 #ninject

#c# #.net #entity-framework-4.1 #ninject

Вопрос:

Используя этот пример проекта в качестве руководства, я настраиваю новый проект. Мой проект будет следовать той же базовой архитектуре, только в дополнение к проекту mvc у меня также будет проект веб-службы wcf (или, возможно servicestack.net )

Вместо того, чтобы использовать Unity для DI, как в примере, я использую Ninject. В настоящее время я настраиваю Ninject следующим образом, чтобы создавать только один экземпляр фабрики базы данных для каждого веб-запроса (и, следовательно, один класс datacontext для каждого запроса (сначала используя код EF 4.1, кстати))

  kernel.Bind<IDatabaseFactory>()
       .To<DatabaseFactory>()
       .InScope(ctx => HttpContext.Current);
  

Мне любопытно, достаточно ли этого метода? Или было бы лучше позволить заводскому классу обрабатывать создание экземпляра datacontext для каждого http-запроса (и, возможно, для каждого потока, если в будущем я буду разрабатывать интерфейсы, отличные от веб-интерфейса)? Если да, есть ли какие-либо примеры того, как это сделать?

Или есть совершенно лучшее решение для решения этой проблемы?

Ответ №1:

Вы должны использовать .InRequestScope() вместо .InScope(ctx => HttpContext.Current) . Это гарантирует, что используется соответствующая область видимости в зависимости от того, запрашивается ли экземпляр через WCF или через ASP.NET MVC. К сожалению, чтобы в полной мере воспользоваться этим, вам придется использовать текущие сборки непрерывной интеграции из http://teamcity.codebetter.com . Смотрите также

https://github.com/ninject/ninject.extensions.wcf

https://github.com/ninject/ninject.web.mvc