2016-11-14 42 views
0

如何基于路由参数加载服务依赖关系?Autofac OWIN web api - 基于请求的加载依赖关系

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

Autofac OWIN如何实现?帮助将不胜感激

回答

0

当您使用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层,所以没有路由数据这样的东西。

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

如果使用ASP.NET MVC,则可以在容器中注册AutofacWebTypesModule,它本身在容器中注册了相当多的几种类型。
其中之一是HttpRequestContext它有一个RouteData属性,所以你可以注入这个在工厂并应用你的逻辑。