Autofac OWIN web api - 基于请求的加载依赖关系
问题描述:
如何基于路由参数加载服务依赖关系?Autofac OWIN web api - 基于请求的加载依赖关系
我的要求是不同的,但我会尝试使用一个简单的例子。 用户可以选择运输供应商(UPS,Fedex ...),并将信息作为请求模型或路线的一部分。根据路线,我需要加载服务类。
Autofac OWIN如何实现?帮助将不胜感激
答
当您使用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
访问路线数据。请注意,GetRequestContext
是System.Net.Http
命名空间中的扩展方法。
如果使用ASP.NET MVC,则可以在容器中注册AutofacWebTypesModule
,它本身在容器中注册了相当多的几种类型。
其中之一是HttpRequestContext
它有一个RouteData
属性,所以你可以注入这个在工厂并应用你的逻辑。