【发布时间】:2013-09-16 01:38:05
【问题描述】:
我想为模型、控制器和视图创建单独的项目。每个人都会进入不同的项目。该模型可以进入类库并添加为dll。
哪种类型的项目最适合控制器?它应该是类库还是 Web 应用程序?
如果视图在单独的项目中,控制器和视图将如何相互交互?
【问题讨论】:
标签: asp.net asp.net-mvc-3
我想为模型、控制器和视图创建单独的项目。每个人都会进入不同的项目。该模型可以进入类库并添加为dll。
哪种类型的项目最适合控制器?它应该是类库还是 Web 应用程序?
如果视图在单独的项目中,控制器和视图将如何相互交互?
【问题讨论】:
标签: asp.net asp.net-mvc-3
ASP.NET MVC 遵循约定优于配置的原则。如果您选择如您所描述的项目结构,那么您已决定不遵循通常的约定。
因此,MVC 为您提供的大部分优势(如绑定视图和控制器操作、模型绑定、url 路由)都被抛到了窗口之外。
但是没有什么可以阻止模型存在于单独的类库中,因为 ASP.NET MVC 不会对模型类的性质强加任何约定 - 任何 C# POCO 都可以是您的模型类,包括您的库类型。
按照您想象的方式进行操作并非不可能,但是您现在必须在框架中配置很多设置(以前约定就足够了)。此外,当 MVC3 升级到 MVCX(其中 x > 3)时,无法确定您的自定义设置是否会继续工作,从而导致升级成本更高。
但是您可以这样做:保持控制器简单和小巧,您可以将大部分服务和存储库、模型和类映射以及与 DI、ORM 等集成到单独或组合的 DLL 中。这样一来,整个项目结构与 MVC 约定保持一致,而您的业务逻辑在其他项目中。
【讨论】:
RequestContext.RouteData.Values 字典中的数据进行。您可以使用它来帮助 MVC 选择视图 - 在 SO 中使用包含所有信息的新要求提出另一个问题,并将链接发送给我 - 我会回答它
每当我们创建新的 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
最终的项目将如下所示......
【讨论】: