Вопрос

Я только начинаю перенос приложения на ASP.net MVC, и у меня есть объект, поддерживающий состояние приложения (он отслеживает определенные процессы, запущенные на компьютере, запускает и останавливает по мере необходимости и отправляет / получает сообщение MSMQ).

Где я должен хранить этот объект?В моем текущем приложении (основанном на HttpListener) это синглтон, однако я знаю, что синглтоны затрудняют тестирование.Было бы трудно смоделировать или протестировать этот объект, по крайней мере, в контексте самого приложения MVC, и в любом случае у него есть собственный набор тестов вне приложения.Однако для тестирования его, возможно, потребуется заменить заглушкой.

Объект должен быть доступен нескольким контроллерам.Где я должен хранить этот объект и как я должен сделать его доступным для контроллеров?Я никогда не видел такой случай описал в каких ASP.net примеры проектирования MVC, которые я видел.

Обновить:

Наверное, мне нужно объяснить, почему я не могу сохранить эти данные в базе данных.Сначала я должен объяснить, что делает приложение:

Приложение обслуживает изображения, которые генерируются динамически несколькими "движками", представляющими собой процессы, запущенные на сервере, связь с которыми осуществляется через MSMQ.Давайте вызовем объект, которому я задаю вопрос о EngineManager.Процесс происходит примерно так:

  1. Клиент отправляет XML-запрос на сервер, указывая название "движка", который будет использоваться, а также ряд параметров, описывающих изображение.
  2. Приложение проверяет EngineManager, чтобы узнать, работает ли этот движок.Если нет, то он запускает его.
  3. Приложение отправляет сообщение MSMQ в движок и ожидает ответа.
  4. Приложение отправляет сгенерированное изображение обратно клиенту.
  5. Если в какой-либо момент движок завершит работу или выйдет из строя, приложение должно знать об этом, чтобы его можно было перезапустить при следующем запросе к этому движку.
  6. Когда приложение завершает работу, все движки также выключаются.

Существует несколько контроллеров, которые обрабатывают эти запросы, каждый из которых выполняет несколько иную работу.Все они должны взаимодействовать с одним и тем же EngineManager, поскольку ему также необходимо в определенных ситуациях синхронизировать доступ к другим ресурсам.

Как вы можете видеть, это не ваш типичный веб-сервер с поддержкой базы данных.

Это было полезно?

Решение

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

http://msdn.microsoft.com/en-us/library/bf9xhdz4 (ПРОТИВ 71).aspx

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

Другие советы

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

Значение по умолчанию ControllerFactory который поставляется с ASP.NET MVC не позволит вам этого сделать.Однако существуют бесплатные аддонные фреймворки (тот, который мне нравится, - Autofac), которые допускают такой стиль программирования.

Храните данные вашего приложения в базе данных и получайте к ним доступ на уровне модели.Клиент сохраняет только идентификатор сеанса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top