首页 > 解决方案 > 在运行时以编程方式添加/删除服务

问题描述

据我所知,通过 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;
    }
}

标签: c#.net-core

解决方案


推荐阅读