[英]WebAPI DI Framework that understands HttpContext.User
我正在寻找可以满足这种情况的DI框架:
每个控制器都有这样的构造函数
public ThisController( ThatRepository repo)
每个存储库都有一个像这样的控制器:
public ThatRepository (DataSource ds)
有一个主数据源,但是永远不会传递到存储库。 相反,它需要:
MasterDataSource.WithUser ( httpContext?.User?.Identity?.Name )
是否有用于WebAPI的直接支持的DI框架?
我相信您可以将几乎每个DI容器用于此目的,方法是在容器内注册当前的HttpContext
(或什至当前的用户Identity
),然后将其注入以构造DataSource
实例。
这是在SimpleInjector中使用HttpContext
的简单解决方案(您可以轻松地将代码移植到所需的任何DI框架):
container.Register<HttpContextBase>(() =>
new HttpContextWrapper(HttpContext.Current),
Lifestyle.Scoped);
container.Register<DataSource>(() =>
{
var httpContext = container.GetInstance<HttpContextBase>();
return MasterDataSource.WithUser(httpContext?.User?.Identity?.Name);
},
Lifestyle.Scoped);
在您控制的接口后面抽象HttpContext
,并让您选择的DI容器在需要时解决该问题。
public interface ICurrentUser {
string Name{get;}
}
该接口的具体实现如下所示:
public class UserProvider : ICurrentUser {
HttoContextBase httpContext;
UserProvider(){
httpContext = HttpContext.Current;
}
public string Name {
get{ return httpContext?.User?.Identity?.Name ?? string.Empty; }
}
}
您可以使用DI容器注册接口/合同,并在需要DataSource
时解决它。
public void SomeSetupMethod(ICurrentUser user) {
MasterDataSource.WithUser(user?.Name);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.