Asp.net mvc ASP.NET MVC-分离大型应用程序 我对我所认为的一个矛盾感到困惑:ASP.NET MVC声称要进一步推进和支持“关注分离”的座右铭,我找到了一个好主意。

Asp.net mvc ASP.NET MVC-分离大型应用程序 我对我所认为的一个矛盾感到困惑:ASP.NET MVC声称要进一步推进和支持“关注分离”的座右铭,我找到了一个好主意。,asp.net-mvc,separation-of-concerns,Asp.net Mvc,Separation Of Concerns,然而,似乎没有办法将控制器、模型或视图分离到它们自己的部件中,或者将区域分离到部件中 在ASP.NET MVC中,使用固定的控制器、模型和视图文件夹,实际上您正在创建一个庞大的大杂烩。这是关注点的分离,真的吗??对我来说似乎完全相反 所以我想知道的是: 如何创建一个ASP.NET MVC解决方案,将控制器、模型和充满视图的文件夹分离到单独的程序集中 如何将ASP.NET MVC 2的各个区域放入单独的程序集中 或者你如何管理一个大型的ASP.NET MVC应用程序——它有几十个甚至上百个控制器

然而,似乎没有办法将控制器、模型或视图分离到它们自己的部件中,或者将区域分离到部件中

在ASP.NET MVC中,使用固定的
控制器
模型
视图
文件夹,实际上您正在创建一个庞大的大杂烩。这是关注点的分离,真的吗??对我来说似乎完全相反

所以我想知道的是:

  • 如何创建一个ASP.NET MVC解决方案,将控制器、模型和充满视图的文件夹分离到单独的程序集中

  • 如何将ASP.NET MVC 2的各个区域放入单独的程序集中

  • 或者你如何管理一个大型的ASP.NET MVC应用程序——它有几十个甚至上百个控制器,很多模型和视图模型类,以及几百个视图


您需要使用便携式区域,请参见我想您正在寻找的。在CSProj文件中有一些东西需要取消注释,但之后它将在您构建时复制视图。我认为没有要求
控制器
模型
类与视图位于同一个程序集中


控制器:好吧,您不应该做任何特殊的事情来将控制器放入它们自己的程序集中。最多您需要做的就是重写ControllerFactory的GetControllerType方法

模型:对放置模型的位置没有限制。虽然我不赞成这样做,但我经常使用Nhibernate/其他ORM层或WCF/服务层DTO中的持久对象,这些对象作为我的视图位于单独的程序集中。这与使用WebForms的方式相同

视图:单独程序集中的视图必须标记为嵌入资源,然后必须使用知道如何从资源而不是文件系统获取视图的自定义资源。同样,这是一种与Web表单开发完全相同的技术

关于mcintyre321和他的可移植区域,答案是:链接的项目几乎不做任何定制的事情,只是将现有的MVC2扩展点包装成一个更易于使用的抽象。它几乎没有“习惯”和更多的语法糖


管理大型MVC应用程序就像管理其他大型应用程序一样。我害怕打开一个500页的WebForms项目,因为你永远不知道每个代码背后都有什么。有了MVC,不同的功能基本上都在正确的位置上。MVC是非常可扩展的,不需要遵循控制器、视图和模型文件夹结构。您可以将控制器放置在您想要的任何位置,但是如果它们位于另一个部件中,您需要实现自己的控制器工厂,该工厂知道如何定位它们。是使用Windsor查找控制器的示例

您的模型/视图模型可以放在任何您想要的地方。您只需要在web.config中引用它们的名称空间,以便视图知道在哪里查找。(至少我知道Spark view引擎也是如此。)

您可以将视图放在任何web项目中。我通常的策略是创建一个包含views文件夹的纯web(非mvc)项目。(这甚至可能是一个遗留的web应用!)然后我所有的控制器都放在一个单独的类库中。我的视图模型和服务是另一种


就构建文件夹而言,我通常将我的层次结构集中在域概念上。我会在每个项目中为用户、产品、订单等设置一个文件夹。我从来没有在任何地方设置过Models或Controllers文件夹。

将代码分离为单独的程序集与关注点的分离是正交的。代码所在的位置不是一个“问题”。关注点的分离与各种组件的责任和依赖方向有关。例如,视图负责渲染输出,控制器知道视图,但视图并不真正了解控制器

与威尔一样,模型对视图或控制器都一无所知,但视图和控制器都知道模型


然而,回到你的问题上来。正如jfar所指出的,将控制器和模型移动到另一个程序集中非常容易,而且可以正常工作。将视图移动到另一个部件更为棘手。带有自定义虚拟路径提供程序的嵌入式资源是一种方法,但我们通常不推荐用于高性能站点。但是,如果它满足您的需要,那就去吧。

@Mark:谢谢-不过,这能跨越装配边界吗?例如,我可以将我的“管理员”和“超级用户”区域放入单独的类库中,并从主ASP.NET MVC2应用程序中引用它们吗??我从来没有看到任何关于如何做到这一点的提示、屏幕广播或演示。。。。它总是在你单一的、单一的ASP.NET MVC2应用程序中的子文件夹…@marc_s我知道你可以为每个MVC区域使用不同的程序集。我们在这里这样做。我不知道是否可以将控制器和模型放在它们自己的组件中,但我看不出有什么理由不起作用。我认为areas build任务只是将视图复制到主项目,并提供了一种注册路由的机制。。。但这只是一个假设。实际上,我们不使用构建任务,也不手动复制视图,它可以正常工作。@marc_s我在随后的演练中添加了链接。@marc_s,我的荣幸,我确信深入使用MVC,您将看到所有的扩展点确实使管理大型应用变得非常简单。:我从未真正想过将视图作为嵌入式程序集资源。我可以看出,如果你必须打包一份申请表才能交货,那将是一件好事。@Mark,这是真的