Поставщик услуг не может разрешить интерфейс IToDo
, так как он не был зарегистрирован в коллекции служб.
Таким образом, вы уже зарегистрировали реализацию ToDo
в качестве единственной размещенной службы.
services.AddSingleton<IHostedService, ToDo>();
services.AddSingleton<IHostedService, DoSomethingWithToDo>();
Я бы предложил немного изменить его структуру, если вы хотите использовать интерфейс в конструкторе другого сервиса.
Поскольку у сервиса простой конструктор, вы можете инициализировать его в корне композиции и применитьнеобходимая регистрация
var todo = new ToDo();
services.AddSingleton<IToDo>(todo);
services.AddSingleton<ToDo>(todo);
services.AddSingleton<IHostedService>(todo);
services.AddSingleton<IHostedService, DoSomethingWithToDo>();
Таким образом, интерфейс, введенный в конструктор DoSomethingWithToDo
, будет использовать синглтон, определенный при запуске
Если ToDo
также имеет зависимости через внедрение конструктора, он можетследуйте аналогичному шаблону, но теперь нам нужно будет использовать фабрику делегатов для отсрочки инициализации, чтобы можно было разрешить и внедрить зависимости.
//adding implementation first
services.AddSingleton<ToDo>();
//adding options for interfaces
services.AddSingleton<IToDo>(_ => _.GetService<ToDo>());
services.AddSingleton<IHostedService>(_ => _.GetService<ToDo>());
//...
services.AddSingleton<IHostedService, DoSomethingWithToDo>();