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()方法之间的区别。