【问题标题】:Separating out Model and Views and Controllers in different projects在不同的项目中分离模型和视图和控制器
【发布时间】:2013-09-16 01:38:05
【问题描述】:

我想为模型、控制器和视图创建单独的项目。每个人都会进入不同的项目。该模型可以进入类库并添加为dll。

哪种类型的项目最适合控制器?它应该是类库还是 Web 应用程序?

如果视图在单独的项目中,控制器和视图将如何相互交互?

【问题讨论】:

    标签: asp.net asp.net-mvc-3


    【解决方案1】:

    ASP.NET MVC 遵循约定优于配置的原则。如果您选择如您所描述的项目结构,那么您已决定不遵循通常的约定。

    因此,MVC 为您提供的大部分优势(如绑定视图和控制器操作、模型绑定、url 路由)都被抛到了窗口之外。

    但是没有什么可以阻止模型存在于单独的类库中,因为 ASP.NET MVC 不会对模型类的性质强加任何约定 - 任何 C# POCO 都可以是您的模型类,包括您的库类型。

    按照您想象的方式进行操作并非不可能,但是您现在必须在框架中配置很多设置(以前约定就足够了)。此外,当 MVC3 升级到 MVCX(其中 x > 3)时,无法确定您的自定义设置是否会继续工作,从而导致升级成本更高。

    但是您可以这样做:保持控制器简单和小巧,您可以将大部分服务和存储库、模型和类映射以及与 DI、ORM 等集成到单独或组合的 DLL 中。这样一来,整个项目结构与 MVC 约定保持一致,而您的业务逻辑在其他项目中。

    【讨论】:

    • 感谢您的回复。我的场景是应用程序将根据他们的 url 向不同的客户端显示不同的视图。是否有任何替代方法可以实现这一目标,而不是在多个项目中分开。
    • 是的,您可以使用 MVC 路由来完成此操作。只需根据您对 URL 和视图之间映射的理解,在 Global.asax 文件中添加路由。您还可以使用域名、端口号等来显示不同的视图。视图的选择由框架根据RequestContext.RouteData.Values 字典中的数据进行。您可以使用它来帮助 MVC 选择视图 - 在 SO 中使用包含所有信息的新要求提出另一个问题,并将链接发送给我 - 我会回答它
    • 如果我的回答对您有帮助,您可以通过启用答案左侧的绿色勾号来接受它。
    【解决方案2】:

    每当我们创建新的 ASP.NET MVC 3/4/5 项目时,它都会遵循预定义的目录约定并向项目中添加少量文件和目录。然而,遵循这个默认目录结构并不是强制性的,但它可以帮助我们通过基于功能(即控制器、模型、视图等)对应用程序组件进行分组来保持应用程序的清洁和可维护性。但是当涉及到大型项目时,建议进行划分不同库项目中的不同组件。即所有模型类都放在单独的库项目中,所有控制器都放在另一个库项目中等等。

    要分离控制器模型和视图,请执行以下操作

    首先获取一个名为 SeparatingControllerModelsView 的空 MVC 3/4/5 Web 应用程序。然后添加一个 controller 并将其命名为 HomeController。现在添加一个 模型类 并将其命名为 TestModel添加视图右键单击 Index 方法并选择 TestModel 以创建强类型视图。

    现在分离模块和控制器添加两个库项目并将其命名为ModelLibrary & ControllerLibrary 。从两个库项目中删除默认类。右键单击 ModelLibrary 项目并单击属性。创建模型类 TestModel 时,项目属性将打开并使用命名空间 (SeparatingControllerModelsView.Models) 更改默认命名空间。 现在右键单击 ModelLibrary 项目并单击 添加现有项目并从 SeparatingControllerModelsView Web 应用程序添加 TestModel 类。

    这样也可以将控制器库命名空间换成HomeController命名空间强>类。现在添加参考 System.Web, System.Web.Mvc。从 SeparatingControllerModelsView Web 应用程序中添加 HomeController 类,右键单击 ControllerLibrary,然后添加现有项目。

    现在从 SeparatingControllerModelsView 中删除 Controllers 和 Models 目录。添加引用这两个库项目并像默认 MVC 项目一样运行项目。

    如果项目中添加了任何区域,则需要根据区域添加另一个库项目。相应地更改库的默认命名空间(控制器和模型)区域的控制器和模型的命名空间。

    由于命名空间与分离的库相同,因此在运行时使用命名空间它们很容易相互交互。

    也可以使用以下链接

    Creating an ASP.NET MVC Areas Application Using Multiple Projects

    最终的项目将如下所示......

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2015-07-21
      • 2014-09-29
      • 2015-09-25
      • 1970-01-01
      • 2013-11-27
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多