BaseController 在 MVC 中的用途是什么?
BaseController uses for what in MVC?
我看了更多关于 MVC 的教程。但是我不明白,人们使用 "BaseController" 是为了什么?在一个项目中,有人用它来进行所有控制器之间的通信。在其他项目中有人用于获取日志。你能给我解释清楚吗?
这不是必须在应用程序中使用 basecontroller,但它就像您在应用程序中为所有页面使用母版页一样,您可以在此处应用相同的页面保持通用功能。从每个控制器调用操作方法时,您需要不同的通用功能,例如
- 异常处理
- 主页级别设置
- 通用自定义授权。
- 常见的自定义缓存
- 母版页级别的通用模型
所以每次如果你调用不同的控制器和它的动作,你需要重新生成相同的,你可以重建或通过 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 旨在被继承,但不是通用的或抽象的。它在那里提供适合框架的功能。但是,这些并不是您在使用这些框架时通常可以控制的事情。
我看了更多关于 MVC 的教程。但是我不明白,人们使用 "BaseController" 是为了什么?在一个项目中,有人用它来进行所有控制器之间的通信。在其他项目中有人用于获取日志。你能给我解释清楚吗?
这不是必须在应用程序中使用 basecontroller,但它就像您在应用程序中为所有页面使用母版页一样,您可以在此处应用相同的页面保持通用功能。从每个控制器调用操作方法时,您需要不同的通用功能,例如
- 异常处理
- 主页级别设置
- 通用自定义授权。
- 常见的自定义缓存
- 母版页级别的通用模型
所以每次如果你调用不同的控制器和它的动作,你需要重新生成相同的,你可以重建或通过 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 旨在被继承,但不是通用的或抽象的。它在那里提供适合框架的功能。但是,这些并不是您在使用这些框架时通常可以控制的事情。