Хороший подход для глобального доступа к зарегистрированному пользователю

Я хочу иметь глобальный доступ к вошедшему в систему пользователю (контроллеры, HtmlHelpers и другие вспомогательные классы) во всем приложении, не получая исключений, что пользователь имеет значение null и с возможностью обработки гостей (не вошедших в систему пользователей).

Должно ли это обрабатываться в моем UsersRepository? Если да, то как? или есть лучший подход?


person Ken D    schedule 15.07.2011    source источник
comment
Я использую для этого статический контекст -> " title="как передать текущую информацию о пользователе всем слоям в ddd"> stackoverflow.com/questions/3964989/   -  person Arnis Lapsa    schedule 15.07.2011


Ответы (2)


Вы можете создавать собственные удостоверения и основные классы. Ваш собственный класс удостоверений может расширять все, что вы используете в настоящее время, а затем просто добавлять необходимую дополнительную информацию.

Затем в глобальном фильтре действий просто перезапишите текущий принцип своим настроенным. Затем вы можете получить к нему доступ из любого места, как к обычному удостоверению, но если вам нужна дополнительная информация, вы просто приводите ее к своему пользовательскому классу удостоверений. Что предоставит вам доступ к вашей дополнительной информации.

person Daniel Young    schedule 15.07.2011

Вы можете написать собственный фильтр действий, который выполняется при каждом запросе (вы регистрируете его как глобальный фильтр). Этот фильтр загрузит пользователя (например, из репозитория пользователя) и поместит его, например, в контекст 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);
    }
}
person uvita    schedule 15.07.2011
comment
Мне нравится этот подход, какой пример, пожалуйста? - person Ken D; 15.07.2011