首页 > 解决方案 > 创建多个具有依赖关系的孩子的服务

问题描述

如果我想要一个创建多个具有可注入依赖项的对象的服务,我该如何编写代码?

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.

也许这意味着我必须创建某种工厂对象,它知道如何创建InjectedDependency. 我无法提供更多代码,因为我不知道如何用 C# 表达我需要什么。

我将内置 DI 与 .NET Core 2.2 一起使用。

标签: c#dependency-injection

解决方案


你确实需要一个工厂:

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以直接从容器中获取新服务,因为它已经一个工厂。然而,许多人可能会认为这是一种代码异味,并且服务定位器模式(这就是它本来的样子)现在并没有受到高度重视。其他人可能会认为在工厂之上实施工厂是一种浪费。我想没有正确的方法,无论您做什么,您都将不得不与一些人说错了。


推荐阅读