當前版本的StructureMap是否支持ASP .Net Web API,MVC 4和.NET Framework 4.5?StructureMap和ASP .Net Web API和.Net Framework 4.5
回答
正如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在這裏的評論中指出,這並不完全「正確」。現在你已經有了知識,可以使用最好的方法。
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
- 1. ASP。 NET 5 Web API和Appharbor
- 2. Web API和.NET 4.5:索賠和權利
- 3. .Net 4.0和.Net 4.5
- 4. ASP .Net Web API和RavenDB兼容性
- 5. Autofac和ASP .Net MVC 4 Web API
- 6. Microsoft ASP .NET Web API,MVC 4和SPA Architecture
- 7. StructureMap和.Net核心
- 8. Net Framework 4.5 MailAddress格式和連續點
- 9. .Net Micro Framework和Web服務
- 10. IIS6和.Net 4.5?
- 11. .net- framework和.net general
- 12. Google API和.NET Compact Framework
- 13. .NET 4.5和Azure的
- 14. ASP .NET和IIS
- 15. structuremap asp .net mvc註冊
- 16. WCF vs ASP .Net Web API
- 17. 創建庫定位.Net Framework 4.5和.Net標準
- 18. 從.Net Framework 4.0混合和調用.Net 4.5
- 19. ASP .NET AJAX和JQuery
- 20. C#,.net 4.5和angularjs
- 21. WinRT .NET 4.5和RCW
- 22. XNA和.NET Framework
- 23. .NET Framework和COM
- 24. FrameLog和.Net Framework
- 25. 優化的Web數據網格 - ASP .NET與ASP .NET MVC和jQuery
- 26. ASP .NET和SonarLint
- 27. NotMapped錯誤和.NET 4.5
- 28. SQL Server 2012和.NET Framework 4.0
- 29. ASP .Net Core - Entity Framework 7
- 30. IdentityServer4和Web API .NET 4.6.2
StructureMap不處理解決依賴喜歡這裏的預期。看看這個例子和傑里米的評論:http://ardalis.com/How-Do-I-Use-StructureMap-with-ASP.NET-MVC-3 – PHeiberg 2012-08-11 15:27:20
實際上,這將工作。 Jeremy說'TryGetInstance'只有在'serviceType'被顯式註冊時才解析。 'GetInstance'仍然會解析未註冊但具體的類型。 – kelloti 2012-08-11 15:44:12
實例的解析將適用於您的代碼。然而,我解釋了我作爲提議的「最佳實踐」發佈的鏈接,因爲傑里米本人[推薦它](http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with -mvc3 - 請閱讀 - 這/)。我猜GetService方法應該返回null,而不是在容器無法解析類型時生成異常。 – PHeiberg 2012-08-12 13:07:41