如何显式和精确地控制组合作用域
本文关键字:控制 组合 作用域 何显式 | 更新日期: 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仍然可以工作,但是使用自定义的进程列表提供程序。
我希望我能传达我的要求。
被罩。