2017-03-22 109 views
3

在一個Asp.Net MVC核心刪除服務(早期版本中,版本1.0或1.1),依賴注入綁定被配置爲遵循Startup.cs類:在ASP.Net核心依賴注入

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

在我的應用程序,我通常有一個基地啓動類,其中通用綁定定義這些線的序列:

然後在我的申請,我繼承了啓動類,並注入其他服務,以及:

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 ! 

有沒有辦法做到那?或者,也許簡單地使用與之前定義的綁定相同的接口來聲明一個新綁定將覆蓋該綁定?

回答

7

您可以正常使用收集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; 
    } 
} 
+0

這聽起來很完美,這正是我需要的。當我想到這種方法時,我不知道應該使用什麼「關鍵」,然後服務描述符就是答案。我想知道他們爲什麼沒有在框架內提供擴展。一旦我測試過,我會讓你滿意並將答案標記爲已接受。 – kall2sollies

+0

超級,我在本地測試之前發佈的答案,所以我期望它的工作。也許他們不認爲這是增加這些額外方法的常見情況。 –

+1

好的,如果你測試了,我現在接受答案。由於我需要這個重構任務,所以我離準備測試的代碼太遠了! – kall2sollies