Author Image

admin

6月前 650

ASP.NET Core 为什么有 AddMvc 和 AddMvcCore 他们是什么关系?

本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP)
本文出自《从零开始学 ASP.NET Core 与 EntityFramework Core》目录
视频课程效果更佳:跨平台开发实战掌握 ASP.NET Core 与 EntityFramework Core

ASP.NET Core 为什么有 AddMvc 和 AddMvcCore 他们是什么关系?

在本章节中,我们将讨论 AddMvc()和 AddMvcCore()方法之间的区别。

要在 ASP.NET Core 应用程序中设置 MVC,我们在 Startup 类的 ConfigureServices()方法中调用 IServiceCollection 接口的 AddMvc()方法。

services.AddMvc();

除了 AddMvc()方法,我们在 IServiceCollection 接口上也有 AddMvcCore()方法。 因此,我们想到的一个显而易见的问题是,这两种方法之间的区别是什么。

AddMvc() v/s AddMvcCore()

在我们讨论 AddMvc()和 AddMvcCore()方法之间的区别之前,让我们修改以下 HomeController 以返回 JSON 格式的数据,而不是简单的字符串。

目前,没有为 HomeController 类指定基类。 它现在还可以为我们从 Index()动作方法返回一个简单的字符串。

public class HomeController
{
    public string Index()
    {
            return "Hello from MVC";
    }
}

但是,如果我们想要从 Index()操作方法返回 HTML 视图或 JSON 数据,则我们的 HomeController 类必须继承框架提供的 Controller 类。 Controller 基类提供了返回不同结果的支持,如 JsonResult,ViewResult,PartialViewResult 等。 修改 HomeController 类以从 Controller 类派生并从 Index()方法返回 JsonResult,如下所示。

public class HomeController : Controller
{
    public JsonResult Index()
    {
        return Json(new { id=1, name="pragim" });
    }
}

请注意:Controller 类存在于 Microsoft.AspNetCore.Mvc 命名空间中。

此时,运行应用程序,我们应该按预期在浏览器中看到 JSON 数据。

现在,在 ConfigureServices()方法中调用 AddMvcCore()方法而不是 AddMvc()并运行应用程序。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore();
}

我们收到以下错误

没有为"Microsoft.AspNetCore.Mvc.Formatters.Json.Internal.JsonResultExecutor"类型的服务注册

为了能够返回 JSON 数据,需要在依赖注入容器中注册 JsonFormatterServices。AddMvc()方法执行此操作,但不执行 AddMvcCore()方法。您可以通过查看 ASP.NET Core MVC Github 页面上的源代码来确认这一点。

https://github.com/aspnet/Mvc/blob/release/2.2/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs

顾名思义,AddMvcCore()方法只添加核心 MVC 服务。另一方面,AddMvc()方法添加了所有必需的 MVC 服务。AddMvc()方法在内部调用 AddMvcCore()方法,以添加所有核心 MVC 服务。因此,如果我们调用 AddMvc()方法,则无需再次显式调用 AddMvcCore()方法。

我希望这可以澄清 AddMvc()和 AddMvcCore()方法之间的区别。

文章说明

如果您觉得我的文章质量还不错,欢迎打赏,也可以订阅我的视频哦
未得到授权不得擅自转载本文内容,52abp.com 保留版权

感谢您对我的支持

关注微信公众号:角落的白板报

公众号:角落的白板报