English 中文(简体)
在ASP.NET MVC中使用多个Controller类的优点是什么?
原标题:What is the advantage of using multiple Controller classes in ASP.NET MVC?

我只是在学习ASP.NET MVC的基础知识,我想知道在多个控制器之间分解网站逻辑与只有一个控制器类来运行整个网站相比,除了更好地组织代码之外,还有什么好处。(在我看来,由于关注点的分离,仅仅后一个好处不应该足以通过url影响最终用户:网站的实施细节不应该反映在网站使用的url中,不是吗?)

我读过的控制器上的一些例子显示了不同的控制器,比如“产品”、“用户”或“帖子”。这些显然对应于对象类,然后是可以对这些对象采取的操作(现在查看url,我看到stackoverflow.com/questions/aask)。

将网站拆分为单独的控制器类(如QuestionsController)与只拥有一个默认控制器并在其中处理这些操作(例如stackoverflow.com/ask-question)相比,是否有优势。

我之所以这么问,是因为我对使我的网站RESTful不是特别感兴趣(我研究了一下,但认为它太有限了),而是更喜欢查询字符串参数来传递有关请求的信息。因此,将url拆分为控制器和操作的概念对我来说没有意义,因为操作和类信息将在查询字符串中表示。

最后,我更喜欢像www.mysite.com/about这样的URL看起来更简单,而不是www.mysitecom/home/about(这到底意味着什么?),这再次让我想知道多个控制器的真正意义。

最佳回答

ASP.NET MVC的美妙之处在于它使关注点的分离变得如此简单。与ASP.NET Webforms不同,在ASP.NET Webform中,每个页面本质上都是View<em>和Controller</em>,在ASP.NET MVC中,您可以将模型逻辑抽象为单独的关注点或功能组。拥有一个能够处理与产品有关的一切的ProductsController是有意义的,因为这样您就可以将应用程序中的每组相关功能隔离为可独立测试和维护的统一组。

拥有DoEverythingController从根本上挫败了MVC背后的推理,因为它将所有模型逻辑聚集在一个巨大的意大利面条碗代码中,而不是保持它的整洁和组织。此外,拥有一个能做所有事情的控制器并不是特别面向对象的,它类似于许多(旧的)PHP网站那样的更过程化的开发方法,这些网站有一些中心的“functions.PHP”或类似的功能,可以做所有事情。它杂乱无章。

关于最后一点,MVC中的路由引擎允许您按照自己的意愿构建到给定控制器操作的路由。ControllerX的About()操作和ControllerY的Contact()操作都可以具有/About和/Contact这样的根URL,只要您相应地定义路由即可。

编辑(太长,无法发表评论)

一般来说,就代码和逻辑而言,控制器类将非常薄。设计良好的控制器通常会将更复杂的操作(如从数据存储中检索数据)交给某种服务,从而使故障表面积保持较小。尽管大多数控制器都很薄,但您的站点越大,需要进行的操作就越多,您的通用控制器也将变得越笨重。即使在非MVC场景中,巨大的代码文件也很难维护和更新(例如上面的“functions.php”)。

如果您使用MVC开发的网站很小,并且仅限于几个或多或少的静态页面,那么为所有页面使用一个控制器可能是一种合理的方法,但如果您正在构建一个随着时间的推移而变化的可扩展应用程序,那么放弃使用多个控制器将是真正的失败。

问题回答

您可以使用ASP.Net MVC路由来实现您想要的任何url方案。您拥有什么控制器以及您的操作所在地与您的URL无关。只有路由定义你的url。因此,没有任何理由为了特定的url方案而牺牲代码的清晰度和组织性。

此外,在我见过的大多数ASP.Net MVC应用程序中,控制器已经很难处理了,将它们全部组合到一个控制器中会成倍地增加无序性。

即使是小型站点也有少数或两个控制器。重要的站点有几十个,非常大的站点可能有数百个。你真的认为将几十个控制器组合成一个控制器在任何方面都是可行的吗?

