回答

14

正如here所述,Web API使用依賴關係解析器。

class StructureMapDependencyResolver : IDependencyResolver 
{ 
    public IDependencyScope BeginScope() 
    { 
     return this; 
    } 

    public object GetService(Type serviceType) 
    { 
     return ObjectFactory.GetInstance(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return ObjectFactory.GetInstances(serviceType); 
    } 

    public void Dispose() 
    { 
    } 
} 

而在你的Global.asax.cs,包括該行註冊依賴解析器:

GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(); 

除此之外,新的Web API是很容易與IoC容器來使用。

我還沒有看過它,但我相信我留空的BeginScope方法可以用於子容器。

編輯:

以上實現的偉大工程;事實上,我更喜歡它,而不是我將要告訴你的選擇。這一個將解決任何類型到最好的StructureMap的能力,並會拋出錯誤,每當出現問題。我喜歡看到錯誤,因爲它們告訴我我做錯了什麼。

但是,如果出現問題,API預計GetService將返回null。所以要符合的API,這是建議的落實:

public object GetService(Type serviceType) 
{ 
    if (serviceType.IsAbstract || serviceType.IsInterface) 
     return ObjectFactory.TryGetInstance(serviceType); 
    else 
     return ObjectFactory.GetInstance(serviceType); 
} 

不同的是,TryGetInstance僅查找在容器中註冊的類型,如果出現錯誤將返回null。 serviceType.IsAbstract || serviceType.IsInterface被認爲足夠用來決定使用哪種方法。我原來的回答是打算簡單直接,但是@PHeiberg在這裏的評論中指出,這並不完全「正確」。現在你已經有了知識,可以使用最好的方法。

+0

StructureMap不處理解決依賴喜歡這裏的預期。看看這個例子和傑里米的評論:http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg 2012-08-11 15:27:20

+0

實際上,這將工作。 Jeremy說'TryGetInstance'只有在'serviceType'被顯式註冊時才解析。 'GetInstance'仍然會解析未註冊但具體的類型。 – kelloti 2012-08-11 15:44:12

+0

實例的解析將適用於您的代碼。然而,我解釋了我作爲提議的「最佳實踐」發佈的鏈接,因爲傑里米本人[推薦它](http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3 - 請閱讀 - 這/)。我猜GetService方法應該返回null,而不是在容器無法解析類型時生成異常。 – PHeiberg 2012-08-12 13:07:41

8

ASP.NET Web API發佈版本使用依賴關係解析器(實現了IDependencyResolver接口),並且它還引入了新概念 - 依賴範圍(接口的實現IDependencyScope)。正確實施IDependencyScope非常重要 - 如果執行得當,它允許在IDependencyScope處置時釋放資源(在範圍內創建)。它在請求結束時處理。

當容器支持嵌套(或子)容器時,IDependencyScope的效果最佳。 StructureMap從版本2.6.1開始。

我寫了一篇文章如何在網頁API配置StructureMap:Configuring StructureMap in ASP.NET WebAPI

您也可以從邁克·沃森檢查文章: Using the Web API Dependency Resolver