2016-11-14 67 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屬性,所以你可以注入這個在工廠並應用你的邏輯。