ASP.net MVC:Где хранить данные приложения?
-
03-07-2019 - |
Вопрос
Я только начинаю перенос приложения на ASP.net MVC, и у меня есть объект, поддерживающий состояние приложения (он отслеживает определенные процессы, запущенные на компьютере, запускает и останавливает по мере необходимости и отправляет / получает сообщение MSMQ).
Где я должен хранить этот объект?В моем текущем приложении (основанном на HttpListener) это синглтон, однако я знаю, что синглтоны затрудняют тестирование.Было бы трудно смоделировать или протестировать этот объект, по крайней мере, в контексте самого приложения MVC, и в любом случае у него есть собственный набор тестов вне приложения.Однако для тестирования его, возможно, потребуется заменить заглушкой.
Объект должен быть доступен нескольким контроллерам.Где я должен хранить этот объект и как я должен сделать его доступным для контроллеров?Я никогда не видел такой случай описал в каких ASP.net примеры проектирования MVC, которые я видел.
Обновить:
Наверное, мне нужно объяснить, почему я не могу сохранить эти данные в базе данных.Сначала я должен объяснить, что делает приложение:
Приложение обслуживает изображения, которые генерируются динамически несколькими "движками", представляющими собой процессы, запущенные на сервере, связь с которыми осуществляется через MSMQ.Давайте вызовем объект, которому я задаю вопрос о EngineManager.Процесс происходит примерно так:
- Клиент отправляет XML-запрос на сервер, указывая название "движка", который будет использоваться, а также ряд параметров, описывающих изображение.
- Приложение проверяет EngineManager, чтобы узнать, работает ли этот движок.Если нет, то он запускает его.
- Приложение отправляет сообщение MSMQ в движок и ожидает ответа.
- Приложение отправляет сгенерированное изображение обратно клиенту.
- Если в какой-либо момент движок завершит работу или выйдет из строя, приложение должно знать об этом, чтобы его можно было перезапустить при следующем запросе к этому движку.
- Когда приложение завершает работу, все движки также выключаются.
Существует несколько контроллеров, которые обрабатывают эти запросы, каждый из которых выполняет несколько иную работу.Все они должны взаимодействовать с одним и тем же EngineManager, поскольку ему также необходимо в определенных ситуациях синхронизировать доступ к другим ресурсам.
Как вы можете видеть, это не ваш типичный веб-сервер с поддержкой базы данных.
Решение
Если вы хотите, чтобы этот объект был доступен всем пользователям, т.е.это не зависит от сеанса, вы могли бы посмотреть на сохранение его в состоянии приложения:
http://msdn.microsoft.com/en-us/library/bf9xhdz4 (ПРОТИВ 71).aspx
Однако состояние приложения имеет несколько недостатков, перечисленных на странице, связанной выше, поэтому убедитесь, что эти проблемы не затрагивают вас, прежде чем идти по этому пути.В общем, я держусь подальше от состояния приложения и храню данные приложения во внутренней базе данных.Поскольку вы не хотите идти по этому маршруту, состояние приложения может вас устраивать.
Другие советы
Вы должны передать объект конструктору каждого Controller
экземпляр и все методы действия контроллера должны использовать экземпляр объекта, переданный в Controller
конструктор экземпляра.
Значение по умолчанию ControllerFactory
который поставляется с ASP.NET MVC не позволит вам этого сделать.Однако существуют бесплатные аддонные фреймворки (тот, который мне нравится, - Autofac), которые допускают такой стиль программирования.
Храните данные вашего приложения в базе данных и получайте к ним доступ на уровне модели.Клиент сохраняет только идентификатор сеанса.