参见英文答案 >
How to remove a default service from the .net core IoC container?2个
在Asp.Net MVC Core(早期版本,版本1.0或1.1)中,依赖注入绑定在Startup.cs类中配置如下:
在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; } }