c# - 创建多个具有依赖关系的孩子的服务
问题描述
如果我想要一个创建多个具有可注入依赖项的对象的服务,我该如何编写代码?
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 一起使用。
解决方案
你确实需要一个工厂:
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
以直接从容器中获取新服务,因为它已经是一个工厂。然而,许多人可能会认为这是一种代码异味,并且服务定位器模式(这就是它本来的样子)现在并没有受到高度重视。其他人可能会认为在工厂之上实施工厂是一种浪费。我想没有正确的方法,无论您做什么,您都将不得不与一些人说错了。
推荐阅读
- angular - 当我将 gsap 动画放在角度 ngOnInit 函数中时,它只播放一次
- android-uiautomator - 如何在 Android UI Automator 中按相机点击图像?
- node.js - Mongoose 填充功能在 .find() 之后不起作用
- certificate - 充气城堡管理局信息访问扩展
- react-native - React-native Drawer Navigator 打开但单击项目不会更改视图
- python-3.x - TensorFlow DQN 无法解决 OpenAI Cartpole
- angular - 语义 ui 侧边栏不工作在角度
- scala - 在 IntelliJ 中调试 sbt 项目
- python-3.x - 在背景图像上绘制神经网络中权重的热图
- typescript - Typescript:如何实现具有条件返回类型的可调用类型?