在我的 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/