@mishkaaaaaa

Как использовать конкретную зависимость в ASP.NET Core DI?

Есть классы с такой вложенностью
class Parser {
   public Parser() {}
}

class Reader {
   Parser _parser;
   string _name;
   Uri _link;

   public Reader(Parser parser, IOptions<ReaderOptions>) {}
}

class Service : IHostedService {
  Reader _reader;

  public Service(Reader reader) {}
}


Я хочу при каждом новом добавлении инстанса Service делать новый инстанс класса Reader с разными параметрами. То есть нужно примерно такое:
services.AddHostedService<Service>().For<ReaderOptions>(p => new ReaderOptions("1", "2"));
services.AddHostedService<Service>().For<ReaderOptions>(p => new ReaderOptions("3", "4"));
services.AddHostedService<Service>().For<ReaderOptions>(p => new ReaderOptions("5", "6"));


Не понимаю, как это сделать средствами стандартного IoC из ASP.NET Core 3.0. Даже если Reader использовать как Transient-зависимость, то не очень понятно, как заставить каждый раз вызываться конструктор с разными значениями.
  • Вопрос задан
  • 200 просмотров
Решения вопроса 1
sarapinit
@sarapinit
Точу водой камень
В доках вижу вот такую перегрузку:
public static Microsoft.Extensions.DependencyInjection.IServiceCollection AddHostedService<THostedService> (
this Microsoft.Extensions.DependencyInjection.IServiceCollection services, 
Func<IServiceProvider,THostedService> implementationFactory
) where THostedService : class, Microsoft.Extensions.Hosting.IHostedService;


значит вам подойдет что-то вроде:

services.AddHostedService<Service>(sp => new Service(new Reader("1", "2")));
services.AddHostedService<Service>(sp => new Service(new Reader("3", "4")));
services.AddHostedService<Service>(sp => new Service(new Reader("5", "6")));


UPDATE:
Но это не работает, потому что регистрации для одного типа перезаписывают друг друга.
mishkaaaaaa, вы уверены что вам нужен именно HostedService (как служба работающая в фоне)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman
C# the best
IoC контейнер выбирает реализацию по только по типу. Скорее всего вам проще сделать фабрику, предавать её в контейнер, а в нужном месте вызывать фабрику с необходимыми параметрами
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы