编译时DI容器适配ASP.Net Core:如何编译时确定GetService调用类型
关于ASP.NET Core中编译时收集IServiceProvider.GetService调用类型的问题
我是基于Roslyn源代码生成器的编译时依赖注入(DI)容器MrMeeseeks.DIE的作者。该容器可轻松应用于控制台项目、类库及WPF等UI应用,因为这些项目通常具备可在编译时确定的天然根类型(如Program或App),且完全独立于DI容器(或称“服务提供程序”)。
但ASP.Net Core的情况有所不同,它严重依赖IServiceProvider接口及其唯一方法:
public object? GetService (Type serviceType);
对于编译时DI容器而言,问题在于该方法依赖的Type参数实际上只能在运行时确定,而运行时晚于编译时,容器无法及时做出调整。
我想到的一种可行方案是生成一个基于编译时DI容器的IServiceProvider实现,但要使其生效,必须能在编译时收集到GetService方法可能被调用的所有类型。简言之:给定任意ASP.Net Core应用,如何在编译时全面且自动地确定应用运行时可能传入GetService的所有类型?
目前我能想到的部分类型包括:
- 派生自
ControllerBase的类型 - 标记有
FromServicesAttribute的参数及属性的类型
由于我对ASP.Net Core经验有限,无法确定完整的类型列表,特此寻求帮助。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

