大佬教程收集整理的这篇文章主要介绍了AddSingleton<TService, TImplementation>() 如何工作,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我是依赖注入的新手,我在 asp.net 核心项目中遇到了这一行代码
services.AddSingleton<Tservice,TImplementation>()
@H_502_5@我很困惑“Tservice,TImplementation”用于告诉编译器将返回或/并传递给方法的泛型类型,我对吗?但是有问题的方法没有采用我缺少的任何参数?该方法不应该是这样的:
services.AddSingleton<Tservice,TImplementation>(Tservice a,TImplementation b)
@H_502_5@这个问题已经被问到 AddSingleton<>() vs AddSingleton() 但我不清楚答案,有人可以解释一下这是如何工作的吗?
解决方法
此方法采用两个类型参数
Tservice
和TImplementation
,以及零个方法参数。这个方法的完整签名和实现看起来像
public static IserviceCollection AddSingleton<Tservice,TImplementation>(this IserviceCollection services) where Tservice : class where TImplementation : class,Tservice { if (services == null) throw new ArgumentNullException(nameof(services)); return services.AddSingleton(typeof(TservicE),typeof(TImplementation)); }
类型参数告诉您作为开发人员,您应该期望 IoC 容器对
Tservice
的任何解析都将返回TImplementation
的单个实例。where TImplementation : class,Tservice
的类型安全检查表明返回的实际类必须实现(或成为)Tservice
。实际的
TImplementation
是如何创建的,取决于容器,并依赖于TImplementation
的构造函数上的零个或多个构造函数参数。您的问题“该方法不应该看起来像这样”,通常答案是“不”。原因是该签名要求您有两个实际对象(实际上可能是一个对象通过了两次)已经构建@H_197_47@,这通常首先违背了依赖注入的目的。
类型参数不必@H_197_47@对应于实际的方法参数,尽管它们经常(通常)这样做。在这种特殊情况下,类型参数本身作为
Type
类型的实际参数传递给另一个方法,然后 IoC 实现的其余部分使用这些参数来创建正确的对象。那么他们为什么要这样做而不只是拥有
services.AddSingleton(Type serviCEType,Type implementationTypE)
?。答案在于类型安全。此签名不是类型安全的,因为您可以调用services.AddSingleton(typeof(Animal),typeof(HousE))
,这没有意义并且会在运行时失败。相比之下,services.AddSingleton<Animal,House>()
甚至无法编译。
以上是大佬教程为你收集整理的AddSingleton<TService, TImplementation>() 如何工作全部内容,希望文章能够帮你解决AddSingleton<TService, TImplementation>() 如何工作所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。