c#-Web API中的请求依赖性解析
作者:互联网
50,000英尺的概述:
IIS托管的Web API(OWIN).
在OWIN中间件中,我做了很多事情(API密钥验证,以便对请求进行身份验证,创建原则等).
我正在使用Unity作为容器.实际进入控制器后,我将注入一个服务类,该服务类从我的控制器中提取我的存储库.在服务层中,我执行诸如审计跟踪,历史记录之类的工作,以便在注入服务类的任何地方都能获得额外的好处.
这一切有效,生活是美好的,yada yada yada.
直到…
我有一个自定义标头值(X-OnBehalfOf),API的调用者用执行特定请求的用户ID填充该标头值.这是应用程序的要求,其实现非常简单.
我可以从可以访问请求的任何位置(OWIN中间件,控制器等)轻松检索此值.但是,当我试图在服务层中获取该值时,就会遇到我要解决的问题.
由于我使用的是容器来解析服务类的实例,因此我最初虽然会想到最好的解决方案是实现IHeaderProvider之类的东西,然后将其注入到服务类的构造函数中,但我似乎无法弄清楚如何获取对该类中的Request的引用,因为它不在管道中.
我敢肯定有一个明显的方法可以做到这一点,但是我一直遇到问题.有谁知道如何获得引用而不必重新创建引用,以便我可以利用我的DI容器为我完成工作?
解决方法:
看来我只需要把它写下来.这是我解决的方法:
容器:
container.RegisterType<IHeaderProvider, HeaderProvider>(new HierarchicalLifetimeManager());
container.RegisterType<HttpContextBase>(new InjectionFactory(c => new HttpContextWrapper(HttpContext.Current)));
IHeaderProvider:
public interface IHeaderProvider
{
Guid GetOnBehalfOf();
}
HeaderProvider:
public class HeaderProvider : IHeaderProvider
{
private readonly HttpContextBase _httpContextBase;
public HeaderProvider(HttpContextBase httpContextBase)
{
_httpContextBase = httpContextBase;
}
public Guid GetOnBehalfOf()
{
var xOnBehalfOf = _httpContextBase.Request.Headers.Get("X-OnBehalfOfId");
Guid userId;
if (string.IsNullOrWhiteSpace(xOnBehalfOf))
throw new Exception("Missing user ID");
if (Guid.TryParse(xOnBehalfOf, out userId))
{
return userId;
}
throw new Exception("Invalid user ID");
}
}
标签:asp-net-web-api,unity-container,c 来源: https://codeday.me/bug/20191029/1960652.html