2011-12-15 39 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仍然可以工作,但可以使用自定义的流程列表提供程序。

我希望我能够沟通我的要求。

伊多。