如何在ASP.NET Core中验证DI容器?

Mar*_*ich 22 c# dependency-injection asp.net-core

在我的Startup课程中,我使用该ConfigureServices(IServiceCollection services)方法设置我的服务容器,使用内置的DI容器Microsoft.Extensions.DependencyInjection.

我想在单元测试中验证依赖图,以检查是否可以构造所有服务,以便我可以修复在单元测试期间丢失的任何服务,而不是让应用程序在运行时崩溃.在之前的项目中,我使用了Simple Injector,它有一个.Verify()容器的方法.但我无法找到任何与ASP.NET Core类似的东西.

是否有任何内置(或至少推荐)的方法来验证是否可以构建整个依赖图?

(我能想到的最愚蠢的方式就是这样,但由于框架本身注入了开放的泛型,它仍然会失败):

startup.ConfigureServices(serviceCollection);
var provider = serviceCollection.BuildServiceProvider();
foreach (var serviceDescriptor in serviceCollection)
{
    provider.GetService(serviceDescriptor.ServiceType);
}
Run Code Online (Sandbox Code Playgroud)

Ily*_*kov 15

ASP.NET Core 3 中添加了内置的 DI 容器验证Development,默认情况下仅在环境中启用。如果缺少某些东西,容器在启动时会抛出一个致命的异常。

请记住,默认情况下控制器不会在 DI 容器中创建,因此在控制器在 DI 中注册之前,典型的 Web 应用程序不会从该检查中获得太多信息:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddControllersAsServices();
}
Run Code Online (Sandbox Code Playgroud)

要禁用/自定义验证,请添加一个IHostBuilder.UseDefaultServiceProvider调用:

public class Program
{
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            //...
            .UseDefaultServiceProvider((context, options) =>
            {
                options.ValidateOnBuild = false;
            });
Run Code Online (Sandbox Code Playgroud)

此验证功能有几个限制,请在此处阅读更多信息:https : //andrewlock.net/new-in-asp-net-core-3-service-provider-validation/