编程语言
首页 > 编程语言> > c#-Web API中的请求依赖性解析

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