BaseController 在 MVC 中的用途是什么?

BaseController uses for what in MVC?

我看了更多关于 MVC 的教程。但是我不明白,人们使用 "BaseController" 是为了什么?在一个项目中,有人用它来进行所有控制器之间的通信。在其他项目中有人用于获取日志。你能给我解释清楚吗?

这不是必须在应用程序中使用 basecontroller,但它就像您在应用程序中为所有页面使用母版页一样,您可以在此处应用相同的页面保持通用功能。从每个控制器调用操作方法时,您需要不同的通用功能,例如

  1. 异常处理
  2. 主页级别设置
  3. 通用自定义授权。
  4. 常见的自定义缓存
  5. 母版页级别的通用模型

所以每次如果你调用不同的控制器和它的动作,你需要重新生成相同的,你可以重建或通过 basecontroller 处理。

希望这有助于解决您的问题。

对于某些开发人员来说,创建一个 "BaseController" 或实际上是一个 BaseAnything class 以用于通用功能,然后从该 BaseWhatever 派生其他东西以便重用是一种非常常见的做法该功能。这只是基本的面向对象编程技术,与 MVC 没有任何具体关系(除了我们在本例中专门讨论 BaseController 的事实)。

有一些人,我恰好也在其中,他们认为显式 Base classes 通常是一种代码味道,并且经常被严重滥用为 "catch alls"。人们常常为了方便而将各种东西放在这些基础 classes 中,因为它比创建一些其他机制以更好的方式共享代码或数据更容易。

除非绝对必要,否则我避免使用 Base classes。我倾向于使用其他方法来实现通常以这种方式实现的功能(我称之为惰性重用)。备选方案的例子是:

  • 扩展方法
  • Html.Action 方法
  • 属性框架,例如 AOP
  • 依赖注入
  • 还有更多..

您可能出于好意创建了一个基础 class,并声称它只会用于非常有限的功能...但在您不知不觉中,您的项目中正在开发的其他人正在里面塞满了各种东西

我的规则是,不要这样做。不惜一切代价避免创建基地class,除非真的没有其他好的方法。

*注意:我指的是仅用于共享 implementation/data 的具体基础 classes。通用和抽象基础 classes 有点不同,用于分类法(即 is-a 关系)和分层目的的基础 classes 也是如此。一般来说,如果你调用了FooBase或BaseFoo,它可能是这种类型。

此规则也有其他例外情况,例如当出于测试目的包装不可测试的 class 时,您通常会为此目的创建一个基础 class,或者在您有时故意构建的框架中一个基础 class 旨在被继承,但不是通用的或抽象的。它在那里提供适合框架的功能。但是,这些并不是您在使用这些框架时通常可以控制的事情。