【发布时间】:2021-03-13 21:31:44
【问题描述】:
我是依赖注入的新手,我在一个 asp.net 核心项目中遇到过这行代码
services.AddSingleton<TService, TImplementation>()
我很困惑'TService,TImplementation'是用来告诉编译器将返回或/并传递给我的方法的泛型类型我是对的吗?但是有问题的方法不采用我所缺少的任何参数?该方法不应该是这样的吗:
services.AddSingleton<TService, TImplementation>(TService a,TImplementation b)
这个问题已经被问到AddSingleton<>() vs AddSingleton(),但我并不清楚答案,有人可以解释一下这是如何工作的吗?
【问题讨论】:
-
您在链接问题的答案中到底有什么不明白的地方?在不带参数的变体中,当你请求
TService接口时,依赖注入框架会为你创建(或获取)实现对象TImplementation。 -
它的工作方式更像是声明式的,通常服务类型是必需的(服务类型是您在设计时使用的类型或称为设计-时间依赖类型)。实现类型是运行时类型,它的实例被创建并注入到服务类型引用的位置(在构造函数、属性等中)。它只需要类型映射来完成它的工作。有时,创建实例需要一个工厂,因此您可以为其提供一个工厂。最后,有时您已经有了实例,所以只需注册它(而不是实现类型)。
-
有一种特殊情况,服务类型和实现类型相同。这是您使用
AddSingleton<T>或AddSingleton(someInstance)的情况。服务类型(用于后一种用法)派生自someInstance的类型(编译器支持的一个特性)。
标签: c# asp.net-core