У меня есть проект с такой структурой
AdventureWorks.Web
<- веб-проект .NET Core (службы, Viewmodels, DataContext, представления контроллера и т. Д.) </li> AdventureWorks.Console
<- консольное приложение .NET Core (сервер конфигурации Hangfire) </li> AdventureWorks.Model
<- только классы чистой модели POCO </li>
Я пытаюсь запустить сервер Hangfire в отдельном процессе (AdventureWorks.Console
) [https://docs.hangfire.io/en/latest/background-processing/processing-jobs-in-console-app.html]
Обработка заданий в консольном приложении.
Я добавил ссылку на AdventureWorks.Web
на AdventureWorks.Console
- таким образом сервер Hangfire будетвыполнить код
static void Main(string[] args)
{
GlobalConfiguration.Configuration.UseSqlServerStorage("Connection");
using (var server = new BackgroundJobServer())
{
Console.WriteLine("Hangfire Server started. Press any key to exit...");
Console.ReadKey();
}
}
В веб-проекте я регистрирую свои службы в Startup
классе
services.AddTransient<IDepartmentServices, DepartmentServices>();
В конструкторе есть параметр, который автоматически вводится
private readonly AdventureWorksDataContext db;
public DepartmentServices(AdventureWorksDataContext _db)
{
db = _db;
}
В контроллер вводятся сервисы
private readonly IDepartmentServices Service;
public DepartmentsController(IDepartmentServices service)
{
Service = service;
}
В одном методе в контроллере, когда пользователь нажимает кнопку «Создать отчет», метод ставит в очередь задание на создание отчета
BackgroundJob.Enqueue<**IDepartmentService**>((serv) => serv.CrearReport(data));
Пока все хорошо.
Я вижу на приборной панели созданное заданиено он не может выполнить
System.MissingMethodException Невозможно создать экземпляр интерфейса.
, что очевидно, поэтому мой первый вопрос
Такчтобы продолжить, я изменяю интерфейс с классом
BackgroundJob.Enqueue<DepartmentService>((serv) => serv.CrearReport(data));
пока все хорошо, задание создано. Но происходит сбой с ошибкой
System.MissingMethodException
Для этого объекта не определен конструктор без параметров
, что очевидно, поэтому мой второй вопрос
- как передать параметр
datacontext
на сервер зависания? Мое лучшее предположение, что я не могу, потому что сервер зависания использует Активатор, который хочет пустой конструктор
Поэтому, чтобы продолжить, я следовал инструкциям здесь [https://docs.hangfire.io/en/latest/background-methods/passing-dependencies.html]
Я создалпустой конструктор
public EmployeeService()
:this(new AdventureWorksDataContext())
{
}
, и мне нужно добавить пустой конструктор в текстовый текст
public AdventureWorksDataContext()
{
}
, но теперь мне нужно переопределить метод "OnConfigure"
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer("????");<--connectionstring???
}
поэтому мой вопрос: как мне получить строку подключения из appsettings.json, мой лучший гость, я не могу игнорировать эту проблему, я добавляю прямое соединение
optionsBuilder.UseSqlServer("Server=.;Database=AdventureWorks2017;Trusted_Connection=True;");
таким образом, работа завершена правильно
но это решение, я думаю, плохое, может быть, структура проекта плохая или как внедрение зависимостей работает с Hangfire, если он работает в отдельном процессе, как работает IoC и консоль сервера hangfire
некоторые, назовите мне лучшее решение, какструктурировать проект
извините за мой английский я не говорю