Перенос длительной задачи из MVC Web App в WebJob ссылается на одни и те же проекты и повторное использование кода

Я новичок в веб-заданиях, и мне нужно добавить одно из них в существующее веб-приложение MVC (размещенное в Azure) для обработки длительной задачи. Длительная задача выполняет процесс типа ETL, в котором он вызывает несколько внешних веб-сервисов для извлечения данных через SOAP/XML, сохраняет эти данные в базу данных SQL, а затем преобразует данные и загружает сохраненные данные обратно в базу данных. Этот процесс может занять 20-30 минут.

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

Большая часть логики длительной задачи существует на уровне службы, а действие контроллера внутри веб-приложения отвечало за «запуск» задачи.

Веб-приложение использует Autofac для DI.

Как лучше всего поделиться/повторно использовать существующую конфигурацию Autofac из веб-приложения без дублирования кода в приложении WebJob? т. е. может/должно ли веб-задание ссылаться на проект веб-приложения MVC?


person jgill09    schedule 23.10.2016    source источник
comment
Если вы используете Autofac, вы можете создать модуль, который можно использовать повторно. Поместите свои регистрации DI в отдельную сборку и ссылайтесь на нее из вашего MVC и вашего веб-задания. Сказав это, я не думаю, что вам следует повторно использовать регистрацию DI, DI - это конфигурация приложения. Более того, я почти уверен, что все ваши регистрации будут иметь разную область действия, поэтому вы не сможете повторно использовать что-либо или несколько вещей.   -  person Thomas    schedule 24.10.2016
comment
Также Webjob выставляет IJobActivator, который может сделать трюк для внедрения зависимостей.   -  person Thomas    schedule 25.10.2016


Ответы (1)


Интересно, действительно ли вы все еще разделяете процессы - по вашему описанию трудно сказать. Когда вы говорите, что контроллер "запускает" задачу - как это происходит? Возможно, вы захотите сделать так, чтобы контроллер создал новое сообщение в очереди хранилища и запускал веб-задание при получении нового сообщения в той же очереди. Это «стандартный» способ разделения слоев. API webjobs имеет встроенные привязки для очередей хранилища. Что касается архитектуры уровня служб, если вы строите свои приложения (веб-приложение и веб-задание) так, чтобы они использовали интерфейсы для вызова уровня служб, а интерфейсы и службы были реализованы в отдельной сборке/dll, тогда все должно хорошо работать с любым инструментом контейнера DI, таким как Autofaq, но на самом деле это не связано с тем, как процессы размещают ваши службы.

Процесс 1: веб-приложение -> использовать IJobService.CreateJob() -> помещает сообщение в очередь хранения

Процесс 2: веб-задание [триггер из очереди хранилища] -> использовать IJobService.Process() -> обновляет sql db

person Russell Young    schedule 24.10.2016