c# - 如何验证 ASP.NET Core 中的 DI 容器?

标签 c# asp.net-core dependency-injection

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

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

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

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

startup.ConfigureServices(serviceCollection);
var provider = serviceCollection.BuildServiceProvider();
foreach (var serviceDescriptor in serviceCollection)
{
    provider.GetService(serviceDescriptor.ServiceType);
}

最佳答案

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

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddControllersAsServices();
}

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

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

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

关于c# - 如何验证 ASP.NET Core 中的 DI 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49149065/

相关文章:

c# - zlib.c Adler 实现和 Deflate、Ionic Deflate 之间的 Zlib 压缩差异

c# - 为什么我得到已经有一个与此连接关联的打开的数据读取器必须首先关闭的错误?

html - 在 Asp.Net MVC core 2.2 中使用标签助手时删除 chrome 中的自动日期选择器

c# - Autofac:批量注册开放通用类型

c# - dotnet build - 无法找到包 - 私有(private) nuget 服务器

c# - 不能在不同的命名空间中使用我的新字段

c# - 无法建立 SSL 连接,请参阅内部异常

c# - Asp.net core WEB API 安全的第三方中间件路由?

java - 测试 Jersey 应用程序,使用 Jersey Injection 内置框架注入(inject)类 (HK2)

spring - 如何在 Hibernate UserType 对象中注入(inject)一个 bean?