如何根据路由参数加载服务依赖项?
我的要求不同,但我会尝试使用一个简单的例子。 用户可以选择运输提供商(UPS,Fedex ...),并且该信息是请求模型或路线的一部分。根据路由,我需要加载服务类。
如何在Autofac OWIN中完成?对此的帮助将不胜感激
答案 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
访问路线数据。请注意,GetRequestContext
是System.Net.Http
命名空间中的扩展方法。
如果您使用ASP.NET MVC,则可以在容器中注册AutofacWebTypesModule
,它本身在容器中注册了很多类型。
其中一个是HttpRequestContext
,它具有RouteData
属性,因此您可以在工厂注入此属性并应用您的逻辑。