如何使ASP.NET MVC网站模块化


14

我正在计划用ASP.NET MVC 4构建的员工Intranet系统。我们希望该站点由单独的“模块”组成,每个模块都提供不同的功能:消息传递,薪资变更等我希望这些模块能够在编译时启用或禁用。主页将显示某种导航,该导航将链接到所加载的每个模块。

到目前为止,这很容易,但是我不希望导航功能必须事先了解模块。换句话说,我希望模块是动态可发现的。我希望能够为新模块编写代码,然后将链接添加到导航栏中,而源代码中其他任何地方都没有代码更改。每个模块都应该有某种向导航栏注册的方式,更重要的是,每个模块在加载时都应完成此操作。

我认为这排除了使用MVC的区域的能力,因为这些区域是针对事先知道站点布局的情况而设计的。尽管人们似乎已经成功地将MEF与MVC相结合,但MEF似乎是适当的。MEF实际上是到达这里的方法,还是有更好的方法来完成我需要的工作?


好问题,我觉得您的解决方案可能会围绕使用反射进行。创建项目时,仍然可以使用区域,但是构建菜单的方法将需要使用反射来获取所有类型(以节省更改的代码)。如果它们都实现相同的接口IModule接口,该怎么办?然后,您可以找到该接口的所有继承者,以获取需要链接的所有模块,那么问题是,如何准确地将它与链接相关联而没有任何其他数据?嗯,剧情变厚了……
mattytommo

1
在我看来,您希望构建CMS,只是希望在构建时完成它,而不是从CMS内部进行CMS管理。这就引出了我一个问题,为什么要在构建时完成?
James P. Wright

@ JamesP.Wright好吧,我想要在构建时进行此操作的原因仅仅是因为这似乎比通过网站上的页面公开此功能要简单。(此外,所使用的模块集将很少更改,以至于不需要这种动态选择的额外开销。)但是,比在构建时选择模块更重要的是,应用程序在以下位置查找模块的能力:首先,这是我提出问题的重点。
bdesham 2013年

nopCommerce(nopcommerce.com/documentation.aspx)在某种程度上是您想要的一个很好的例子。看一下如何编写插件及其DI的方法。
Rui Marques 2013年

出于研究目的,我很好奇将MEF与MVC相结合的“混合成功”是什么。由于codeplex现在是“在存档中使用”,因此OP提供的链接不再起作用。为了节省其他时间:在archive.codeplex.com/?p=mef上的“讨论”选项卡上,使用ctrl + f搜索“通过Microsoft.Composition通过MVC4实现带有MVC4的MEF2” ;)
Kevin

Answers:


4

首先,我将有一个集中化的类,该类用于应用程序向静态构造函数和系统中存在的静态成员列表注册已编译模块。这些模块将具有静态属性,该属性指示其是否为菜单项以及其应在菜单中出现的顺序。

每个模块都有其自己的静态构造函数,该构造函数会在跟踪模块的集中化类中进行标记。

将此系统想像成一个员工进入和上班的时钟系统。然后在工资发放时,我们知道根据上班的人来支付所有员工,等等。

如果在模块上必须有接口协定,则必须使用反射,它们必须从该协定中继承元属性信息。

我为华纳兄弟音乐公司(Warner Brothers Music)工作,并为不同的编码格式制作了一个内部音乐处理系统。我制作了一个通用的插件模型,用于使用继承来进行反射编码,因此可以使用反射进行类型转换,以获取该类的基本元属性。我还没有尝试使用静态集中式类。只是将其随机地认为是另一种尝试娱乐的方式。

我还要补充一点,我使用MVC为多个客户端提供了基准需求,但还具有与您尝试执行的功能类似的增强功能。相反,我将MVC转换为使用App_Code,而不需要进行编译。这样更容易将文件推出,而无需集中编译。

您可以通过简单的FTP或GIT推送来利用JIT,而无需在本地编译和推送DLL。

这是堆栈溢出时该文章的链接


这听起来与我的想象相似。唯一的问题是,如何首先加载模块?我通过什么机制告诉他们每个人都向中央阶级登记?这就是MEF似乎合适的地方。
bdesham 2013年

MEF更好。我给出想法的时候没有仔细研究,但是如果我在执行那些项目时就选择了MEF,那么我会使用它。似乎是个好主意。我不明白为什么您不能结合使用MEF和MVC。
杰森·塞布林2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.