ASP.net MVC: где хранить данные приложения? - PullRequest
3 голосов
/ 30 апреля 2009

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

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

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

UPDATE:

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 30 апреля 2009

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

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

1 голос
/ 30 апреля 2009

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

http://msdn.microsoft.com/en-us/library/bf9xhdz4(VS.71).aspx

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

0 голосов
/ 30 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...