2016-09-14 390 views
2

我喜歡在我的應用程序中爲常見的管道工具(如檢查角色或Razor Html助手等等)提供靜態助手類......但您如何在DI世界中執行此操作?在dotnetcore DI世界中使用助手

像可以說,我希望有一個擴展的輔助檢查,如果用戶是管理員

public static async Task<bool> IsAdmin(this ApplicationUser user) 
... 
if(user.IsAdmin()){...} 

所以前核心,我可以不理會DI和創造的UserManager裏面所有IsAdmin做我需要做的。但是現在有沒有辦法讓這些助手中的UserManager僅僅使用?我能看到的唯一方法是將其注入到控制器中,然後傳入方法中(我覺得這很醜陋)。然後是在Razor視圖中嘗試執行user.IsAdmin()的問題,是否需要將UserManager添加到ViewData集合以將其添加到視圖標記中?

我在這裏錯過了什麼嗎?

謝謝你,史蒂夫

回答

1

首先,如果你剛纔問如何使用靜態類與迪,我會說你的問題是重複的How to use DI inside a static Method in Asp.net Core rc1

但是,正如我看到的,你還有其他問題?

但是現在有沒有辦法讓這些幫助程序中的UserManager以 的方式使用?

是的,有一種方式:Service Locator模式。但它是一個反模式(see this article)。儘可能避免使用這種模式。另請參閱github中的discussion

我能看到的唯一方法是將其注入到控制器,然後通過 一起到方法(我覺得這醜陋的)

我覺得這種方式比你想更好的。我更喜歡這個。

再有就是要在這個剃刀 視圖做user.IsAdmin()的問題,我需要到的UserManager添加到收藏的ViewData到 得到它到視圖中的標記?

在Aspnet內核中,您可以在視圖中注入依賴項,因此不需要使用ViewData。您只需將UserManager注入您的視圖,然後將其作爲參數傳遞給方法即可。看看official docs

1

嗯,你是在談論這裏橫切關注點和一個方式如何我已經看到了ASP.NET MVC核心解決橫切關注點是屬性(如[授權]爲例)。我認爲這是一個優雅的解決方案。

所以,如果我正確理解你的問題,我想你可以用Action Filter來解決這個問題。 Damien Bod前幾天介紹瞭如何使用ActionFilters:https://damienbod.com/2016/09/09/asp-net-core-action-arguments-validation-using-an-actionfilter/

簡而言之,您從ActionFilterAttribute繼承並創建自己的curstom過濾器,稱爲MyCustomFilter或其他。讓這個MyCustomFilter通過DI在其構造函數中請求UserManager。然後在上面控制器的任何操作方法,你說:

ServiceFilter[typeof(MyCustomFilter)] 

而且在MyCustomFilter你ofcourse有邏輯來檢查,如果用戶是IsAdmin,然後採取相應的行動。現在,我一直使用微軟的Unity通過攔截來處理交叉切割問題(你可以在這裏閱讀更多關於這個:https://dannyvanderkraan.wordpress.com/2015/09/30/real-world-example-of-adding-auditing-with-dependency-injections-interception/。但是最後一次我檢查到沒有用於asp.net核心的Unity容器,但是這個人有一個關於它移植到核心的一個偉大的文章:https://dzimchuk.net/post/bring-your-own-di-container-to-aspnet-5-unity我真的想我的攔截回很優雅的解決橫切關注他們,雖然它的工作:。https://github.com/unitycontainer/unity/issues/66手指交叉...