15

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

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

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

我发现这种机制正是 MEF 的用途。因此,我决定以这样一种方式来实现该系统,即它使用 MEF 发现 portlet。然后,我意识到它也可以做我目前使用温莎的事情,所以我决定放弃温莎,转而使用 MEF。

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

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

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

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

4

1 回答 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

As far as PartInitializer, I would avoid using something like it unless you have to. ASP.NET provides sufficient hooks in the pipeline through HTTP Handlers, modules and such to let automatically compose on creation.

The only place i would see using PI on the web would be possibly within a custom user control. PI ships as part of Silverlight 4 and is not available in the box for .NET 4.0. I have created a usable version for .NET 4.0 which you can find here: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH Glenn

于 2009-12-22T18:16:15.313 回答