2009-12-09 178 views
15

我一直在爲我的基於Web的應用程序使用Windsor IoC容器,以解決應用程序應該使用的數據訪問層實現。MEF:我應該在哪裏放置CompositionContainer?

Web應用程序的用戶界面將包括頁面,每個頁面由小單位稱爲portlet。 (它們的概念有點類似於小部件。)這些所謂的portlet基本上是web控件,可以在運行時爲每個頁面單獨配置。

應用程序將有一些附帶這些內置的,但我想能很容易地擴展它。

我發現這個機制正是MEF的目的所在。所以我決定以一種使用MEF發現portlet的方式來實現系統。然後,我意識到它也可以做我目前使用Windsor的東西,所以我決定讓溫莎支持MEF。

很顯然,我將不得不使用DirectoryCatalog,它會掃描應用程序的bin文件夾中的.dll,並返回我需要的一切。

我看了一些教程,範例和關於StackOverflow的MEF的所有問題,以及。我認爲使用MEF的最簡單方法是通過Glenn Block在他的教程中提到的PartInitializer,但我意識到它不在MEF中。實際上,它是在我從CodePlex下載的代碼中,但在一個單獨的程序集中,並且僅在源代碼中,而不是以二進制形式。 (這是否意味着它不是MEF的一部分?或者將它放到一個單獨的項目中有什麼意義?)然後,我意識到它是用於Silverlight的,所以它並不能真正幫助我。 (或者我應該只是將它編譯爲.NET 3.5,或者將其包含在我的項目中,而且我很好走?)

所以現在我遇到了一個問題:哪裏應該放置CompositionContainer在我的應用程序?

還有就是我想考慮的另一件事:我應該在應用程序的生命週期只用一個CompositionContainer中,還是我最好的每一次創建一個容器,當我需要它?

回答

11

好問題。

一般約在哪裏放置容器的問題而言,我推薦以下職位:http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

在MEF的網站上,基於Web的應用程序是因爲請求/響應自然需要一點小技巧和可擴展性問題。對於Web,您可能希望擁有容器層次結構,共享應用程序的一個根目錄,以及每個請求的子項目。爲了節約資源,子容器應該與請求一起生存並死亡。共享容器包含所有呼叫者共享的服務。

你可以看看這些文章,更深入地瞭解如何做到這一點:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

至於PartInitializer,我會避免使用類似的東西,除非你要。 ASP.NET通過HTTP處理程序,模塊等在管道中提供了足夠的鉤子,以便在創建時自動創建。

唯一的地方,我會看到使用網絡上的PI將自定義用戶控制的範圍內是有可能。 PI作爲Silverlight 4的一部分發布,不適用於.NET 4.0的框。我已經創建了.NET 4.0中的可用版本,你可以在這裏找到:http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH 格倫