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)
有一个接口抽象HttpContext.Current.仅公开您需要的方法.GetUserName()例如,会在实现中调用HttpContext.Current.User.Identity.Name.尽量减薄.
采用该抽象并将其注入您的其他提供者类.这将允许您通过模拟http上下文抽象来测试提供程序.作为附带好处,你可以使用HttpContext抽象做其他漂亮的事情,除了模拟它.一方面,重复使用它.将通用类型的参数添加到包等.
| 归档时间: |
|
| 查看次数: |
13454 次 |
| 最近记录: |