2017-08-04 54 views
1

我試圖注入的依賴到控制器內部使用的一類,asp.net核心依賴傳球的依賴性沿

//Startup.cs 
public void ConfigureServices(IServiceCollection services){ 
    services.AddMvc();//IDocumentService is a WCF service from our legacy stack 
    services.AddScoped(typeof(IDocumentService),typeof(DocumentServiceClient)); 
} 
//Controller.cs 
[Route("api/eci/test/[action]")] 
public class Controller{ 
    private IDocumentService injectedDocService; 
    public Controller(IDocumentService client){ 
     injectedDocService=client; 
    } 
    [HttpPost({"id"})] 
    public void ingestedDocs(string id){ 
     new Logic(injectedDocService).ingest(id); 
    } 
} 
//Logic.cs 
public class Logic{ 
    private IDocumentService injectedDocServiceActualTarget; 
    public Logic(IDocumentService injected2){ 
     injectedDocServiceActualTarget=injected2; 
    } 
    public void injest(string id){ 
     injectedDocServiceActualTarget.doWork(id); 
    } 
} 

這似乎有點多餘把它注入到目標班級的家長。這是做事的正確方式嗎?

+1

您正在通過在控制器中實例化'Logic'來打破DI模型。讓容器爲你做。 – DavidG

回答

1

您需要註冊Logic,然後將其注入控制器。然後DocumentService將被注入Logic

依賴注入背後的思想是實現IoC(控制反轉)原理。在你的例子中,它只是部分的,因爲你在你的控制器中明確實例化了Logic。如果你想正確執行依賴反轉 - 所有的依賴需要作爲構造參數傳遞。

+0

注入類不是一個好主意(如果你正在進行單元測試)。相反,我會創建接口ILogic,將邏輯實現ILogic並將ILogic注入控制器。 –

+0

@OndrejSvejdar在實際代碼中,Logic是少數業務邏輯類之一,它具有不被其他邏輯類共享的特定方法,建議我製作一個一次性界面,以便爲每個特定項重複所有方法簽名類? –

+0

@Austin_Anderson - 取決於;你想單元測試你的控制器嗎?如果是這樣,你可能需要模擬邏輯類;嘲笑類是非平凡的問題(他們必須讓每一個可模擬的方法都是虛擬的),你也需要調用構造函數。模擬接口非常簡單。如果你沒有進行單元測試,那就做你想做的事吧:) –

1

您應該在接口後面抽象出Logic,只顯示依賴者使用的成員。

public interface ILogic { 
    void injest(string id); 
} 

有邏輯類從抽象派生。

//Logic.cs 
public class Logic : ILogic { 
    private readonly IDocumentService injectedDocServiceActualTarget; 

    public Logic(IDocumentService injected2) { 
     this.injectedDocServiceActualTarget=injected2; 
    } 

    public void injest(string id) { 
     injectedDocServiceActualTarget.doWork(id); 
    } 
} 

控制器應現在只明確依賴該ILogic接口

//Controller.cs 
[Route("api/eci/test/[action]")] 
public class Controller { 
    private readonly ILogic service; 

    public Controller(ILogic service) { 
     this.service = service; 
    } 

    [HttpPost({"id"})] 
    public void ingestedDocs(string id) { 
     service.ingest(id); 
    } 
} 

隨着該做的最後一件事是與服務收集到註冊的所有依賴上。

//Startup.cs 
public void ConfigureServices(IServiceCollection services){ 
    services.AddMvc(); 
    services.AddScoped<IDocumentService, DocumentServiceClient>(); 
    services.AddScoped<ILogic, Logic>(); 
} 

所以現在當控制器被調用時,所有的依賴將被解析並注入到它們各自的依賴項中。