asp.net 依赖注入_如何在ASP.NET Core 3.1的操作筛选器中使用依赖项注入

asp.net 依赖注入

过滤器使您可以在请求处理管道的某些阶段执行代码。 动作过滤器是在执行动作方法之前或之后执行的过滤器。 通过使用动作过滤器,可以使动作方法更加精简,干净和可维护。

有几种可用于操作方法的过滤器,每个过滤器对应于请求处理管道的不同阶段。 您可以在我之前的文章中阅读有关动作过滤器的更多信息。 在本文中,我们将讨论如何在ASP.NET Core 3.1的动作过滤器中使用依赖项注入。

[ 同样在InfoWorld上:程序员自言自语的9个谎言 ]

若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019

在Visual Studio 2019中创建ASP.NET Core 3.1 MVC项目

首先,让我们在Visual Studio 2019中创建一个ASP.Net Core项目。假设系统中安装了Visual Studio 2019,请按照下面概述的步骤在Visual Studio中创建一个新的ASP.Net Core项目。

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

完成这些步骤后,应在Visual Studio 2019中创建一个新的ASP.Net Core MVC项目。我们将在以下各节中使用此项目来说明在ASP.NET Core 3.1的操作方法中使用依赖项注入。

在ASP.NET Core 3.1中使用RequestServices.GetService方法

尽管不建议这样做,但使用RequestServices.GetService方法是检索已添加到服务集合的服务的简单方法。 假设已将名为CustomService的服务添加到服务容器,则可以使用以下代码检索服务实例。

public override void OnActionExecuting(ActionExecutingContext context)
        {
            var customService = context.HttpContext.RequestServices.
            GetService(typeof(CustomService));
            //Write your code here
            _logger.LogWarning("Inside OnActionExecuting method...");
            base.OnActionExecuting(context);
        }

在ASP.NET Core 3.1中使用ServiceFilter属性

更好的做法是利用ServiceFilter属性-可以在控制器或操作级别应用它。 这是使用此属性的语法。

[ServiceFilter(typeof(typeof YourActionFilter))]

下面我们将学习如何利用ServiceFilter属性在动作过滤器中进行依赖注入。

在ASP.NET Core 3.1中创建自定义ActionFilterAttribute类

让我们创建一个自定义ActionFilterAttribute类,并将其用作ServiceFilter。 若要在ASP.NET Core 3.1中创建自定义操作筛选器,应创建一个扩展ActionFilterAttribute类的类,如下面给出的代码片段所示。 请注意,ActionFilterAttribute类实现了IActionFilter,IAsyncActionFilter,IResultFilter,IAsyncResultFilter和IOrderedFilter接口。

public class CustomActionFilter : ActionFilterAttribute
    {
        private readonly ILogger _logger;
    public CustomActionFilter(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger("CustomActionFilter");
        }
     public override void OnActionExecuting(ActionExecutingContext context)
        {
            _logger.LogWarning("Inside OnActionExecuting method...");
            base.OnActionExecuting(context);
        }
    public override void OnActionExecuted(ActionExecutedContext context)
        {
            _logger.LogWarning("Inside OnActionExecuted method...");
            base.OnActionExecuted(context);
        }
    public override void OnResultExecuting(ResultExecutingContext context)
        {
            _logger.LogWarning("Inside OnResultExecuting method...");
            base.OnResultExecuting(context);
        }
    public override void OnResultExecuted(ResultExecutedContext context)
        {
            _logger.LogWarning("Inside OnResultExecuted method...");
            base.OnResultExecuted(context);
        }
    }

在ASP.NET Core 3.1中注册自定义操作筛选器

在ASP.NET Core中,您可以轻松地将服务添加到服务容器。 依赖注入不仅是ASP.NET Core中的一等公民,而且内置了对依赖注入的支持。 因此,您可以轻松注入框架服务和应用程序服务。 您可以使用以下任何一种方法在ASP.NET Core中使用依赖项注入来添加服务。

  • AddTransient
  • 添加范围
  • AddSingleton

