Пользовательский пользователь в ASP.NET MVC 2 - PullRequest
3 голосов
/ 26 июля 2010

Я пытаюсь реализовать пользовательский объект пользователя в ASP.NET MVC 2. Я видел решение, в котором вы можете сделать что-то волшебное в Global.asax, чтобы превратить Controller.User в другой тип, скажем, CustomUser.Но Controller.User по-прежнему является IPrincipal, что означает, что я должен приводить его в CustomUser каждый раз, когда я хочу его использовать, и мне это совсем не нравится.

Будет ли это считаться неправильным или плохимна практике, чтобы иметь базовый контроллер с методом GetUser (), где GetUser () вызывает пользовательский репозиторий и использует Controller.User для получения нашего собственного пользовательского объекта?

То, что я пытаюсь сделать, это просто добавить пару свойств к объекту пользователя.

Ответы [ 3 ]

1 голос
/ 26 июля 2010

Вот что я бы сделал:

В global.asax.cs

protected void Application_PostAuthorizeRequest()
{
    if (HttpContext.Current.User != null && HttpContext.Current.User.Identity != null && !string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name))
    {
        HttpContext.Current.Items["User"] = userRepo.FetchByUsername(HttpContext.Current.User.Identity.Name);
    }
}

public static CustomUser CurrentUser
{
    get
    {
        return HttpContext.Current.Items["User"] as CustomUser;
    }
}

тогда у вас есть удобная статика с текущим пользователем.Это грязный, но эффективный способ сделать это.

Конечно, действительно, я бы добавил пользователя в свой контейнер IOC и внедрил бы его в свои контроллеры через ControllerFactory с включенным IOC.Это «правильная» вещь.

Что бы вы ни делали, не используйте базовый класс!Использование статики, вероятно, более удобно в долгосрочной перспективе, чем создание огромного базового класса со всеми «удобными» вещами, которые вам нужны.

1 голос
/ 26 июля 2010

Будет ли это неправильно или плохо практика, чтобы иметь базовый контроллер с помощью метода GetUser (), где GetUser () вызывает пользовательский репозиторий и использует Controller.User, чтобы получить наш собственный пользовательский объект?

Я так не думаю. Это способ, которым я делаю это. ;)

0 голосов
/ 26 июля 2010

Это способ сделать это, однако вы бы хотели минимизировать количество, необходимое для приведения объекта пользователя, чтобы минимизировать нарушение принципа подстановки Лискова: http://en.wikipedia.org/wiki/Solid_%28object-oriented_design%29

Вместо того, чтобы приводить его каждый разРазве вы не можете что-то похоронить в ActionFilter?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...