【发布时间】:2017-02-14 07:45:13
【问题描述】:
我正在使用 ASP.NET Core,我正在尝试创建一个具有可选参数的可解析类:
public class Foo
{
public Foo() : this(null)
{}
public Foo(IValidator<FooEntity> validator)
{
}
}
我为这个对象创建了两个构造函数,所以如果找不到依赖项,我会假设它会回退到默认构造函数。
但是,当我运行我的应用程序时,我收到了这个错误
附加信息:尝试激活“Foo”时无法解析“FluentValidation.IValidator`1[FooEntity]”类型的服务
我知道可能有一种方法可以手动解决 Foo 对象的构造问题。但我不希望这样做,因为我必须在没有验证器的情况下为我创建的每个类都这样做。
有谁知道如何配置 ASP.NET Core DI 以在未找到依赖项时回退到不同的构造函数?
编辑
对不起,我之前应该更清楚一点。
我指的这个 Foo 类实际上是一个 CRUD 服务的基类,它将被反复使用。
我正在寻找一种通用解决方案,它不需要我每次都配置我创建的每个服务。
因此,使用 lambda 解决此问题不是一种选择,空对象模式似乎可行,但我无法理解如何编写一个无需为每个服务配置的通用模式
【问题讨论】:
-
拥有多个构造函数is an anti-pattern。依赖项不应该是可选的。您应该改用Null Object pattern。
-
另一种选择是在您的类中使用
IServiceProvider来尝试获取可选依赖项。这样它就不会阻止服务被实例化。不过我会尽量避免这种方法。 -
@juunas:你不应该在你的类中的任何地方注入
IServiceProvider,除了工厂(只有在没有其他解决方案的情况下才在这里) -
@Steven 我的 Foo 类实际上是一个通用的 CRUD 服务,我想使用空对象模式,但是有没有办法通用配置 DI,所以我不必创建一个空每个不需要验证器的服务的验证器?
标签: c# dependency-injection asp.net-core