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容器为我做的工作吗?

Web API中的请求依赖解析

看起来我只需要把它写在纸上。我是这样解决的:

容器:

        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");
    }
}