MEF: 我应该把CompositionContainer放在哪里?

15

我一直在为基于Web的应用程序使用Windsor IoC容器,以解决应用程序应使用的数据访问层实现。

Web应用程序的UI将由页面组成,每个页面由称为portlets的小单元组成。(它们的概念有些类似小部件。)这些所谓的portlets基本上是Web控件,可以在运行时为每个页面单独配置。

该应用程序将内置一些这些portlets,但我希望能够轻松扩展它。

我发现这种机制正是MEF构建的目的。因此,我决定以这样的方式实现系统,即使用MEF发现portlets。然后,我意识到它还可以做我目前使用Windsor的事情,所以我决定放弃Windsor,转而使用MEF。

显然,我将不得不使用DirectoryCatalog,它扫描应用程序bin文件夹中的.dll,并返回我需要的所有内容。

我阅读了一些教程、示例和StackOverflow中关于MEF的所有问题。我发现使用PartInitializer是通过Glenn Block在他的教程中提到的最简单的方法,但我意识到它并不在MEF中。实际上,它在我从CodePlex下载的代码中,在一个单独的程序集中,并且只在源代码中,而不是二进制形式中。(这是不是意味着它不是MEF的一部分?或者将其放到一个单独的项目中有什么意义?)然后,我意识到它是为Silverlight设计的,所以它并没有真正帮助我。(或者我应该针对.NET 3.5编译它,或者将其包含在我的项目中,然后就可以开始了吗?)

现在,我遇到了以下问题:我应该在我的应用程序中将CompositionContainer放在哪里?

还有一件事我想考虑:我应该在应用程序的整个生命周期中只使用一个CompositionContainer,还是每次需要时都创建一个容器会更好?

1个回答

11

好问题。

就放置容器的问题而言,我建议参考以下文章:http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

在 web 上使用 MEF 时,基于请求/响应的本质和可伸缩性问题,web 应用程序有些棘手。对于 web 应用程序,您可能需要拥有容器的层次结构,一个根容器用于应用程序并且是共享的,以及每个请求的子容器。子容器应该随请求的生命周期而兴衰以节约资源。共享容器包含所有调用方都共享的服务。

您可以查看以下文章,以获取更多有关如何实现此目标的见解:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

至于 PartInitializer,除非必须使用类似于它的东西,否则我会避免使用。ASP.NET 提供了足够的管道钩子,如 HTTP 处理程序、模块等,以便在创建时自动组合。

我认为在Web上使用PI的唯一场景可能是在自定义用户控件中。PI作为Silverlight 4的一部分提供,并且不包含在.NET 4.0的安装包中。但我已经为.NET 4.0创建了可用版本,您可以在此处找到:http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

希望有所帮助。 Glenn


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接