Внедрение текущего пользователя с помощью пользовательского экземпляра Structuremap - PullRequest
0 голосов
/ 16 апреля 2011

Вот что я пытаюсь сделать: я реализовал проверку подлинности формы в ASP.NET MVC.У меня есть интерфейс IUser, который соответствует IPrincipal (System.Security.Principal).Пользовательский IUser имеет дополнительные свойства и может рассматриваться как DTO.Мне нужно использовать этого пользователя в разных слоях.

В настоящее время мой базовый контроллер проверяет, прошла ли проверка подлинности формы, и восстанавливает IUser, как в коде 1 .Я передаю этого текущего пользователя на сервисный уровень, который передает их на доменный уровень, а затем он попадает в события и обработчики событий (доменные события).

Все уровни основаны на интерфейсе, а StructureMap используется в качестве IoC.Мой IoC - это отдельная библиотека классов.

Я ищу способ избежать передачи пользовательской информации каждому методу.Я обнаружил, что могу добавить пользовательский экземпляр класса, как описано в ссылке http://structuremap.net/structuremap/InstanceExpression.htm#section11

. Я планирую создать метод

public void SetCurrentUser(IUser user)
{
    // Something Similart to below ( Below code may be wrong)

    //For<IUser>().TheDefault.IsThis(user);

}

, а

иметь IUser во всехконструкторы классов, которые должны знать о текущем пользователе

Вопросы

1) это правильный способ передачи информации о пользователях во все слои, и вы думаете, что она будет работать.

2) Безопасно ли это, может ли пользователь в одном сеансе быть угнан из другого сеанса?

Спасибо,

Мар

Код (1)

string[] roles = userData.Split(',');
// Create a new Generic Principal Instance and assign to Current User
IUser _currentUser= new User
{
    IsApplicationUser = Convert.ToBoolean(roles[0].ToString()),
    Role = (UserRole)Enum.Parse(typeof(UserRole), roles[1].ToString()),
    Id = new Guid(ticket.Name),
    Email = roles[3].ToString(),
    Name = roles[2].ToString(),
    CompanyName = roles[4].ToString(),
    DealerId = roles[5].ToString(),
    LocationId  = roles[6].ToString()
};

1 Ответ

0 голосов
/ 17 апреля 2011
For<IUser>().HybridHttpOrThreadLocalScoped().Use( container => {
    buildUserInstanceFromThreadCurrentPrincipal();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...