您可以从我在本文前面的文章中了解有关依赖项注入以及每种方法的作用的更多信息。

接下来,您必须注册自定义过滤器,以便可以将其用作ServiceType。 以下代码段说明了如何实现此目的。

public void ConfigureServices(IServiceCollection services)
{
  services.AddScoped<CustomActionFilter>();
  services.AddControllersWithViews();
}

在ASP.NET Core 3.1的控制器中使用自定义操作筛选器

您可以利用ServiceFilter属性在控制器或控制器的操作方法中注入依赖项。 这是使用ServiceFilter属性的语法。

[ServiceFilter(typeof(MyCustomFilter))]

下面的代码段显示了如何将自定义操作过滤器应用于名为HomeController的控制器类中的操作方法。 请注意如何使用ServiceFilter属性。

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;
        }
        [ServiceFilter(typeof(CustomActionFilter))]
        public IEnumerable<string> Get()
        {
            _logger.LogInformation("Inside HttpGet action method...");
            return new string[] { "Joydip", "Michael", "Anand", "Steve" };
        }
    }

在ASP.NET Core 3.1中设置操作筛选器的执行顺序

您甚至可以设置动作过滤器的执行顺序。 具有较高执行顺序的动作过滤器将在执行周期的稍后执行。 动作过滤器的通常执行顺序如下:

  1. 全局动作过滤器的OnActionExecuting方法
  2. 控制器动作过滤器的OnActionExecuting方法
  3. 动作筛选器的OnActionExecuting方法
  4. 动作方式
  5. 动作过滤器的OnActionExecuted方法
  6. 控制器动作过滤器的OnActionExecuted方法
  7. 全局动作过滤器的OnActionExecuted方法

您可以分别设置动作过滤器的执行顺序。 下面的代码段显示了如何实现此目的。

[ServiceFilter(typeof(CustomActionFilter), Order = 2)]
public IEnumerable<string> Get()
{
   _logger.LogInformation("Inside HttpGet action method...");
    return new string[] { "Joydip", "Michael", "Anand", “Steve” };
}

当您执行应用程序时,您会观察到CustomActionFilter在执行全局动作过滤器之后执行。

在ASP.NET Core 3.1中使用TypeFilter属性

您还可以使用类型过滤器将依赖项注入到动作过滤器中。 ServiceFilter属性对于通过IoC(控制反转)容器解决的依赖关系很好地工作。 TypeFilter的工作方式与ServiceFilter大致相同,但不需要在服务容器中注册。 此外,类型过滤器还可以用于将其他参数传递给动作过滤器。

以下代码段说明了如何使用TypeFilter。

[TypeFilter(typeof(CustomFilter), Arguments = new object[] {"This is a string parameter"})]
[HttpGet("")]
public IEnumerable<string> Get()
{
  _logger.LogInformation("Inside HttpGet action method...");
  return new string[] { "Joydip", "Michael", "Anand" };
}

在ASP.NET Core 3.1中使用全局操作筛选器

您还可以通过将操作过滤器添加到IServiceCollection实例的Filters集合来全局应用过滤器,如下面给出的代码片段所示。

{
    services.AddControllers(config =>
    {
        config.Filters.Add<CustomFilter>();
    }).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
}

这使您可以将过滤器应用于项目中每个控制器的每个操作方法。

依赖项注入的最大好处之一是,它使您可以构建松耦合的应用程序。 在使用控制器及其动作方法时,可能经常需要注入过滤器来修改这些动作的执行方式。 ASP.NET Core 3.1使您可以轻松做到这一点。

如何在.NET Core中执行更多操作:

翻译自: https://www.infoworld.com/article/3544006/how-to-use-dependency-injection-in-action-filters-in-aspnet-core-31.html

asp.net 依赖注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值