通过依赖注入传递ASP.NET用户

时间:2010-05-13 05:48:27

标签: asp.net dependency-injection inversion-of-control

在我的Web应用程序中,我有各种组件需要访问当前经过身份验证的用户(HttpContext.User)。

组件可以通过两种明显的方式访问它: 1)从HttpContext.Current访问用户 2)在构造函数中传递用户

  1. 不理想,因为它使测试变得困难,并将应用程序组件与Web问题联系起来,当他们真的不知道它时。
  2. 只是凌乱而且使一切变得复杂。
  3. 所以我一直在考虑使用IoC容器(通过依赖注入)将当前用户(或者可能只是名称/ id)传递给任何需要它的组件。

    是否有人使用此技术将当前ASP.NET用户提供给应用程序的某些部分?或者,这听起来像是一种明智的做法吗?我想知道这对人们有什么影响。

    由于

    更新: 感谢Raj的一个很好的例子。如果有人使用AutoFac有类似的例子,那将非常感激!

    UPDATE2:感谢您的回答,希望我能分开接受!

2 个答案:

答案 0 :(得分:6)

在autofac中:

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

答案 1 :(得分:2)

使用同时包含IIdentity的IPrincipal怎么样?

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)));

}

参考:http://blog.coreycoogan.com/tag/controller-ioc/