【51CTO.com快译】运用ASP.NET Core或ASP.NET Core MVC处置Web运用顺序中的控制器时,您能够会遇到代码冗余。比如说,能够遇到过运用依赖项注入(DI)来注入所需效劳的控制器。假设注入依赖项的代码在多个控制器中被重用,就存在代码冗余,并违犯DRY准绳。
本文着重引见DI代码冗余,并引见如何构建自定义基本控制器以避免此类成绩。要运用本文中提供的代码示例,应该在系统中安装Visual Studio 2019。假设您还没有安装,可以在此处下载Visual Studio 2019。
Visual Studio中创立ASP.NET Core MVC项目首先,不妨在Visual Studio 2019中创立一个ASP.NET Core项目。按照这些步骤将在 Visual Studio 2019中创立一个新的ASP.NET Core MVC项目。
1. 启动Visual Studio IDE。
2. 点击“创立新项目”。
3. 在“创立新项目”窗口中,从显示的模板列表中选择“ASP.NET Core Web App (Model-View-Controller)”。
4. 点击“下一步”。
5. 在“配置新项目”窗口中,指定新项目的称号和位置。
6. 依据团体爱好,选择性勾选“将处置方案和项目放在同一目录中”复选框。
7. 点击“下一步”。
8. 在随后显示的“额外信息”窗口中,从顶部的下拉列表中选择.NET 5.0作为目的框架。任由“身份验证类型”处于“无”(默许)的形状。
9. 确保“启用Docker”、“为HTTPS配置”和“启用Razor运转时编译”等复选框未被勾选,由于我们不会在这里运用任何这些功用。
10. 点击创立。
将创立一个新的ASP.NET Core MVC项目。我们将在本文的后续部分中运用这个项目来处置依赖项注入。
如今按照下面列出的步骤,在您的项目中创立额外控制器。
1. 鼠标右击控制器处置方案文件夹。
2. 选择添加 -> 控制器。
3. 在“添加新脚手架项”对话框中,选择API作为模板(默许状况下将选择MVC)。
4. 选择“具有读/写操作的API控制器”这项。
5. 点击添加。
6. 在随后显示的“添加新项”对话框中,为新控制器指定称号。
7. 点击添加。
ASP.NET Core中的内置基本控制器类控制器有两个基本类,即ControllerBase和Controller。ControllerBase类完成IController 接口,并提供几个办法和属性的完成。它定义了一个名为ExecuteCore的笼统办法,用于定位操作办法并执行它。无论何时构建API,您都应该运用ControllerBase。
Controller类扩展了ControllerBase类,提供了ExecuteCore办法,并添加了可以在控制器类中运用的几个办法,比如View()和Redirect()。与ControllerBase一样,Controller 类是支持视图的基本控制器类。因此,只需在ASP.NET Core MVC中创立控制器,都应该运用Controller类。ControllerBase类提供了与路由和HttpContext的必要集成,以便您可以应用它们。它还含有管理ViewData和TempData所需的代码。
ASP.NET Core中完成基本控制器类我们在ASP.NET Core中创立新的API控制器类时,它默许扩展ControllerBase类。接上去,我们将创立基本控制器的完成。我们的基本控制器类将扩展框架的ControllerBase 类。
这是我们将在该示例中运用的实体类:
public class Order
{
public int Id { get; set; }
public int CustomerId { get; set; }
public string Address { get; set; }
}
如今创立一个名为IOrderManager的下列接口,含有ProcessOrder办法的声明。
public interface IOrderManager
{
public void ProcessOrder(Order order);
}
接上去创立扩展IOrderManager接口,并完成ProcessOrder办法的OrderManager类。
public class OrderManager : IOrderManager
{
public void ProcessOrder(Order order)
{
throw new System.NotImplementedException();
}
}
下列代码片段显示了您如何经过从ControllerBase类中推导来创立基本控制器类。
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase
{
protected readonly ILogger<BaseController> _logger;
protected readonly IOrderManager _orderManager;
public BaseController(ILogger<BaseController> logger,
IOrderManager orderManager)
{
_logger = logger;
_orderManager = orderManager;
}
}
ASP.NET Core中扩展自定义基本控制器如今您可以创立控制器,只需从我们刚创立的这个自定义基本控制器来推导。下列代码片段表明了您如何经过刚创立的基本控制器类加以扩展来创立控制器类。
[Route("api/[controller]")]
[ApiController]
public class OrderController : BaseController
{
private readonly ILogger<OrderController> _logger;
[HttpGet]
public string Get()
{
return "OrderController";
}
[HttpPost]
public void ProcessOrder(Order order)
{
_orderManager.ProcessOrder(order);
}
}
但是,您会发现上述代码不会编译。以下是您会在Visual Studio中看到的错误:
该错误表明,您需求运用与BaseController类结构函数相反的参数完成另一个参数结构函数。但为什么?假设您要在扩展所创立的基本控制器类的一切控制器中复制依赖项注入代码,也就失掉了扩展类的目的。
要处置此成绩,您可以应用HttpContext.RequestServices.GetService扩展办法。记住,假设您试图在控制器的结构函数中拜访HttpContext实例,该实例将为null。
作为ASP.NET Core央求的一部分而存在的效劳可经过HttpContext.RequestServices集合来拜访。这意味着当您央求效劳时,将从该集合解析央求。
将HttpContext添加到ASP.NET Core中的基本控制器类
这是我们的BaseController 类的更新后源代码。
(责任编辑:admin)