в ASP.Net MVC, какой самый элегантный способ доступа к объектам, хранящимся в сеансе? - PullRequest
0 голосов
/ 21 сентября 2009

В моем проекте asp.net mvc я сохраняю два объекта в сеансе, когда пользователь входит в систему. Один - это объект пользователя (представляющий зарегистрированного пользователя), а другой - объект организации (представляющий организацию пользователя).

Мне нужно, чтобы один или оба этих объекта были доступны в каждом методе действия. Какой самый элегантный способ справиться с этим? На данный момент каждое действие принимает параметры для каждого из этих объектов, с помощью пользовательского связывателя модели, извлекающего объекты из сеанса. По крайней мере, это инкапсулирует доступ к сеансу, но раздражает наличие параметров в каждой сигнатуре метода. Есть ли лучший способ?

Вот как выглядит большинство методов действия.

    public ActionResult Pending(IUser CurrentUser)
    {
        var users = CurrentUser.GetMyOrgPendingUsers();
        return View(users);
    }

Ответы [ 3 ]

1 голос
/ 21 сентября 2009

Поскольку вам требуется доступ к IUser практически при каждом действии, у вас может быть базовый контроллер, из которого происходит любой другой контроллер. В базовом контроллере поместите IUser в качестве переменной-члена и переопределите Метод OnActionExecuting () в базовом контроллере, в который можно поместить код для доступа к переменным сеанса.

OnActionExecuting () будет вызываться каждый раз, когда вызывается действие.

0 голосов
/ 21 сентября 2009

Я бы переосмыслил использование IPrincipal здесь - он очень удобен и позволяет очень легко разобраться с остальными битами аутентификации .NET.

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

0 голосов
/ 21 сентября 2009

Класс Controller имеет свойство User. Рассматривали ли вы использовать это, а не разрабатывать собственный способ отслеживания текущего пользователя?

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