ASP.NET MVC: HTTPContext and Dependency Injection
I'm not sure why you're bothering. It seems like just using HttpContext.Current directly in HttpContextUserProvider is the right thing to do. You're never going to be substituting in a different HttpContext...
Have an interface abstract HttpContext.Current
. Expose only the methods you need. GetUserName()
would call HttpContext.Current.User.Identity.Name
in the implementation, for example. Make that as thin as possible.
Take that abstraction and inject it into your other provider class. This will allow you to test the provider by mocking the http context abstraction. As a side benefit, you can do other nifty things with that HttpContext
abstraction besides mock it. Reuse it, for one thing. Add generic type params to bags, etc.
It sounds like you should be using HttpContextBase
instead of HttpContextUserProvider
. This is a out-of-box abstraction of HttpContext
and allows you to create a mock, write UnitTests and inject your dependencies.
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));