Передача ASP.NET пользователя путем внедрения зависимостей - PullRequest
4 голосов
/ 13 мая 2010

В моем веб-приложении у меня есть различные компоненты, которые должны получить доступ к аутентифицированному пользователю (HttpContext.User).

Существует два очевидных способа доступа компонента к этому: 1) Доступ к получению пользователя из HttpContext.Current 2) Передача пользователя в конструкторы

  1. Не идеален, потому что это затрудняет тестирование и связывает компоненты приложения с проблемами сети, когда они действительно не должны знать об этом.
  2. Просто грязно и все усложняет.

Так что я думал о передаче текущего пользователя (или, возможно, только имени / идентификатора) любому компоненту, который нуждается в нем, с помощью контейнера IoC (посредством внедрения зависимости).

Кто-нибудь использует эту технику для предоставления текущего пользователя ASP.NET частям приложения? Или это звучит как разумный подход? Я хотел бы знать, как это сработало для людей.

Спасибо

UPDATE: Спасибо Раджу за отличный пример. Если у кого-то есть подобный пример, использующий AutoFac, он будет очень признателен!

ОБНОВЛЕНИЕ2: Спасибо за ответы, хотелось бы, чтобы я разделил приём!

Ответы [ 2 ]

6 голосов
/ 13 мая 2010

В режиме autofac:

builder.Register (c => HttpContext.Current.User.Identity) .HttpRequestScoped ();

2 голосов
/ 13 мая 2010

Как насчет использования IPrincipal, который вместо этого также содержит IIdentity?

http://msdn.microsoft.com/en-us/library/f8kt7fb8%28v=VS.100%29.aspx

http://msdn.microsoft.com/en-us/library/f8kt7fb8%28v=VS.100%29.aspx

- обновлена ​​-

private static void AddSecurityConcernsTo(IWindsorContainer container)
{
    container.Register(Component.For<IIdentity>()
      .LifeStyle.PerWebRequest
      .UsingFactoryMethod(() => HttpContext.Current.User.Identity));

    container.Register(Component.For<IPrincipal>()
      .LifeStyle.PerWebRequest
      .UsingFactoryMethod(() => HttpContext.Current.User));

    container.Register(Component.For<HttpSessionStateBase>()
        .LifeStyle.PerWebRequest
        .UsingFactoryMethod(() => new HttpSessionStateWrapper(HttpContext.Current.Session)));

}

ref: http://blog.coreycoogan.com/tag/controller-ioc/

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