asp.net-mvc - 在 ASP.NET MVC 3 的类库中使用 MEF

标签 asp.net-mvc asp.net-mvc-3 plugins mef modular

我正在扩展基于 MVC 3 的解决方案。

基本上,该解决方案由一个 MVC 3 项目以及一些用于管理业务/数据访问的类库项目组成。

我正在尝试使用 MEF 使应用程序基于插件。例如,我在 dll 项目中有一个 UserManager 类,并且我定义了我的插件,如下所示:

[ImportMany]public List<IUserHooks> Plugins {get; set;}
foreach (var plugin in Plugins)
{
    Plugin.DoTheJob();
}

正如您所看到的,该类与 MVC 项目和 Controller 是分开的。该列表是在我的 UserManager 类中定义的。

我知道最好的方法是让 UserManager 也使用 MEF(可能在 Controller 的 ctor 中初始化它,如 public MainController(IUserManager UserManager)),但是因为我只是想向解决方案添加插件支持,而不是从头开始编写,我更喜欢最快的快捷方式。

我应该如何定义 MEF container 对象才能在我的类库中使用它。是否也需要使用 MEF 来制作 MVC 应用程序?我更喜欢对 MVC 应用程序进行最少修改的方法。

最佳答案

MVC3 已经支持服务定位。如果您不想重新定义某些基类,而只是想扩展,则可以添加使用 MEF 的 IDependencyResolver 实例。这样您就可以使用它作为扩展您的应用程序的基础。我在 my blog 上写了一个例子。

使用 MVC3 的内置架构,您可以在启动时配置 CompositionContainer 并将其公开给基础架构的其余部分。

但是,现实情况是您可能不想在库中公开您的容器。事实上,您唯一应该做的就是标记您的导出。使用 MEF 可以避免这种情况的原因是它包含在 .NET 4.0 的 BCL 中。通过不将您的类耦合到 MEF(或者实际上,将您的类耦合到服务定位器或控制反转容器),它使您的代码更加可移植、可测试和解耦。

关于asp.net-mvc - 在 ASP.NET MVC 3 的类库中使用 MEF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10267426/

相关文章:

c# - 如何在 C# MVC 中通过模型修剪()所有输入

c# - 为什么我的模型没有被 View 保存?

c# - 如何检查 ID 在 ASP MVC 和 EF 中是否不重复

mysql - 如果另一个表具有空值(序列不包含元素),则查询不显示

asp.net-mvc - Silverlight 4 - MVC 2 ASP.NET 成员(member)集成 "single sign on"

c# - 通过 nuget 添加 fullCalendar

javascript - 通过传递参数从 html.actionlink 调用 JS

java - 如何在我的网站中嵌入可执行插件?

javascript - 在普通 JS 插件中可以将对象存储在 DOM 元素上吗?

java - eclipse日志中具体数字的含义是什么?