ASP.NET MVC - 分离大型应用程序

时间:2010-04-06 13:43:45

标签: asp.net-mvc separation-of-concerns

我一直对我认为矛盾的方面感到困惑:ASP.NET MVC声称要进一步支持“关注分离”的座右铭,我觉得这是个好主意。

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

使用ASP.NET MVC中固定的ControllerModelView文件夹,您实际上创造了一个巨大的混乱之物。是关注的分离,真的吗?似乎与我完全相反。

所以我想知道:

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

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

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

5 个答案:

答案 0 :(得分:8)

我认为你正在寻找Areas in ASP.Net MVC 2。在CSProj文件中有一些要取消注释的东西,但之后它会在构建时复制视图。我认为没有要求ControllerModel类与视图位于同一个程序集中。

Walkthrough: Creating an ASP.NET MVC Areas Application Using Multiple Projects

答案 1 :(得分:8)

控制器: AFAIK您不必做任何特殊操作就可以将控制器投射到自己的程序集中。最重要的是,您需要覆盖ControllerFactory的GetControllerType方法。

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

视图:必须将单独程序集中的视图标记为嵌入式资源,然后必须使用知道如何从资源而不是文件系统获取视图的自定义VirtualPathProviderviews from an resource instead of the file system。这也是您用于WebForm开发的 完全相同的 技术。

关于mcintyre321和他的Portable Areas回答:链接的项目几乎不做任何自定义,只是简单地将现有的MVC 2扩展点包装成一个更易于使用的抽象。它几乎没有“定制”和更多的语法糖。

您管理一个大型MVC应用程序,就像您管理任何其他大型应用程序一样。我害怕开放一个500页的WebForms项目,因为你从来都不知道每个代码背后的内容。使用MVC,不同的功能主要在其正确的位置。它根本不相反。

答案 2 :(得分:6)

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

Likewile,模型对视图或控制器一无所知,但视图和控制器都会知道模型。

然而,回到你的问题。正如jfar指出的那样,将控制器和模型移动到另一个组件中非常简单并且可以工作。将视图移动到另一个程序集更加棘手。使用自定义虚拟路径提供程序的嵌入式资源是一种方式,但我们通常不建议将其用于高性能网站。但如果它符合您的需求,那就去吧。

答案 3 :(得分:1)

MVC非常易于扩展,不需要遵守Controller,View和Model文件夹结构。您可以将控制器放置在任何您想要的位置,但是如果它们位于另一个组件中,您将需要实现自己的控制器工厂,该工厂知道如何定位它们。 Here是使用Windsor定位控制器的示例。

您的模型/视图模型可以随心所欲。您只需要在web.config中引用其命名空间,以便视图知道要查找的位置。 (至少我知道Spark视图引擎也是如此。)

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

就构建文件夹而言,我通常将我的层次结构集中在域概念上。我在每个项目中都有一个用户,产品,订单等文件夹。我在任何地方都没有模型或控制器文件夹。

答案 4 :(得分:0)