使用 ASP.Net Core 应用的编译时 DI 容器

Compile-time DI Container with ASP.Net Core apps

提问人:Dima 提问时间:9/3/2023 最后编辑:Dima 更新时间:9/4/2023 访问量:76

问:

我是基于 Roslyn Source Generator (MrMeeseeks.DIE) 的编译时依赖注入 (DI) 容器的作者。

该容器很容易适用于控制台项目、库和 UI 应用(如 WPF),因为它们通常具有可以在编译时确定的自然根类型(例如 或),它们与 DI 容器(或者说“服务提供商”)完全不可知。ProgramApp

然而,ASP.Net Core 似乎并非如此。看起来它严重依赖具有单一功能(链接)的界面。在考虑编译时 DI 容器时,问题在于该函数依赖于一个参数,该参数在技术上只能在运行时知道。当然,运行时是在编译时之后出现的,因此对于容器进行适当调整为时已晚。IServiceProviderpublic object? GetService (Type serviceType);Type

我想到的一个可能的解决方案是生成一个使用编译时 DI 容器的实现。但是,要使它起作用,将调用函数的类型需要在编译时可收集。IServiceProviderGetService

长话短说:给定一个任意的 ASP.Net Core 应用,如何在编译时全面、自动地确定所有类型的列表(这些列表可能在任意应用运行中传递到这些类型?GetService

部分答案可能是:

  • 派生自(链接ControllerBase)
  • 标有 (link 的参数和属性的类型FromServicesAttributes)

我对 ASP.Net Core 的经验还很少,所以我没有信心编写此类类型的完整列表。所以我在这里寻求帮助。

asp.net-core 编译时 iServiceProvider

评论

1赞 Tiny Wang 9/4/2023
how can the list of all types-->根据我的搜索,我们没有这种开箱即用的方法来获取所有类型。这看起来不是一个不推荐的选项。避免使用服务定位器模式。例如,当可以改用 DI 时,不要调用 GetService 来获取服务实例
1赞 Emre Bener 9/4/2023
这有帮助吗?stackoverflow.com/a/73086184/18391068
1赞 Emre Bener 9/4/2023
IServiceContainer 扩展了 IServiceProvider,后者为所有已注册的服务提供容器。查看 learn.microsoft.com/en-us/dotnet/api/...
1赞 Tiny Wang 9/5/2023
嗨,根据我的搜索,没有这种开箱即用的方法,您可以去 github 检查源代码......
1赞 Dima 9/5/2023
@TinyWang 好点子。谢谢。我最近尝试克隆 ASP.Net Core 存储库并在 IDE 中打开它。这个想法是要经历 .IDE 崩溃了。我想,我会更加努力,或者可能会在没有 IDE 及其索引的情况下进行全文搜索。GetService

答: 暂无答案