c# - 在 ASP.Net Core 依赖注入(inject)中删除服务

标签 c# asp.net-mvc dependency-injection asp.net-core-mvc

<分区>

在 Asp.Net MVC Core(早期版本,版本 1.0 或 1.1)中,依赖注入(inject)绑定(bind)在 Startup.cs 类中配置如下:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
        // ...
    }
}

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

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

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

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

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

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

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

或者简单地更新绑定(bind):

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

有办法吗?或者简单地声明一个与先前定义的绑定(bind)具有相同接口(interface)的新绑定(bind)将覆盖该绑定(bind)?

最佳答案

您可以使用普通的收集 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)
    {
        if (services.IsReadOnly)
        {
            throw new ReadOnlyException($"{nameof(services)} is read only");
        }

        var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(T));
        if (serviceDescriptor != null) services.Remove(serviceDescriptor);

        return services;
    }
}

关于c# - 在 ASP.Net Core 依赖注入(inject)中删除服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945859/

相关文章:

c# - 如何从集成测试将文件上传到端点

jquery - 如何使用 MVC、Jquery 和 Ajax 将下拉列表中选定的值发送到 Controller

c# - 在同一个项目中同时使用 AddDbContextFactory() 和 AddDbContext() 扩展方法

C# WebApi 查询参数解析

c# - 服务层分页,分页结果(逻辑放哪?)

c# - IIS 托管 WCF 服务和使用 Windows 身份验证的 SQL 查询

nhibernate - SimpleInjector : Injection does not work with MVC 4 ASP. NET Web API

c# - 在空检查中获取 ObjectDisposedException

asp.net-mvc - 开始学习 ASP.NET MVC 到专家级别的最佳路线图

c# - ASP.NET Core 5 - 如何拥有可选的依赖项?