Web API中的请求依赖解析
本文关键字:依赖 请求 API Web | 更新日期: 2023-09-27 18:04:36
50000英尺概况:
IIS托管的Web API (OWIN)。
在OWIN中间件中,我做了一堆事情(API密钥验证以验证请求,创建原则等)。
我使用Unity作为我的容器。一旦我真正到达我的控制器,我就注入一个服务类,它从我的控制器中抽象出我的存储库。在服务层,我做审计跟踪、历史记录之类的事情,这样无论我在哪里注入我的服务类,我都能获得额外的好处。
这一切都行得通,生活是美好的,等等等等。
直到…我有一个自定义头值(X-OnBehalfOf), API的调用者使用正在执行特定请求的用户ID填充该值。这是应用程序的一个需求,它的实现非常直接。
我可以很容易地从任何地方检索这个值,我可以访问请求(OWIN中间件,控制器等…)。然而,当我试图在服务层中获得该值时,我试图解决的问题就出现了。
由于我正在使用我的容器来解析服务类的实例,我最初认为最好的解决方案是实现像IHeaderProvider这样的东西并将其注入服务类的构造函数,但我似乎无法弄清楚如何在该类中获得对请求的引用,因为它不在管道中。
我确信有一个明显的方法来做到这一点,但我一直遇到问题。有人知道如何获得该引用而不必新建它,以便我可以利用我的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");
}
}