如何在ASP.NET Core中使用FromServices属性

ASP.NET Core具有对依赖项注入的内置支持。 您可以在ASP.NET Core中使用依赖项注入在运行时插入组件,从而使您的代码更灵活,更易于测试和维护。 注入依赖项有三种基本方法,即构造函数注入,setter注入和接口注入。

构造函数注入可能是在ASP.NET Core中注入依赖项的最广泛使用的方法。 但是,构造函数注入并不总是理想的选择,尤其是当您只需要一种或几种方法中的依赖项时。 在这种情况下,利用FromServices属性更加有效,该属性使您可以将依赖项直接注入到控制器的操作方法中。

[ 同样在InfoWorld上:.NET 5.0不会附带的.NET Framework API ]

本文讨论了如何在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项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“ ASP.NET Core Web应用程序”。
  4. 点击下一步
  5. 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。
  7. 在“创建新的ASP.NET Core Web应用程序”窗口中,从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.2(或更高版本)。 我将在这里使用ASP.NET Core 3.0。
  8. 选择“ API”作为项目模板以创建新的ASP.NET Core API应用程序。
  9. 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不使用这些功能。
  10. 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
  11. 单击创建。

这将在Visual Studio 2019中创建一个新的ASP.NET Core API项目。在本文的后续部分中,我们将使用此项目来处理FromServices属性。

[ 同样在InfoWorld上:为什么C编程语言仍会统治 ]

在ASP.NET Core中创建新的控制器

让我们创建一个新的控制器并在其中使用FromServices属性。 请按照下面概述的步骤创建一个新的控制器。

  1. 在“解决方案资源管理器”窗口中选择“控制器”解决方案文件夹。
  2. 单击“添加->控制器...”以创建一个新的控制器。
  3. 选择模板“具有读/写操作的API控制器”。
  4. 单击添加。
  5. 将控制器命名为SecurityController。
  6. 单击添加以完成该过程。

在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属性时,它指定将操作方法​​中的参数绑定到来自服务容器的服务。 换句话说,当您在操作方法中使用此属性时,将使用服务容器在运行时解析依赖项。

[ 通过InfoWorld的App Dev Report新闻通讯了解软件开发中的热门话题 ]

使用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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET Core WebAPI 项目,你可以通过使用 Model Binding 功能来解析 JSON 数据并将其转换为 User 类对象。以下是一个简单的示例代码: 首先,确保你的 User 类具有与 JSON 数据字段对应的属性。例如: ```csharp public class User { public string Name { get; set; } public int Age { get; set; } // 其他属性... } ``` 然后,在你的控制器的相应方法使用 `[FromBody]` 特性将 JSON 数据绑定到 User 类对象上。例如: ```csharp [HttpPost] public IActionResult CreateUser([FromBody] User user) { // 这里的 user 参数将包含从请求解析的 JSON 数据 // 执行其他操作,如保存到数据库 return Ok(); } ``` 在上述示例,`CreateUser` 方法使用 `[FromBody]` 特性将请求的 JSON 数据绑定到名为 `user` 的 User 类对象上。你可以根据需要在该方法执行相应的操作,比如将 user 对象保存到数据库。 当发送 POST 请求时,确保请求的 Content-Type 设置为 `application/json`,并提供符合 User 类结构的 JSON 数据。例如: ```http POST /api/users HTTP/1.1 Content-Type: application/json { "Name": "John", "Age": 25 } ``` 这样,ASP.NET Core WebAPI 就会自动将请求的 JSON 数据解析为 User 对象,并将其传递给 `CreateUser` 方法的 user 参数。 注意:为了使 Model Binding 可以正常工作,你需要在 `Startup.cs` 文件添加适当的配置。例如,在 `ConfigureServices` 方法添加以下代码: ```csharp services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; options.JsonSerializerOptions.PropertyNamingPolicy = null; }); ``` 这样,你就可以在 ASP.NET Core WebAPI 项目成功解析 JSON 数据成 User 类,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值