Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除ASP.Net核心依赖项注入中的服务_C#_Asp.net Mvc_Dependency Injection_Asp.net Core Mvc - Fatal编程技术网

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

C# 删除ASP.Net核心依赖项注入中的服务,c#,asp.net-mvc,dependency-injection,asp.net-core-mvc,C#,Asp.net Mvc,Dependency Injection,Asp.net Core Mvc,在Asp.Net MVC核心(早期版本、1.0或1.1版)中,依赖项注入绑定在Startup.cs类中配置如下: public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyService, MyService>(); // ... } } 公共类启动 { public voi

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

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService, MyService>();
        // ...
    }
}
公共类启动
{
public void配置服务(IServiceCollection服务)
{
services.addScope();
// ...
}
}
在我的应用程序中,我通常有一个基本启动类,其中泛型绑定定义为以下行的序列:

public abstract class BaseStartup
{
    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<IMyService1, MyService1>();
        services.AddScoped<IMyService2, MyService2>();
    }
}
公共抽象类BaseStartup
{
公共虚拟void配置服务(IServiceCollection服务)
{
services.addScope();
services.addScope();
}
}
然后在我的应用程序中,我继承startup类,并注入其他服务:

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

        services.AddScoped<IMyService3, MyService3>();
        services.AddScoped<IMyService4, MyService4>();
    }
}
公共类启动:BaseStartup
{
公共覆盖无效配置服务(IServiceCollection服务)
{
基本配置服务(服务);
services.addScope();
services.addScope();
}
}
我现在想知道:我如何“覆盖”以前的绑定? 例如,我想删除或修改基类中定义的绑定,如:

services.Remove<IMyService1>(); // Doesn't exist
services.AddScoped<IMyService1, MyBetterService1>();
services.Remove();//不存在
services.addScope();
或者简单地更新绑定:

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

有办法吗?或者,简单地使用与先前定义的绑定相同的接口声明新绑定将覆盖该绑定?

您可以使用普通的集合API删除您的服务:

services.AddScoped<IService>();

var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(IService));
services.Remove(serviceDescriptor);
services.addScope();
var serviceDescriptor=services.FirstOrDefault(descriptor=>descriptor.ServiceType==typeof(IService));
删除(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;
    }
}
公共静态类ServiceCollectionExtensions
{
公共静态IServiceCollection移除(此IServiceCollection服务)
{
var serviceDescriptor=services.FirstOrDefault(descriptor=>descriptor.ServiceType==typeof(T));
如果(serviceDescriptor!=null)服务。删除(serviceDescriptor);
返回服务;
}
}

这听起来很完美,正是我需要的。当我考虑这种方法时,我不知道应该使用什么“键”,而serviceDescriptor就是答案。我想知道为什么他们没有在框架内提供扩展。我会投票给你,并在测试后将答案标记为已接受。超级,在发布答案之前,我已经在本地进行了测试,所以我希望它能起作用。也许他们不认为添加这些额外的方法是一种常见的情况。好吧,如果你测试了,我现在就接受答案。因为我在一个大的重构任务中需要它,所以我的代码还远没有准备好测试!!我已经编辑了您的答案,以尊重这些扩展中使用的流畅API风格,因此可以进行链接调用。这非常有意义。