生成函数工厂在简单注入器
本文关键字:工厂 注入器 简单 TService TParam2 函数 TParam1 | 更新日期: 2023-09-27 18:11:31
我在容器中注册了一些服务。以及一些依赖于此服务的类型和短活参数。例如:
public class Foo
{
public Foo(IService1 svc1, IService2 svc2, int entityId) { }
}
我想要的是一些方法来自动生成工厂创建这样的对象,而无需手动编码每个工厂。我可以使用Func<int, Foo>
或创建一些IFooFactory
(与CreateFoo(int entityId)
方法),我想让简单注入器自动生成这个工厂的实现(以某种通用的方式为任何参数计数)。
有可能吗?
构建DI库是为了创建长期服务的对象图。您试图滥用容器来构建一个短暂存在的类。像实体、消息和dto这样的短寿命对象通常被称为newables,因为您应该手动创建它们,而不是让您的组合根或容器自动为您连接它们。
如果此Foo
是一个实体,则不应该将依赖项注入到实体的构造函数中。应改为方法注射;一个实体有多个域方法,这些方法应该指定它们需要的依赖关系。调用该域方法的组件可以将这些依赖项注入到其构造函数中。在运行时,您可以将这些依赖项传递给实体的方法。
将运行时数据与编译时依赖关系混合到类的构造函数中有许多缺点。例如,它使您的对象图难以验证,这当然适用于注入Func<TParam1, TParam2, Entity>
。以一个类为例,该类接受两个相同类型的参数,例如public Bar(IService1, int a, int b)
,并将相应的Func<int, int, Bar>
方法注入消费者。但是,如果将Bar
更改为public Bar(IService1, int b, int a)
(与a
和b
交换)怎么办?在这种情况下,代码将在运行时失败;编译器和我们的DI库都无法为我们检测到这个
看一下SimpleInjector github页面中的AutomaticParameterizedFactoryExtensionsTests类。它有一个测试方法,解释了如何使用AutomaticParameterizedFactoryExtensions,这似乎是您所要求的。
这个类在SimpleInjector中。