AddMvc 和 AddMvcCore 的区别-17

2019-05-15 09:57:44 浏览数 (1)

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

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

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

代码语言:javascript复制
services.AddMvc();

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

AddMvc() v/s AddMvcCore()

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

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

代码语言:javascript复制
public class HomeController
{
    public string Index()
    {
            return "Hello from MVC";
    }
}

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

代码语言:javascript复制
public class HomeController : Controller
{
    public JsonResult Index()
    {
        return Json(new { id=1, name="pragim" });
    }
}

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

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

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

代码语言:javascript复制
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()方法之间的区别。

0 人点赞