3

我正在使用ASP.Net核心,並且我有訪問業務邏輯類(而不是控制器或操作)中的特定HTTP頭的要求。在ASP.Net中訪問HTTP頭核心業務邏輯

爲了提供這裏的配置的完整圖片,我有一個自定義的ASP.Net核心中間件,它基於一些邏輯將添加一個值到一個自定義的HTTP頭中,這是我需要訪問這個頭的值在業務邏輯類中。

目前我實現這一目標的方式是注入一個HttpContextAccessor,使用下面的DI註冊。

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

在其需要訪問HTTP頭的I類,然後使用構造器注入請求IHttpContextAccessor並使用它來訪問相關的HTTP標頭。

做上述工作正常,給我我需要的結果,在互聯網上瀏覽各種文章但是一般的共識似乎是避免使用ASP.Net核心中的HttpContext.Current。

如果以上情況,是否有更好的方法讓我的業務邏輯類訪問我的自定義中間件插入到自定義HTTP標頭中的值?

我應該清楚,雖然目前中間件正在將所需的值存儲在HTTP標頭中以供業務邏輯類使用,但我可以使用中間件的其他方法來使業務邏輯類具有所需的值如果有更好的方法。

任何問題或澄清,請讓我知道。

+0

某些實現需要訪問上下文才能獲取值。但是,這不應該是業務層。創建一個提供所需標題值的服務。該課程將考慮上下文。然後,類抽象將成爲業務類的依賴關係 – Nkosi

+0

實際上 - 此時正在處理上下文的服務類。我應該在這裏更具體一些,但通過參考一個業務邏輯課,我只是想明確表明這不是一個控制器或行爲。所以一般來說,傳遞一個訪問HTTP Context的服務似乎是你正在推薦的東西? –

回答

0

ASP.Net Core中沒有HttpContext.Current,所以很容易避免使用它。如果你需要的話,你將不得不實現你自己的擴展方法,但是.Net Core社區的普遍感覺是使用IHttpContextAccessor要好得多。

在早期版本的.Net Core中,IHttpContextAccessor的實現自動註冊在DI容器中。在更新版本,你必須用你自己的代碼你提到的在線註冊吧:

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 

注入IHttpContext到你的方法需要頭的訪問是一個可行的辦法。或者,如果您喜歡,您可以使用幫助器方法,將頭文件的副本放在一個更簡單的結構中,然後將該對象傳遞給您的課程,因爲它不需要訪問完整的HttpContext

+0

我不知道如果不用調整ASP.Net編程模型,這是否可行:使用過濾器或中間件從頭構建對象並將其注入控制器? –

+0

我認爲這將是非常可行的。例如,您可以使用返回AppHeaders對象的DI容器註冊AppHeadersAccessor對象。你甚至不需要中間件或動作過濾器,因爲AppHeadersAccessor對象可以通過構造函數注入接收HttpContextAccessor對象(假設你在我的答案中提到了註冊它)。因此,它具有將AppHeaders對象填充您想要的標題信息。 –