Is like to have all files in the same directory or keep files separated in different folders. Keeping the application organized in separate controller help in many cases:

1)内存性能

Different from Java Servlet where the controller is shared betwen many request, in asp net mvc the controller is created for each request. Each time the user make a request, the application need to create the controller. Think at performances comparison betwen create in memory an instance of a fatcontroller of 100k VS one instance of a light controller of 1k.

2)OO好处

Controllers are classes. Each time you create a new controller you extend the base controller. In a complex application you can create yours own controrres (can be more than one) and extend the more appropriated.

例如,您可以为“产品”创建一个控制器,并从中扩展到为“蔬菜产品”创建控制器,等等。。

3)安全性

Suppose that in your application you have a page that execute the CRUD actions on a given item of your db: - display - edit - update - delete

您想使此页面仅为注册用户保留。

If you put all this method in one separate controller you can put the annotation [Authorize] on the controller and by default all the methods inside the controller will be protected. If you put all the application in one fat controller you have to be careful to place the [Authorize] on each method (what happe if you forgive to put the annotation on the delete method?)

[Authorize]
public class ProductController

 public ActionResult Index(String id) {
   ...
 }

 public ActionResult Update(String id) {
   ...
 }

 public ActionResult Delete(String id) {
   ...
 }

4)再次安全

Suppose you write a classic CRUD (Create Read Update Delete). Now you want to delete the whole CRUD.

If you keep code separate in different controller you simply delete the controller that belog the CRUD. If you keep all together in a fatcontroller you have to search for the methods that belog to the CRUD in the whole code. Again: what hapen if you forget to delete the Delete method?

实用性

如果你把所有这些放在一起,你会有这样的方法:

product_edit
product_delete
product_rate
product_create
category_edit
category_delete
category_create

如果您在单独的控制器中组织代码,您将拥有

product
  edit
  delte
  create
  rate
category
  edit
  delete
  create

这是好的,原因有很多:想修改项目中的产品吗?只需重构并重命名itemController中的productController。

柴盖

我认为这个主题有可能(从答案中)说明使用控制器来完成自己的轻量级任务的真正好处。立即想到的众多好处之一是,无论手头的任务(创建、编辑、删除、列出等)如何,每个控制器都可以具有几乎相同的命名操作。

再加上一个良好的数据访问存储库模式和一些漂亮的T4模板,您或多或少可以免费创建一个易于理解的管道作业。

这正是mvc给我带来纯粹乐趣的原因&将相关操作谨慎地分割成一个统一的结构。正如前面所提到的,那些可能变得不可怕和繁琐的东西反而变得熟悉和专注(并非双关语!!)。

我想如果你喜欢意大利面条,你就只有一个控制器了。

复杂性、复杂性、复杂性,这就是问题所在。软件就是把问题分解成可管理的单元。

因此有多个控制器。





相关问题
WebForms and ASP.NET MVC co-existence

I am trying to make a WebForms project and ASP.NET MVC per this question. One of the things I ve done to make that happen is that I added a namespaces node to the WebForms web.config: <pages ...

Post back complex object from client side

I m using ASP.NET MVC and Entity Framework. I m going to pass a complex entity to the client side and allow the user to modify it, and post it back to the controller. But I don t know how to do that ...

Create an incremental placeholder in NHaml

What I want to reach is a way to add a script and style placeholder in my master. They will include my initial site.css and jquery.js files. Each haml page or partial can then add their own required ...

asp.net mvc automapper parsing

let s say we have something like this public class Person { public string Name {get; set;} public Country Country {get; set;} } public class PersonViewModel { public Person Person {get; ...

structureMap mocks stub help

I have an BLL that does validation on user input then inserts a parent(PorEO) and then inserts children(PorBoxEO). So there are two calls to the same InsertJCDC. One like this=>InsertJCDC(fakePor)...

ASP.NET MVC: How should it work with subversion?

So, I have an asp.net mvc app that is being worked on by multiple developers in differing capacities. This is our first time working on a mvc app and my first time working with .NET. Our app does not ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

热门标签