В MVC, где находится код для фоновых задач? - PullRequest
1 голос
/ 18 декабря 2010

Я использую ASP.NET, но я уверен, что это относится к любым (или большинству) средам MVC.

Когда создается новый веб-проект, вы получаете базовую структуру папок / семантики для вашего кода:

  • Контроллеры (запросы на обслуживание от браузеров)
  • Модели (хранение и обработка данных)
  • Просмотры (HTML-страницы)
  • Контент (статический контент
  • Скрипты (JavaScript)
  • App_Data (файлы базы данных)

Это нормально, но что, если я хочу иметь код, который запускается отдельно от запросов браузера - например, возможно, запрос выполняет некоторый код, но в другом потоке, и продолжает выполняться после того, как запрос завершено. Или если код просто периодически запускается независимо от запроса.

В моем случае код будет работать с данными - генерировать их, очищать и т. Д. - что заставляет меня думать, что они должны использоваться в моделях. Но он не «моделирует» данные, он просто работает с ними в фоновом режиме. Есть ли семантическое место для такого рода вещей?

1 Ответ

1 голос
/ 18 декабря 2010

Вы можете использовать очереди здесь, такие как MSMQ, RabbitMQ и т. Д. Каждый запрос, который должен быть выгружен, может быть поставлен в очередь, и внешняя служба будет извлекать элементы из очереди и начинать обрабатывать их один за другим. Сам сервис может быть обычным сервисом Windows, хотя вы можете использовать WCF здесь. Вы даже можете интегрировать рабочий процесс в него для более сложных сценариев обработки. Я обычно создаю отдельное пространство имен под названием «services.servicename» для этих типов проектов.

EDIT: Вы, наверное, смотрите на 2 части здесь. Чтобы что-то подобное работало, вам понадобится служба, которая будет принимать запросы из вашего приложения и добавлять их в очередь. И еще один сервис, который фактически обрабатывает очередь. Вы, вероятно, смотрите на 3 различных проекта в своем решении для достижения этой цели. Я уже делал это с WCF раньше, поэтому мои предложения основаны на технологии WCF. Вот как будет выглядеть структура вашего проекта.

  1. MyCompany.Services.QueueRequest - принимает запросы от вашего приложения.
  2. MyCompany.Services.QueueRequestContract - Предоставляет контракт (интерфейс), который позволяет вашему приложению взаимодействовать со службой QueueRequest.
  3. MyCompany.Services.QueueProcessor - Фоновый процессор.

Ваша служба QueueRequest будет реализовывать интерфейс в пространстве имен QueueRequestContract вместо своего собственного. Мы делаем это для того, чтобы мы могли повторно использовать этот контракт на уровне приложений для связи со службой. Так это выглядит примерно так.

Ваше приложение -> QueueRequestContract (IMyService) -> Служба QueueRequest (реализует IMyService).

...