2011-07-15 61 views
0

我希望能夠在整個應用程序中全局訪問(控制器,HtmlHelpers和其他幫助程序類)中的登錄用戶,而不會收到用戶爲空和使用處理客人(未登錄的用戶)的能力。全球訪問登錄用戶的好方法

這應該在我的UsersRepository中處理嗎?如果是這樣,如何?還是有更好的方法?

+2

我使用靜態情況下爲 - > http://stackoverflow.com/questions/3964989/how-to-pass-current-user-information-to-all-layers-in-ddd/3969014#3969014 –

回答

0

您可以編寫一個在每個請求上執行的自定義操作篩選器(將其註冊爲全局篩選器)。這個過濾器會加載用戶(例如從用戶的倉庫中),並將其放在http上下文中或者放在ViewData中。

編輯:

好,對過濾器的代碼看起來是這樣的(在這種情況下,它加載用戶的ViewData的集合)。我沒有考慮匿名用戶。

public class LoadUserToViewDataAttribute : ActionFilterAttribute 
{ 
    private IUserRepository _userRepository; 

    public LoadUserToViewDataAttribute(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var controller = filterContext.Controller; 
     var userName = filterContext.HttpContext.User.Identity.Name; 
     var user = _repository.GetUser(userName); 

     controller.ViewData.Add("CurrentUser", user); 
    } 
} 
+0

我喜歡這種方式,請舉個例子嗎? –

1

可以創建自定義的身份和主類。您的自定義身份類可以擴展您當前使用的任何類別,然後只需添加所需的額外信息即可。

然後在一個全局動作過濾器中,使用您自定義的過濾器覆蓋當前主體。然後,您可以從任何地方像普通身份一樣訪問它,但是如果您需要額外信息,則只需將其投射到您的自定義身份類別即可。這將授予您訪問您的額外信息。