我希望能夠在整個應用程序中全局訪問(控制器,HtmlHelpers和其他幫助程序類)中的登錄用戶,而不會收到用戶爲空和使用處理客人(未登錄的用戶)的能力。全球訪問登錄用戶的好方法
這應該在我的UsersRepository中處理嗎?如果是這樣,如何?還是有更好的方法?
我希望能夠在整個應用程序中全局訪問(控制器,HtmlHelpers和其他幫助程序類)中的登錄用戶,而不會收到用戶爲空和使用處理客人(未登錄的用戶)的能力。全球訪問登錄用戶的好方法
這應該在我的UsersRepository中處理嗎?如果是這樣,如何?還是有更好的方法?
您可以編寫一個在每個請求上執行的自定義操作篩選器(將其註冊爲全局篩選器)。這個過濾器會加載用戶(例如從用戶的倉庫中),並將其放在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);
}
}
我喜歡這種方式,請舉個例子嗎? –
可以創建自定義的身份和主類。您的自定義身份類可以擴展您當前使用的任何類別,然後只需添加所需的額外信息即可。
然後在一個全局動作過濾器中,使用您自定義的過濾器覆蓋當前主體。然後,您可以從任何地方像普通身份一樣訪問它,但是如果您需要額外信息,則只需將其投射到您的自定義身份類別即可。這將授予您訪問您的額外信息。
我使用靜態情況下爲 - > http://stackoverflow.com/questions/3964989/how-to-pass-current-user-information-to-all-layers-in-ddd/3969014#3969014 –