如何基於路由參數加載服務依賴關係?Autofac OWIN web api - 基於請求的加載依賴關係
我的要求是不同的,但我會嘗試使用一個簡單的例子。 用戶可以選擇運輸供應商(UPS,Fedex ...),並將信息作爲請求模型或路線的一部分。根據路線,我需要加載服務類。
Autofac OWIN如何實現?幫助將不勝感激
如何基於路由參數加載服務依賴關係?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
屬性,所以你可以注入這個在工廠並應用你的邏輯。