33

我试图找出是否有人有任何使用 MEF(托管可扩展框架(微软的新插件框架)和 ASP.NET MVC 的经验或想法。我需要创建一个标准的 ASP.NET MVC,我有。但我需要提供附加功能,即视图和控制器等,具体取决于我是否添加插件。它不需要动态编译,即源代码......但是我放入系统的 DLL..

有没有办法在应用程序启动时动态加载 DLL,然后将视图和控制器与主系统合并?我不知道我是否在正确的轨道上。

然后,我想在应用程序附带的“标准”视图中,我可以使用“IF THEN”来确定是否加载了插件并在用户控件中合并。

好吧,我在这里大声说话,但我想你明白我在说什么。

有任何想法吗?

4

6 回答 6

23

有什么运气吗?我正在阅读这篇文章,并认为这就是你要找的。
我对 MEF 的 xp 完全为零,但它看起来很有希望。我希望我可以在家里一起抽出几个小时的空闲时间来试验一下。以这种方式创建某种模块化的 MVC“框架”将非常有用。

至于我正在处理的当前项目,我有以下问题:多个站点具有相同的视图,只有其他 CSS 文件。目前我必须复制导致维护问题的视图。
我希望我可以使用 MEF 将这些视图放在一个中心位置。

于 2009-04-22T09:55:10.333 回答
4

检查这个:

http://www.fidelitydesign.net/?p=104

使用托管可扩展性框架 (MEF) 的模块化 ASP.NET MVC,第一部分作者 Matthew Abbott。

于 2010-06-01T14:42:36.800 回答
4

我们在 ASP.NET MVC 中使用了大量的 MEF,尽管其中大部分位于控制器级别以下,因为在我们的较低级别模块中使用 MEF 插件来检查权限和验证数据。

然而,我们也对我们的控制器使用了一种更可组合的方法。视图更棘手,但我们实际上完全消除了常规 ASP.NET MVC 视图的使用,并将我们的 Razor 视图存储在数据库中的片段中。然后,我们的控制器在运行时向模板引擎请求视图并将 ContentResult 呈现给响应,而不是返回 View("Viewname") 等。

我们的 MEF 插件都带有标识符属性,可以让我们在运行时进行级联覆盖,以确定应该将哪个插件/类用于给定目的。最简单的演示示例是,如果您考虑一个具有共同基础但部署到 50 多个实现的应用程序,每个实现都可以选择覆盖核心功能。

因此,您可能有类似 IUserController 的东西,其中包含“登录”、“注销”等方法。

除了该实际功能之外,我们还将向名为“SiteId”的界面添加一个只读 GUID 属性。然后,每个实现都会硬编码它打算用于的 SiteId。对于核心代码中的“默认”实现,它将返回“Guid.Empty”。

然后,当我们调用 MEF 并查找要使用的 IUserController 的实现时,我们会将所有这些实现 ImportMany 到一个 List 中,然后使用 LINQ 查询属性以确定要使用哪个:

var _currentUserController = _availableUserControllers.FirstOrDefault(
  c=>c.SiteId == AppSettings.SiteId);
if(_currentUserController == null){
    //There is no site-specific override
    _currentUserController = _availableUserControllers.FirstOrDefault(
      c=>c.SiteId == Guid.Empty);
}

要使用控制器执行此操作,最好的办法是查看 Web 上基于 MEF 的控制器工厂的一些实现。

然而,就像我说的那样,我们几乎所有这些都是在较低的级别上进行的,并且让我们的模块或控制器进行这种查找以确定要运行哪些插件。

于 2011-09-10T20:35:01.393 回答
1

这是一个疯狂的猜测。您可以使用使用 MEF 发现IControllers 的控制器工厂覆盖默认控制器工厂。由于视图是按惯例发现的,因此您不必担心它们。

于 2009-04-17T14:17:35.687 回答
0

我已经使用 MVC 和 MEF 组合了一个具有强类型视图的可插拔框架:http ://www.thegecko.org/index.php/2010/06/pluggable-mvc-2-0-using-mef-and -强类型视图/

于 2010-06-01T21:17:51.363 回答