Autofac OWIN web api - 根据请求

时间:2016-11-14 19:33:29

标签: autofac autofac-configuration

如何根据路由参数加载服务依赖项?

我的要求不同,但我会尝试使用一个简单的例子。 用户可以选择运输提供商(UPS,Fedex ...),并且该信息是请求模型或路线的一部分。根据路由,我需要加载服务类。

如何在Autofac OWIN中完成?对此的帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

当您使用Autofac的OWIN集成时,每个请求都会创建一个新的生命周期范围,其中注册了当前IOwinContext,您可以看到here

然后,您可以将服务的创建委托给依赖IOwinContext的工厂。

public class MyServiceFactory
{
    private readonly IOwinContext _context;

    public MyServiceFactory(IOwinContext context)
    {
        _context = context;
    }

    public IService Create()
    {
        // inspect the context and determine which service you need
        // you could return, dependending on, let's say, the URL
        //  - UpsService()
        //  - FedexService()
    }
}

您需要确保的一件事是您将工厂注册为InstancePerLifetimeScope,因为IOwinContext对于每个请求都会有所不同。

你需要在OWIN层工作吗?由于OWIN实际上只是HTTP层,所以它会使事情变得更难,也可能有点hacky,所以没有路由数据。

如果您使用ASP.NET Web API,则可以使用RegisterHttpRequestMessage扩展方法将工厂建立在当前HttpRequestMessage的基础上。
然后,您可以通过request.GetRequestContext().RouteData访问路线数据。请注意,GetRequestContextSystem.Net.Http命名空间中的扩展方法。

如果您使用ASP.NET MVC,则可以在容器中注册AutofacWebTypesModule,它本身在容器中注册了很多类型。
其中一个是HttpRequestContext,它具有RouteData属性,因此您可以在工厂注入此属性并应用您的逻辑。