如何显式和精确地控制组合作用域

本文关键字:控制 组合 作用域 何显式 | 更新日期: 2023-09-27 18:17:55

我对MEF控制组合作用域的方法很感兴趣。

最明显的例子是web应用程序,你必须为每个请求创建特定的组件子集,并在请求完成时处理它们。但是,作用域的一般实现在其他上下文中也可能有用。

我正在看MEF2预览并试图理解它,但由于某种原因没有看到完整的解决方案。

一方面,有这个MVC集成模块,其中MEF是很好的照顾请求范围为我,但这不是很有用的MVC之外(和web之外的事),是吗?

另一方面,在第一篇与预览相关的文章"MEF2的新功能"中,我看到了一个叫做CompositionScopeDefinition的东西,它看起来像是一个明确的作用域规范,但在这个规范中,我没有看到"关闭"作用域的方法。换句话说:MEF如何确定何时处置在作用域中创建的组件?

在第三手(是的:-),与MEF v1,我曾经通过创建嵌套的CompositionContainer s来处理范围,但这与自定义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还不够成熟,不适合认真使用?

如何显式和精确地控制组合作用域

好问题-我们正在编写更多的文档来回答您关于CompositionScopeDefinition的问题。短版;CSD通过ExportFactory<T>使用,其中CreateExport()返回一个句柄,用于控制作用域的生存期。

然而,CSD是为桌面应用场景设计和优化的;正如您所看到的,MVC集成使用过滤目录和嵌套容器来控制生命周期。这仍然是web和其他工作处理场景中"事务性"类型生命周期的推荐方法。

了解更多关于使用这种方法使用自定义ExportProvider时所面临的问题是很好的。

一个更强大的"定制"终身故事是我们非常努力的方向;让我们知道mef2在你的场景中有什么不足,特别是通过CodePlex讨论论坛,这是一个很大的帮助。

我在搜索CSD的详细信息时发现了这篇文章。我想使用MEF来创建可扩展的WPF应用程序,该应用程序具有屏幕导航,允许客户端在单个窗口内打开一个又一个屏幕。每个屏幕都应该能够访问之前屏幕设置的部件,并且能够覆盖某些部件。例如,当用户打开一个ProcessView时,它应该有一个ProcessProvider部分,可以通过ProcessView的屏幕导航导入,比如ActivityView。ActivityView应该能够访问ProcessProvider,这样它就会有上下文来操作。

另一个例子是根屏幕可能有一个ProcessListProvider,默认情况下它返回数据库中的所有进程。想要打开ProcessListView的屏幕将需要用自定义的ProcessListProvider以某种方式覆盖根ProcessListProvider,以便ProcessListView仍然可以工作,但是使用自定义的进程列表提供程序。

我希望我能传达我的要求。

被罩。