2011-12-15 77 views
2

我對使用MEF控制組成範圍的方法很感興趣。如何明確和精確地控制組合範圍?

最明顯的例子 - 網絡應用程序,您必須爲每個請求創建組件的某個子集,並在請求完成時處理它們。 但是,範圍範圍的一般實現也可能在其他情況下有用。

我正在查看MEF2預覽並試圖理解它,但由於某些原因沒有看到完整的解決方案。

一方面,有這個MVC integration module,其中MEF足夠好照顧請求範圍對我來說,但這不是非常有用的MVC外(和網絡外的事情),是嗎?另一方面,在第一篇與預覽有關的文章「What's new in MEF2」中,我看到了這個名爲CompositionScopeDefinition的東西,看起來像是作用域的明確規範,但是對於那個,我看不到一種方法「關閉」範圍。換句話說:MEF如何確定何時處置在範圍內創建的組件?

另一方面(yep :-),在MEF v1中,我曾經通過創建嵌套CompositionContainer來處理範圍限制,但是這對定製ExportProvider s不起作用。

什麼真的想看到的是一樣的東西:

using(var scope = compositionContainer.OpenScope(/* some scope definition here */)) 
    { 
     var rootComponent = scope.GetExport<MyRootComponent>(); // The component graph gets composed at this point 
     rootComponent.DoYourScopedThing(); 
    } // The component graph gets disposed at this point 

如果我有這樣的事情,我可以很容易地建立在它之上的MVC整合,但我也可以使用它在其他情況下。

所以,再次提問:你用什麼來處理這樣的範圍問題?或者你認爲MEF還沒有足夠成熟以供認真使用?

回答

3

好問題 - 我們正在研究更多文檔,以解答關於CompositionScopeDefinition的問題。簡潔版本; CSD通過ExportFactory<T>使用,其中CreateExport()返回用於控制範圍生命週期的句柄。

但是,CSD旨在針對桌面應用場景進行優化;正如你毫無疑問看到的那樣,MVC集成使用過濾的目錄和嵌套容器來控制生命週期。對於Web和其他工作處理場景中的'交易'類型生存期,這仍然是推薦的方法。

用這種方法瞭解更多關於使用自定義ExportProvider時遇到的問題將是一件好事。

一個更強大的'定製'一生故事是我們非常努力的事情;讓我們知道MEF 2在哪些方面不適合您,特別是通過CodePlex討論論壇,這是非常有幫助的。

0

我發現這篇文章搜索有關CSD的詳細信息。 我想使用MEF來創建可擴展的WPF應用程序,該應用程序具有允許客戶端在單個窗口內的屏幕後打開屏幕的屏幕導航。 每個屏幕應該可以訪問以前的屏幕設置的部分,也可以覆蓋某些部分。 例如,當用戶打開一個ProcessView時,它應該有一個ProcessProvider部分,它可以通過從ProcessView導航的屏幕導入,比如說ActivityView。 ActivityView應該可以訪問ProcessProvider,因此它將具有操作的上下文。

另一個例子是根屏幕可能有一個ProcessListProvider,它默認返回數據庫中的所有進程。想要打開ProcessListView的屏幕需要以某種方式用自定義的ProcessListProvider覆蓋根ProcessListProvider,因此ProcessListView仍然可以工作,但可以使用自定義的流程列表提供程序。

我希望我能夠溝通我的要求。

伊多。