我想要检查在 Startup.cs
中建立的类型注册在运行时是否都是有效的(可以在启动服务或测试套件的一部分中进行)。 Lamar 和其他容器中都有类似这样的功能。
我想要检查在 Startup.cs
中建立的类型注册在运行时是否都是有效的(可以在启动服务或测试套件的一部分中进行)。 Lamar 和其他容器中都有类似这样的功能。
ASP.NET Core 3.x 实际上引入了一个作用域和提供程序验证的功能。这两个功能在不同的情况下都非常有用(参见下面的帖子和示例代码)。
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseDefaultServiceProvider((context, options) =>
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
options.ValidateOnBuild = true;
});
https://andrewlock.net/new-in-asp-net-core-3-service-provider-validation/
Type[] dependencies
参数来声明它的依赖关系,那么就可以反射这个参数并使用常规的验证技术。 - AdamALGetRequiredService<T>
初始化服务。如果有问题,它将抛出异常。更多信息请参见https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.serviceproviderserviceextensions.getrequiredservice?view=aspnetcore-2.2。IServiceCollection
实际上是可枚举的 ServiceDescriptor
,其中包含已注册服务和实现的类型信息。服务集合通常不会被注册,但在托管服务中捕获服务集合和服务提供程序应该是可能的。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddServicesValidation();
}
public static class ValidateServicesExtensions
{
public static IServiceCollection AddServicesValidation(this IServiceCollection services)
{
services.AddHostedService<ValidateServices>(provider => new ValidateServices(services, provider));
return services;
}
}
IOptions<TOption>
上出现了错误,但我相信我们可以想出些解决方案?
ValidateServices.cs
public class ValidateServices : BackgroundService
{
private readonly IServiceCollection services;
private readonly IServiceProvider provider;
public ValidateServices(
IServiceCollection services,
IServiceProvider provider
)
{
this.services = services;
this.provider = provider;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = provider.CreateScope();
foreach (var service in services)
{
_ = scope.ServiceProvider.GetRequiredService(service.ServiceType);
}
return Task.CompletedTask;
}
}