Несколько запросов из одного браузера GET / POST - PullRequest
0 голосов
/ 25 апреля 2011

Я пишу свое первое приложение MVC (v3) и думаю, что неправильно организовал свои контроллеры.Я был бы признателен за некоторые рекомендации / советы.

Все это произошло, потому что я использую Ninject для внедрения зависимостей и хотел, чтобы он создавал только один экземпляр моего конкретного DataRepository для каждого «запроса».Это достаточно просто сделать, указав InRequestScope () в привязках Ninject ... но после этого я все еще продолжал видеть несколько экземпляров создаваемого моего DataRepository.

После долгого почесывания в голове, я начал наблюдатьсобытие BeginRequest в классе MvcApplication (в файле global.asax).И вот, то, что я считал одним «запросом» - например, одним постбэком из браузера - фактически дало несколько последовательных запросов.Ninject, согласно объявлению InRequestScope (), должным образом создал один экземпляр моего DataRepository для каждого из этих запросов.

К сожалению, это не совсем то, что я хочу.Мне бы хотелось, чтобы один экземпляр DataRepository создавался для этого единственного «запроса», инициированного браузером.Я не вижу, как я могу сделать это через Ninject.Я знаю, что мог бы указать InSingletonScope (), но хотя он будет использовать один экземпляр DataRepository для «запроса», он будет зависать до тех пор, пока веб-приложение не перезапустится.Это вызывает у меня все виды проблем с кэшированием Entity Framework.

При мониторинге событий BeginRequest мне кажется, что каждый раз, когда вызывается другой контроллер, генерируется новый запрос.Оглядываясь назад, это имеет смысл, но это не согласуется с дизайном моего приложения.Например, у меня есть некоторые общие методы действия, к которым примыкают различные другие методы действия (я сделал это вместо того, чтобы дублировать один и тот же код и представления в разных контроллерах).

Все это заставляет меня задуматься о следующем:если я хочу минимизировать количество экземпляров моего DataRepository, я должен минимизировать количество раз, когда один контроллер соединяется с другим контроллером.Это может означать, что мои методы действий должны быть объединены и, возможно, дублированы на нескольких контроллерах.

Это кажется ... странным.Если это правильный путь, хорошо, я могу жить с этим.Но я бы хотел узнать, что мне не хватает чего-то другого в процессе разработки приложений MVC :).Должен ли я, например, централизовать эти общие функции на уровне сервисов и создавать их только один раз за запрос?Если это глупый вопрос, извинения;Я не очень понимаю концепцию сервисного уровня.

1 Ответ

2 голосов
/ 26 апреля 2011

Относительно вашего последнего вопроса: всегда лучше держать контроллеры свободными от какой-либо бизнес-логики. Их главная цель - управлять своим взглядом. Любая бизнес-логика принадлежит надлежащему бизнес-уровню.

Кроме того, я думаю, что это хороший дизайн, чтобы не использовать экземпляры репозитория слишком интенсивно. Любая транзакция должна использовать свой собственный экземпляр. Смотрите «Единица работы». В большинстве случаев это означает один экземпляр на запрос. Хранилища данных только для чтения, таких как каталог продуктов, можно, конечно, использовать повторно, объявив их в единичном объеме.

См .: http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx

...