加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 删除ASP.Net核心依赖注入中的服务

发布时间:2020-12-15 18:17:31 所属栏目:百科 来源:网络整理
导读:参见英文答案 How to remove a default service from the .net core IoC container?2个 在Asp.Net MVC Core(早期版本,版本1.0或1.1)中,依赖注入绑定在Startup.cs类中配置如下: public class Startup{ public void ConfigureServices(IServiceCollection ser
参见英文答案 > How to remove a default service from the .net core IoC container?2个
在Asp.Net MVC Core(早期版本,版本1.0或1.1)中,依赖注入绑定在Startup.cs类中配置如下:
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService,MyService>();
        // ...
    }
}

在我的应用程序中,我通常有一个基本的Startup类,其中泛型绑定被定义为这些行的序列:

public abstract class BaseStartup
{
    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService1,MyService1>();
        services.AddScoped<IMyService2,MyService2>();
    }
}

然后在我的应用程序中,我继承了启动类,并注入了其他服务:

public class Startup : BaseStartup
{
    public override void ConfigureServices(IServiceCollection services)
    {
        base.ConfigureServices(services);

        services.AddScoped<IMyService3,MyService3>();
        services.AddScoped<IMyService4,MyService4>();
    }
}

我现在想知道:我怎样才能“覆盖”以前的绑定?
例如,我希望删除或修改基类中定义的绑定,如:

services.Remove<IMyService1>(); // Doesn't exist
services.AddScoped<IMyService1,MyBetterService1>();

或者只是更新绑定:

services.AddScoped<IMyService1,MyBetterService1>(replacePreviousBinding: true); // Doesn't exist either !

有没有办法做到这一点 ?或者只是简单地声明一个与之前定义的绑定相同的接口的新绑定将覆盖该绑定?

解决方法

您可以使用普通集合API来删除您的服务:
services.AddScoped<IService>();

var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(IService));
services.Remove(serviceDescriptor);

您还可以创建扩展方法来实现相同的目标:

public static class ServiceCollectionExtensions
{
    public static IServiceCollection Remove<T>(this IServiceCollection services)
    {
        var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(T));
        if (serviceDescriptor != null) services.Remove(serviceDescriptor);

        return services;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读