c# - 在运行时以编程方式添加/删除服务
问题描述
据我所知,通过 IServiceCollection 添加新服务
有没有办法在运行时添加和删除这些服务?
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
var serviceProvider = services.BuildServiceProvider();
var service = serviceProvider.GetService<IMyService>();
AzureMultiTenantServiceBuilders.Build(services);
}
我试图弄清楚如何在运行时为我们的租户配置额外的 AzureAd,而无需重新启动系统。
public static class AzureMultiTenantServiceBuilders
{
public static void Build(IServiceCollection services)
{
foreach (var tenant in Tenant.GetAll())
{
services.AddAuthentication()
.AddAzureADTenanted(options =>
{
options.ClientId = tenant.ClientId;
options.TenantId = tenant.TenantId;
options.Instance = "https://login.microsoftonline.com";
});
}
我在 ASP.Net Core中发现了在运行时安装一个新的中间件,它与添加中间件很接近,但我想做的是在运行时添加一个服务,所以这没有帮助。
public static class RuntimeMiddlewareExtensions
{
public static IServiceCollection AddRuntimeMiddleware(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Singleton)
{
services.Add(new ServiceDescriptor(typeof(RuntimeMiddlewareService), typeof(RuntimeMiddlewareService), lifetime));
AzureMultiTenantServiceBuilders.Build(services);
return services;
}
public static IApplicationBuilder UseRuntimeMiddleware(this IApplicationBuilder app, Action<IApplicationBuilder> defaultAction = null)
{
var service = app.ApplicationServices.GetRequiredService<RuntimeMiddlewareService>();
service.Use(app);
if (defaultAction != null)
{
service.Configure(defaultAction);
}
return app;
}
}
解决方案
推荐阅读
- django - 如何在 django 中进行预订系统
- r - 绘图仅到达 Y 轴的中间
- google-sheets - Google Sheet Pivot Table 通常比 QUERY 函数慢吗?最佳实践是什么?
- swift - 如何在 macOS 中使用 Swift 或 Objective-C 发送系统键盘事件(带有 maskControl 的上箭头)?
- azure - Azure 无法创建 ARM 模板
- python - Python netmiko 创建文件夹今天日期
- bioinformatics - snakemake 6.0.5:输入文件夹列表和每个文件夹中的多个文件(合并车道)
- java - Java & Gradle & log4j NoClassDefFoundError: org/apache/logging/log4j/LogManager
- javascript - 如何在 vueX 中添加选择下拉过滤器
- python - 如何查找用于特定设备的 ttyUSB