2

我正在將項目的數據訪問部分移至WebAPI,並使用Entity Framework Core來完成EF所做的工作。使用存儲庫模式實現依賴注入的混亂-c#EF Core

我知道當使用「控制器」時,首選模式現在依賴依賴注入來創建dbContext。 「你好,世界!」教程顯示通過訪問上下文的例子如下:

private BloggingContext _context; 

    public BlogsController(BloggingContext context) 
    { 
     _context = context; 
    } 

說我遇到的問題是我需要去一層了......因爲我有一個「服務」接口暴露的方法庫。

我試圖把上下文實例進入我的倉庫,但是,當然了,然後當我嘗試新的了服務的一個實例,它需要上下文對象中進行傳遞。我試圖通過發送解決它在一個新的BloggingContext()作爲上下文參數,但收到錯誤:No database provider has been configured for this DbContext.這當然是有道理的,因爲我傳遞的new沒有連接到與其關聯的數據庫。這個連接在Startup.cs中定義,正如我在下面試圖在這個轉換中削減我的牙齒所描述的各種教程中所述。

因此,在我的控制器中給出以下代碼,我該如何調用服務並仍然讓依賴注入執行它在存儲庫級別設計的功能?

[HttpGet("{bool}")] 
    public IActionResult GetRoleNames(bool? isActive) 
    { 
     var service = new SecurityService(); 
     try 
     { 
      return Ok(service.GetRoleNames(isActive)); 
     } 
     catch (Exception ex) 
     { 
      Log.Error("Failed to get list of role names from the API", ex.Message); 
      return BadRequest(ex); 
     } 
    } 

我敢肯定,我有[HttpGet("{bool}")]有點FUBARd,以及因爲GetRoleNames將允許NULL,但解決問題的DI後,我會船到橋頭。

+0

錯字,改變屬性'[HTTPGET( 「{isActive?}」)]'當你達到這個橋 – Nkosi

+0

謝謝,@Nkosi ......我很欣賞的,一個幫助!我想它會咬下我。 – rcastagna

回答

2

使用依賴注入來創建服務(我喜歡有一個接口) -

private readonly ISecurityService _service; 

public BlogsController(ISecurityService service) 
{ 
    _service = service; 
} 

使用構建的服務調用你的方法

[HttpGet("{bool}")] 
public IActionResult GetRoleNames(bool? isActive) 
{ 
    try 
    { 
     return Ok(_service.GetRoleNames(isActive)); 
    } 
    catch (Exception ex) 
    { 
     Log.Error("Failed to get list of role names from the API", ex.Message); 
     return BadRequest(ex); 
    } 
} 

您的安全服務可以具有上下文注入

private readonly BloggingContext _context; 

public class SecurityService : ISecurityService 
{ 
    public SecurityService (BloggingContext context) 
    { 
     _context = context 
    } 
} 

您可以在Configure中的Startup.cs中註冊您的服務ervices方法:在代碼

service.AddScoped<ISecurityService, SercurityService>(); 
+0

謝謝@mcbowes!這幾乎做了訣竅......我不得不將上下文傳遞到Service的構造函數中的存儲庫中,但是它使它工作。而且,我切換到在我的控制器中調用接口。不確定我在實例化SecurityService的具體實現時想到的是什麼,但現在已經修復了。 – rcastagna