構造函數中依賴注入上下文類

asp.net-core-mvc c# dependency-injection entity-framework-core

我有一個使用ApplicationContext的服務。所以我想使用依賴注入讓應用程序給我上下文。所以我投入了施工

Private _context;

// Constructor
public Service(ApplicationContext context) {
    _context = context
}

問題是,當我初始化這個服務時,我必須傳遞一個上下文,這樣它不是真正的依賴注入嗎?

有沒有辦法在不將它放入構造函數參數的情況下注入上下文?

******編輯*****

對不起,我第一次沒有提供足夠的信息。讓我試著更好地解釋一下。我有一項服務,我現在只打電話給服務。它讀取請求中的頭變量,並根據它們的值返回xml。我在控制器的每個不同方法中新建一個實例,因為它們可能具有不同的標頭變量值。我想將上下文注入服務而不是控制器,所以我可以這樣說:

Service service = new Service(Request);

而不是這個:

Service service = new Service(Request, Context);

服務的原因是在控制器不需要了解任何內容的情況下完成所有工作。我的代碼會起作用,但如果我按照我解釋的方式工作,那將會很棒。

如果我們仍然可以在屬性上[FromServices]。那將是完美的解決方案。不幸的是,這被帶走了。這只會將上下文注入服務或控制器的構造函數中。在這種情況下,我仍然必須將上下文作為參數傳遞給服務。

有沒有辦法將上下文注入到服務構造函數中,並避免在創建時將其作為參數傳遞?

可能會有一個更優雅的解決方案,我很樂意考慮。

一般承認的答案

它是構造函數的依賴注入。使用DI,您不應直接初始化您的服務。您應該在Startup.cs中註冊您的ServiceApplicationContext

當您需要服務時,應將其通過構造函數注入控制器,DI鏈將自動將ApplicationContext實例注入服務。

當然,如果您不需要為控制器中的每個方法提供服務,可以將其初始化為方法,如@Oleg所寫。


熱門答案

我的控制器只有一個方法,然後引入單獨的構造函數只是為了保存ApplicationContext沒有任何優勢。上下文已經保存在HttpContext ,您可以使用[FromServices]屬性作為控制器操作的附加參數。請參閱文檔 。例如

[Route("api/[controller]")]
public class MyController : Controller
{
    [HttpGet]
    public async IEnumerable<object> Get([FromServices] ApplicationContext context,
                                         MyType myMainParam)
    {
        ...
    }
}

RC1允許使用[FromServices]定義屬性以從依賴注入中獲取信息,但是RC2不會允許這樣做(參見公告 )。您可以在答案中找到兩種樣式的示例。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因