En un Asp.Net MVC Core (versiones anteriores, versiones 1.0 o 1.1), los enlaces de inyección de dependencia se configuran de la siguiente manera en la clase Startup.cs:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyService, MyService>(); // ... } }En mis aplicaciones, generalmente tengo una clase de inicio base, donde los enlaces genéricos se definen como una secuencia de estas líneas:
public abstract class BaseStartup { public virtual void ConfigureServices(IServiceCollection services) { services.AddScoped<IMyService1, MyService1>(); services.AddScoped<IMyService2, MyService2>(); } }Luego, en mi aplicación, heredo la clase de inicio e inyecto otros servicios también:
public class Startup : BaseStartup { public override void ConfigureServices(IServiceCollection services) { base.ConfigureServices(services); services.AddScoped<IMyService3, MyService3>(); services.AddScoped<IMyService4, MyService4>(); } }Ahora me pregunto: ¿cómo puedo 'anular' un enlace anterior? Me gustaría, por ejemplo, eliminar o modificar un enlace definido en la clase base, como:
services.Remove<IMyService1>(); // Doesn't exist services.AddScoped<IMyService1, MyBetterService1>();O simplemente actualice el enlace:
services.AddScoped<IMyService1, MyBetterService1>(replacePreviousBinding: true); // Doesn't exist either !Hay una manera de hacer eso ? ¿O tal vez simplemente declarar un nuevo enlace con la misma interfaz que un enlace definido previamente anulará ese enlace?
Puede usar la API de recopilación normal para eliminar sus servicios:
services.AddScoped<IService>(); var serviceDescriptor = services.FirstOrDefault(descriptor => descriptor.ServiceType == typeof(IService)); services.Remove(serviceDescriptor);También puede crear métodos de extensión para lograr lo mismo:
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; } }