ASP.NET MVC:HTTPContext和依赖注入

ano*_*ous 16 structuremap asp.net-mvc dependency-injection httpcontext

目前我有一个ActionFilter,它从HttpContext获取当前用户名,并将其传递给在服务方法上使用它的操作.例如:

Service.DoSomething(userName);
Run Code Online (Sandbox Code Playgroud)

我现在有理由不在动作级别而是在控制器构造级别执行此操作.目前我正在使用结构图来创建控制器并注入服务.我正在寻找类似的东西:

public interface IUserProvider
{
    string UserName { get; }
}

public class HttpContextUserProvider : IUserProvider
{
    private HttpContext context;

    public HttpContextUserProvider(HttpContext context)
    {
        this.context = context;
    }

    public string UserName
    {
        get
        {
            return context.User.Identity.Name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我的IoC foo非常弱,因为这是我用过的第一个项目.

所以我的问题是......如何告诉结构图在HttpContextUserProvider的构造函数中传递HttpContext?这看起来很奇怪......我不知道怎么想HttpContext.

The*_*ing 10

听起来你应该使用HttpContextBase而不是HttpContextUserProvider.这是一个开箱即用的抽象,HttpContext允许您创建一个模拟,编写UnitTests并注入您的依赖项.

public class SomethingWithDependenciesOnContext
{
    public SomethingWithDependenciesOnContext(HttpContextBase context) {
        ...
    }

    public string UserName
    {
        get {return context.User.Identity.Name;}
    }
}

ObjectFactory.Initialize(x => 
          x.For<HttpContextBase>()
          .HybridHttpOrThreadLocalScoped()
          .Use(() => new HttpContextWrapper(HttpContext.Current));
Run Code Online (Sandbox Code Playgroud)


Mat*_*nze 8

有一个接口抽象HttpContext.Current.仅公开您需要的方法.GetUserName()例如,会在实现中调用HttpContext.Current.User.Identity.Name.尽量减薄.

采用该抽象并将其注入您的其他提供者类.这将允许您通过模拟http上下文抽象来测试提供程序.作为附带好处,你可以使用HttpContext抽象做其他漂亮的事情,除了模拟它.一方面,重复使用它.将通用类型的参数添加到包等.

  • 在Session上提供强类型包装器 (4认同)
  • 你有任何示例代码/链接,这看起来很有趣_对DI有点新,所以我不理解这一点,任何帮助/建议将不胜感激... (3认同)