ASP.NET Core具有对依赖项注入的内置支持。 您可以在ASP.NET Core中使用依赖项注入在运行时插入组件,从而使您的代码更灵活,更易于测试和维护。 注入依赖项有三种基本方法,即构造函数注入,setter注入和接口注入。
构造函数注入可能是在ASP.NET Core中注入依赖项的最广泛使用的方法。 但是,构造函数注入并不总是理想的选择,尤其是当您只需要一种或几种方法中的依赖项时。 在这种情况下,利用FromServices属性更加有效,该属性使您可以将依赖项直接注入到控制器的操作方法中。
本文讨论了如何在ASP.NET Core中使用FromServices属性来注入依赖项。 我们还将说明在ASP.NET Core中构造依赖项注入最常见的方式。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
在Visual Studio中创建一个ASP.NET Core API项目
首先,让我们在Visual Studio中创建一个ASP.NET Core项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio 2019中创建新的ASP.NET Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
- 点击下一步
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
- 在“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
- 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 单击创建。
这将在Visual Studio 2019中创建一个新的ASP.NET Core API项目。在本文的后续部分中,我们将使用此项目来处理FromServices属性。
在ASP.NET Core中创建新的控制器
让我们创建一个新的控制器并在其中使用FromServices属性。 请按照下面概述的步骤创建一个新的控制器。
- 在“解决方案资源管理器”窗口中选择“控制器”解决方案文件夹。
- 单击“添加->控制器...”以创建一个新的控制器。
- 选择模板“具有读/写操作的API控制器”。
- 单击添加。
- 将控制器命名为SecurityController。
- 单击添加以完成该过程。
在ASP.NET Core中使用构造函数注入
让我们首先检查如何使用构造函数注入来注入依赖项。 考虑以下称为ISecurityService的接口。
public interface ISecurityService
{
bool Validate(string userID, string password);
}
public class SecurityService : ISecurityService
{
public bool Validate(string userID, string password)
{
//Write code here to validate the user credentials
return true;
}
}
要将服务添加到容器,可以在Startup类的ConfigureServices方法中编写以下代码。
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ISecurityService, SecurityService>();
services.AddControllers();
}
以下代码段说明了如何在控制器中使用构造函数注入。
[Route("api/[controller]")]
[ApiController]
public class SecurityController : ControllerBase
{
private readonly ISecurityService _securityService;
public SecurityController(ISecurityService securityService)
{
_securityService = securityService;
}
[HttpGet]
public bool Get(string userId, string password)
{
return _securityService.Validate(userId, password);
}
//Other methods
}
ASP.NET Core中的FromServicesAttribute类
与Microsoft.AspNetCore.Mvc命名空间有关的FromServicesAttribute类可用于将服务直接注入到操作方法中。 这是在Microsoft.AspNetCore.Mvc命名空间中定义FromServicesAttribute类的方式。
public ref class FromServicesAttribute : Attribute, Microsoft::AspNetCore::Mvc::ModelBinding::IBindingSourceMetadata
在控制器中使用FromServices属性时,它指定将操作方法中的参数绑定到来自服务容器的服务。 换句话说,当您在操作方法中使用此属性时,将使用服务容器在运行时解析依赖项。
使用FromServices属性在ASP.NET Core中进行依赖项注入
到目前为止,一切都很好。 现在,如果我们在其他操作方法中不需要安全服务实例怎么办? 在内存中拥有一个不会得到太多重用的实例有什么意义? 这正是FromServices属性的作用所在。
下面的代码片段显示了如何利用FromServices属性在控制器的action方法中注入依赖项。
using Microsoft.AspNetCore.Mvc;
namespace IDGFromServicesDemo.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class SecurityController : ControllerBase
{
[HttpGet]
public ActionResult<bool> Get([FromServices] ISecurityService
securityService, string userId, string password)
{
return securityService.Validate(userId, password);
}
//Other methods
}
}
当仅在少数几种操作方法中使用依赖项时,在方法签名中使用FromServices属性注入依赖项是一个理想的选择。 您可以在控制器的操作方法中利用FromServices属性,以使代码干净,精简和可维护。
翻译自: https://www.infoworld.com/article/3451821/how-to-use-the-fromservices-attribute-in-aspnet-core.html