ASP.NET Core中DI中Add*方法对类的假定

发布时间 2023-10-19 13:40:23作者: JohnYang819

在ASP.NET Core的依赖注入(DI)容器中,当你使用Add*方法和泛型类型来指定要注册的类时,容器会做出以下假设:

(1)类必须是具体类(Concrete Class):使用Add*方法注册的类必须是一个具体的类,不能是接口或抽象类。这是因为你正在为特定服务类型注册一个实际的实现类。

(2)类应该只有一个相关的构造函数:容器假设具体类只有一个公共构造函数可用于依赖注入。如果类有多个构造函数,容器会选择参数最多的构造函数进行解析。如果存在多个构造函数具有相同数量的参数,将会导致运行时错误,需要明确指定要使用的构造函数。

(3)所有构造函数参数必须在容器中注册或具有默认值:容器假设具体类的构造函数参数都有对应的服务在容器中注册。换句话说,如果要注册的类的构造函数需要依赖项,那么这些依赖项也必须在容器中注册。如果构造函数参数没有对应的注册或无法解析,将导致运行时错误。

(a)重写了构造函数,导致无参构造消失,但重写的构造函数,不满足条件,于是报错:

(b)有一个构造函数,满足容器的要求,于是调用该构造函数:

(c)有多个满足容器要求的构造函数,于是调用参数最多的构造函数: