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

标签 c# .net ioc-container mef

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

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,还是每次需要时都创建一个容器更好?

最佳答案

好问题。

一般来说,关于容器放在哪里的问题,我推荐以下帖子:http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

在 Web 上的 MEF 中,由于请求/响应性质和可扩展性问题,基于 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 处理程序、模块等在管道中提供足够的 Hook ,以便在创建时自动组合。

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

HTH 格伦

关于c# - MEF:我应该把 CompositionContainer 放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875569/

相关文章:

c# - xaml 中带有集合的嵌套对象似乎会泄漏到相邻的集合中

c# - 尝试使用 C sharp 中的 catch block

.NET End vs Form.Close() vs Application.Exit Cleaner 关闭应用程序的方法

spring - 多个同时访问 Spring Singleton 实例时

c# - Microsoft Prism 是否适合开发非 GUI 模块化实时服务器?

c# - Asp.net 身份注销不工作

c# - 在自定义部分中获取同一键的多个实例

.net - 如何指定要从表达式树方法返回的对象?

c# - 整个命名空间的“SuppressMessage”

java - Spring 复合 bean ?