Сервис, который создает несколько дочерних с зависимостями - PullRequest
0 голосов
/ 27 января 2020

Если я хочу иметь службу, которая создает несколько объектов, которые имеют инъекционные зависимости, как мне это кодировать?

public class MyCreator : ICreator
{
  private readonly IAdapter _adapter;
  public MyCreator()
  {
    _adapter = adapter;
  }
  public List<MappedObjects> Map()
  { 
    List<MappedObjects> mo = new List<MappedObjects>();
    foreach (ObjectToMap otm in ObjectToMap)
    {
      mo.Add(new MappedObject(otm, InjectedDependency dep));
    }
  }
}

Если я зарегистрирую MyCreator в DI, он будет знать, как предоставить InjectedDependency?

РЕДАКТИРОВАТЬ: InjectedDependency не один экземпляр, который должен быть передан каждому MappedObject. Я хочу новый экземпляр InjectedDependency для каждого нового MappedObject.

Возможно, это означает, что мне нужно создать какой-то объект Factory, который знает, как создавать экземпляры InjectedDependency. Я не могу предоставить больше кода, потому что я не знаю, как сформулировать то, что мне нужно в C#.

Я использую встроенный DI с. NET Core 2.2.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Вам действительно понадобится фабрика:

public class MyCreator : ICreator
{
  private readonly IInjectedDependencyFactory _factory;

  public MyCreator(IInjectedDependencyFactory factory)
  {
    _factory = factory;
  }

  public List<MappedObjects> Map()
  { 
     return ObjectToMap.Select(otm => new MappedObject(otm, _factory.Create())).ToList();
  }
}

Очевидно, вам придется написать класс фабрики и интерфейс и зарегистрировать их в вашем контейнере DI.


Вы можете также внедрите сам контейнер DI, IServiceProvider, чтобы получать новые услуги непосредственно из контейнера, учитывая, что это уже - фабрика. Тем не менее, многие люди могут посчитать это запахом кода, и шаблон Service Locator (это то, чем он был бы) в настоящее время не пользуется большим уважением. Другие люди могут посчитать расточительным создание фабрики на фабрике. Я думаю, что нет правильного пути, вам придется жить с некоторыми людьми, которые называют это неправильно, независимо от того, что вы делаете.

0 голосов
/ 27 января 2020

Чтобы ваш код тестировался, вам нужно внедрить реализацию InjectedDependency в конструктор MyCreator.

...