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

时间:2009-12-09 17:40:33

标签: c# .net ioc-container mef

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

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

该应用程序将附带其中一些内置功能,但我希望能够轻松扩展它。

我发现这个机制正是MEF的构建方式。所以我决定以这样的方式实现系统,即它使用MEF发现portlet。然后,我意识到它也可以做我目前使用Windsor的东西,所以我决定放弃Windsor而不是MEF。

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

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

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

还有一件事我想考虑一下:我应该在应用程序的生命周期中只使用一个CompositionContainer,或者我最好在每次需要时创建一个容器吗?

1 个答案:

答案 0 :(得分:11)

好问题。

一般而言,在有关放置容器的位置的问题方面,我建议使用以下帖子:http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

在网络上的MEF中,由于请求/响应性质和可扩展性问题,基于Web的应用程序有点琐碎。对于Web,您可能希望拥有容器层次结构,一个用于共享的应用程序的根目录,以及每个请求的子contianers。子容器应该根据请求生存和死亡,以节省资源。共享容器包含所有呼叫者共享的服务。

您可以查看这些文章,了解如何执行此操作:

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处理程序,模块等在管道中提供了足够的钩子,以便在创建时自动编写。

我在网络上看到使用PI的唯一地方可能是自定义用户控件。 PI作为Silverlight 4的一部分提供,在.NET 4.0的框中不可用。我已经为.NET 4.0创建了一个可用的版本,你可以在这里找到它:http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH 格伦