Рассмотрим этот работник класс: < /p>
using Job.Interfaces;
using Job.Tasks;
namespace Job.WorkerService;
public sealed class Worker(IServiceProvider serviceProvider, ILogger logger) : BackgroundService
{
// ...
private ITask CreateTask(string taskName)
{
var taskType = // ...
return (ActivatorUtilities.CreateInstance(serviceProvider, taskType) as ITask)!;
}
}
< /code>
Этот код работает нормально, но он не кажется правильным. В частности, я должен внедрить ServiceProvider для работника, потому что мне это нужно для создания объектов задач с ActivatorUtilities.createInstance. Делая это, мой DI стал странным. Передача всего IserviceProvider поражает причину использования DI в первую очередь, потому что я передаю весь контейнер работнику, а не только то, что ему нужно для создания. Я думал о 3 подходах. Они мне не очень нравятся. Ищу лучшие подходы: < /p>
Поместите метод CreateTask в завод, затем введите там ServiceProvider и зарегистрируйтесь в контейнер DI. Это исправит мою проблему с классом работников, но создание другого класса TaskFactory и, возможно, другого интерфейса itaskFactory, чтобы Incapsulation один очень маленький метод кажется мне громоздким. Мне не нужно будет вводить ServiceProvider, так как функция Lambda будет иметь ее в программе. CS. Я также не хочу такого подхода, так как функция лямбда не имеет никакой другой причины быть там. Это плохо, потому что я буду динамически создавать задачи на основе конфигурации из базы данных, я не буду использовать все из них. Может, я что -то упускаю. Есть лучший подход?
Подробнее здесь: https://stackoverflow.com/questions/795 ... teinstance