C# 如何明确而精确地控制组合范围?

C# 如何明确而精确地控制组合范围?,c#,.net,mef,C#,.net,Mef,我对使用MEF控制合成范围的方法感兴趣 最明显的例子是web应用程序,其中您必须为每个请求创建特定的组件子集,并在请求完成时处理它们。 然而,范围界定的一般实现在其他环境中也可能有用 我正在查看MEF2预览并试图理解它,但由于某些原因,没有看到完整的解决方案 一方面,有这样一种情况,MEF很好地为我处理了请求范围,但在MVC之外(以及web之外)这不是很有用,是吗 另一方面,在第一篇与预览相关的文章“”中,我看到了一个名为CompositionScopeDefinition的东西,它看起来像是作

我对使用MEF控制合成范围的方法感兴趣

最明显的例子是web应用程序,其中您必须为每个请求创建特定的组件子集,并在请求完成时处理它们。 然而,范围界定的一般实现在其他环境中也可能有用

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

一方面,有这样一种情况,MEF很好地为我处理了请求范围,但在MVC之外(以及web之外)这不是很有用,是吗

另一方面,在第一篇与预览相关的文章“”中,我看到了一个名为
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
使用(var scope=compositionContainer.OpenScope(/*此处的一些范围定义*/))
{
var rootComponent=scope.GetExport();//此时将合成组件图
DoYourScopedThing();
}//此时将释放组件图
如果我有这个东西,我可以很容易地在上面构建MVC集成,但我也可以在其他环境中使用它


那么,问题又来了:你用什么来处理这样的范围界定问题?或者你是说MEF还不够成熟,还不适合正式使用?

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

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

使用此方法的custom
ExportProvider
s了解更多有关您面临的问题会很好


一个更强大的“习惯”人生故事是我们非常努力的目标;让我们知道MEF 2在哪些方面不适合您的场景,特别是通过CodePlex讨论论坛,这是一个很大的帮助。

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

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

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

伊多