许多控制器会降低性能吗? MVC
Does lots of controllers slows the performance? MVC
我想问一个关于 MVC 控制器的简单问题。我在谷歌上搜索了很多关于 "different controllers for each basic table" 控制器的信息,它清除了很多东西,但我有一个问题我找不到答案。
我的问题是,如果我为每个基本 table 创建控制器,假设我有 10 个基本 table 可以创建 10 个控制器。那么大量控制器会降低应用程序性能吗?
- 以防万一,从视图到控制器。
- 以防万一,当从控制器转到另一个控制器时。
我是新来的所以请保持冷静:)
这取决于对 controller.If 的调用次数,您经常调用控制器 2 到 3 table 所以它可能会 slow.Instead 组那 3 table 在一个控制器中调用 that.If 你的应用程序需要单独工作 table 而不是很好,如果你的应用程序需要 2 到 3 table 的内容,你将得到响应 quiker.But比你必须在这里调用 3 controller.So 更好的方法是将它分组在一个控制器中。
希望你明白了
通常,一个请求由一个控制器处理。如果它(控制器)很小并且有一些依赖 - 它很快。当你有一个巨大的控制器时,其他 类 的许多依赖项都有自己的依赖项等等......这可能是个问题。
简答
没有
长答案
数量 的控制器对性能的影响不如每个控制器实例的创建成本那么大。
您可能因控制器数量而获得的开销可以忽略不计。尽管 MVC 框架使用 .NET 反射来识别当前控制器类型,但它已优化为首先在 <Project Name>.Controllers
命名空间中查找。但是这个列表缓存在一个文件中,所以第一次命中后性能还不错。
当您在控制器构造函数中进行繁重的处理时,您可能 运行 会遇到性能问题。该框架为 每个 请求创建一个控制器实例,因此您应该尽可能降低创建控制器实例的成本。如果您遵循以 DI 为中心(依赖项注入)的方法,即使您实际上并未在您的项目中使用 DI,您也可以将创建控制器实例的成本保持在最低限度。
用简单的英语来说,这意味着 - 仅在创建控制器时将依赖项注入构造函数。实际上不要在构造函数中进行任何处理,将其推迟到实际的 Action 方法调用。
public interface IHeavyProcessingService
{
IProcessingResult DoSomethingExpensive();
}
public class HeavyProcessingService : IHeavyProcessingService
{
public HeavyProcessingService() {
}
public IProcessingResult DoSomethingExpensive() {
// Lots of heavy processing
System.Threading.Thread.Sleep(300);
}
}
public class HomeController
{
private readonly IHeavyProcessingService heavyProcessingService;
// The constructor does no heavy processing. It is deferred until after
// the instance is created by HeavyProcessingService.
// The only thing happening here is assignment of dependencies.
public HomeController(IHeavyProcessingService heavyProcessingService) {
if (heavyProcessingService == null)
throw new ArgumentNullException("heavyProcessingService");
this.heavyProcessingService = heavyProcessingService;
};
public ActionResult Index()
{
var result = this.heavyProcessingService.DoSomethingExpensive();
// Do something with the result of the heavy processing
return View();
}
public ActionResult About()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
有关详细信息,请参阅 this answer。
如果您确实在您的应用程序中实际使用了 DI 容器,您可以通过为每个依赖项选择正确的生活方式来进一步提高性能。如果您可以在多个控制器实例之间共享相同的依赖项实例(单例生活方式),则创建控制器实例的成本会更低。
Backs 所说的也不一定是真的。依赖项的数量并不重要,重要的是 创建这些依赖项的成本有多高。只要构造函数保持轻量和简单,并且为每个依赖项使用正确的生活方式,无论控制器具有多少依赖项,性能都不会成为问题。也就是说,控制器不应超过 5 个 直接 依赖项 - 之后,您应该 refactor to aggregate services,使依赖项层次结构更像是一个倒置的金字塔而不是一个倒置的金字塔flat set 全部注入控制器。
我想问一个关于 MVC 控制器的简单问题。我在谷歌上搜索了很多关于 "different controllers for each basic table" 控制器的信息,它清除了很多东西,但我有一个问题我找不到答案。
我的问题是,如果我为每个基本 table 创建控制器,假设我有 10 个基本 table 可以创建 10 个控制器。那么大量控制器会降低应用程序性能吗?
- 以防万一,从视图到控制器。
- 以防万一,当从控制器转到另一个控制器时。
我是新来的所以请保持冷静:)
这取决于对 controller.If 的调用次数,您经常调用控制器 2 到 3 table 所以它可能会 slow.Instead 组那 3 table 在一个控制器中调用 that.If 你的应用程序需要单独工作 table 而不是很好,如果你的应用程序需要 2 到 3 table 的内容,你将得到响应 quiker.But比你必须在这里调用 3 controller.So 更好的方法是将它分组在一个控制器中。 希望你明白了
通常,一个请求由一个控制器处理。如果它(控制器)很小并且有一些依赖 - 它很快。当你有一个巨大的控制器时,其他 类 的许多依赖项都有自己的依赖项等等......这可能是个问题。
简答
没有
长答案
数量 的控制器对性能的影响不如每个控制器实例的创建成本那么大。
您可能因控制器数量而获得的开销可以忽略不计。尽管 MVC 框架使用 .NET 反射来识别当前控制器类型,但它已优化为首先在 <Project Name>.Controllers
命名空间中查找。但是这个列表缓存在一个文件中,所以第一次命中后性能还不错。
当您在控制器构造函数中进行繁重的处理时,您可能 运行 会遇到性能问题。该框架为 每个 请求创建一个控制器实例,因此您应该尽可能降低创建控制器实例的成本。如果您遵循以 DI 为中心(依赖项注入)的方法,即使您实际上并未在您的项目中使用 DI,您也可以将创建控制器实例的成本保持在最低限度。
用简单的英语来说,这意味着 - 仅在创建控制器时将依赖项注入构造函数。实际上不要在构造函数中进行任何处理,将其推迟到实际的 Action 方法调用。
public interface IHeavyProcessingService
{
IProcessingResult DoSomethingExpensive();
}
public class HeavyProcessingService : IHeavyProcessingService
{
public HeavyProcessingService() {
}
public IProcessingResult DoSomethingExpensive() {
// Lots of heavy processing
System.Threading.Thread.Sleep(300);
}
}
public class HomeController
{
private readonly IHeavyProcessingService heavyProcessingService;
// The constructor does no heavy processing. It is deferred until after
// the instance is created by HeavyProcessingService.
// The only thing happening here is assignment of dependencies.
public HomeController(IHeavyProcessingService heavyProcessingService) {
if (heavyProcessingService == null)
throw new ArgumentNullException("heavyProcessingService");
this.heavyProcessingService = heavyProcessingService;
};
public ActionResult Index()
{
var result = this.heavyProcessingService.DoSomethingExpensive();
// Do something with the result of the heavy processing
return View();
}
public ActionResult About()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
有关详细信息,请参阅 this answer。
如果您确实在您的应用程序中实际使用了 DI 容器,您可以通过为每个依赖项选择正确的生活方式来进一步提高性能。如果您可以在多个控制器实例之间共享相同的依赖项实例(单例生活方式),则创建控制器实例的成本会更低。
Backs 所说的也不一定是真的。依赖项的数量并不重要,重要的是 创建这些依赖项的成本有多高。只要构造函数保持轻量和简单,并且为每个依赖项使用正确的生活方式,无论控制器具有多少依赖项,性能都不会成为问题。也就是说,控制器不应超过 5 个 直接 依赖项 - 之后,您应该 refactor to aggregate services,使依赖项层次结构更像是一个倒置的金字塔而不是一个倒置的金字塔flat set 全部注入控制器。