2

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

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

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

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

如您所见,该类与 MVC 项目和控制器是分开的。该列表是我的UserManager班级定义的。

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

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

4

1 回答 1

2

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

使用 MVC3 的内置架构允许您CompositionContainer在启动时配置您的系统并将其暴露给基础架构的其余部分。

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

于 2012-04-22T20:55:35.453 回答