Я только начинаю переносить приложение на ASP.net MVC, и у меня есть объект, содержащий состояние приложения (он отслеживает определенные процессы, запущенные на машине, запускается и останавливается по мере необходимости, а также отправляет / получает сообщение MSMQ).
Где мне хранить этот предмет? В моем текущем приложении (на основе HttpListener) это синглтон, однако я знаю, что синглтоны затрудняют тестирование. Было бы трудно смоделировать или протестировать этот объект, по крайней мере, в контексте самого приложения MVC, и в любом случае у него есть собственный набор тестов вне приложения. Однако для тестирования может потребоваться его замена заглушкой.
Объект должен быть доступен для нескольких контроллеров. Где я должен хранить этот объект и как сделать его доступным для контроллеров? Я никогда не видел подобного случая, описанного в примерах ASP.net MVC, которые я видел.
UPDATE:
Полагаю, мне нужно объяснить, почему я не могу сохранить эти данные в базе данных. Сначала я должен объяснить, что делает приложение:
Приложение обслуживает изображения, которые динамически генерируются рядом «движков», которые являются процессами, запущенными на сервере, и которые передаются через MSMQ. Позволяет вызвать объект, который я задаю вопрос о EngineManager. Процесс идет примерно так:
- Клиент отправляет XML-запрос на сервер с указанием имени используемого «движка», а также ряда параметров, описывающих изображение.
- Приложение проверяет EngineManager, чтобы увидеть, работает ли этот двигатель. Если нет, то запускается.
- Приложение отправляет сообщение MSMQ в движок и ожидает ответа.
- Приложение отправляет сгенерированное изображение обратно клиенту.
- Если в какой-то момент двигатель выключается или выходит из строя, приложение должно знать об этом, чтобы его можно было перезапустить при следующем запросе к этому двигателю.
- Когда приложение выключается, все двигатели также выключаются.
Есть несколько контроллеров, которые обрабатывают эти запросы, каждый из которых выполняет свою работу несколько иначе. Все они должны взаимодействовать с одним и тем же EngineManager, как и в некоторых ситуациях, для синхронизации доступа к другим ресурсам.
Как видите, это не обычный веб-сервер, поддерживаемый базой данных.