Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET Core如何在ActionFilterAttribute里做依赖注入

ASP.NET Core如何在ActionFilterAttribute里做依赖注入

作者头像
Edi Wang
发布于 2019-07-08 11:39:33
发布于 2019-07-08 11:39:33
1.5K00
代码可运行
举报
文章被收录于专栏:汪宇杰博客汪宇杰博客
运行总次数:0
代码可运行

在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入。但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢?

问题

我的博客系统里有个用来删除订阅文件缓存的ActionFilter,想要在发生异常的时候记录日志。我的博客用的日志组件是NLog,因此不使用依赖注入的话,就直接使用LogManager.GetCurrentClassLogger()获得一个Logger的实例。整个过滤器的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DeleteSubscriptionCache : ActionFilterAttribute
{
 private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
        DeleteSubscriptionFiles();
    }
    private void DeleteSubscriptionFiles()
    {
        try
        {
            // ...
        }
        catch (Exception e)
        {
 Logger.Error(e, "Error Delete Subscription Files");
        }
    }
}

然后在Action上去使用,和经典的ASP.NET MVC一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Authorize]
[HttpPost, ValidateAntiForgeryToken, DeleteSubscriptionCache]
[Route("manage/edit")]
public IActionResult Edit(PostEditModel model)

这当然可以没有问题的运行,但写代码最重要的就是逼格,这个代码耦合了NLog,而我的博客系统里其他地方早就在用ASP.NET Core的ILogger接口了。如果哪天日志组件不再用NLog了,那么这个地方的代码就得改,而使用ILogger接口的代码就不需要动。虽然这种情况是绝对不会发生的,但是写代码一定要有追求,尽可能过度设计,才能不被人鄙视,然后才能面试造航母,工作拧螺丝。因此我决定把日志组件用依赖注入的方式安排一下。

改造过滤器

方法和在Controller中使用依赖注入完全一样,我们使用构造函数注入ILogger<DeleteSubscriptionCache>类型。于是代码变成了这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DeleteSubscriptionCache : ActionFilterAttribute
{
 protected readonly ILogger<DeleteSubscriptionCache> Logger;
    public DeleteSubscriptionCache(ILogger<DeleteSubscriptionCache> logger)
    {
        Logger = logger;
    }
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
        DeleteSubscriptionFiles();
    }
    private void DeleteSubscriptionFiles()
    {
        try
        {
            // ...
        }
        catch (Exception e)
        {
            Logger.LogError(e, "Error Delete Subscription Files");
        }
    }
}

但是问题来了,这样的话我们是没法在Action上无脑使用了,因为构造函数要求传参。如果要自己new一个的话,装逼就失败了。我们来看看正确的解决方法~

ServiceFilter

其实ASP.NET Core里,我们可以使用ServiceFilter来完成这个需求。它也是一种Attribute,可以作用在Action上。位于Microsoft.AspNetCore.Mvc.Core程序集里,定义如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// A filter that finds another filter in an System.IServiceProvider.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class ServiceFilterAttribute : Attribute, IFilterFactory, IFilterMetadata, IOrderedFilter
{
        public ServiceFilterAttribute(Type type);
        public int Order { get; set; }
        public Type ServiceType { get; }
        public bool IsReusable { get; set; }
        public IFilterMetadata CreateInstance(IServiceProvider serviceProvider);
}

ServiceFilter允许我们解析一个已经添加到IoC容器里的服务,因此我们需要把DeleteSubscriptionCache注册一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddScoped<DeleteSubscriptionCache>();

然后就能直接使用了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Authorize]
[HttpPost, ValidateAntiForgeryToken]
[ServiceFilter(typeof(DeleteSubscriptionCache))]
[Route("manage/edit")]
public IActionResult Edit(PostEditModel model)

运行时发现ILogger已经能被实例化了,完美!

参考资料:

https://stackoverflow.com/questions/36109052/inject-service-into-action-filter/36109690

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-2.2

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 汪宇杰博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[译]ASP.NET Core依赖注入深入讨论
这篇文章我们来深入探讨ASP.NET Core、MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中。
Esofar
2018/09/05
2.3K0
【asp.net core 系列】10 实战之ActionFilter
在上一篇中,我们提到了如何创建一个UnitOfWork并通过ActionFilter设置启用。这一篇我们将简单介绍一下ActionFilter以及如何利用ActionFilter,顺便补齐一下上一篇的工具类。
程序员小高
2020/06/18
7160
Asp.Net Core Filter 深入浅出的那些事-AOP
在分享ASP.NET Core Filter 使用之前,先来谈谈AOP,什么是AOP 呢?
Jlion
2022/04/07
5820
Asp.Net Core Filter 深入浅出的那些事-AOP
ASP.NET Core 依赖注入基本用法
ASP.NET Core从框架层对依赖注入提供支持。也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式。本文将介绍依赖注入的基本概念,并结合代码演示如何在 ASP.NET Core中使用依赖注入。
拓荒者IT
2019/09/24
2.2K0
ASP.NET Core 依赖注入基本用法
ASP.NET Core中的ActionFilter与DI
  前几篇文章都是讲ASP.NET Core MVC中的依赖注入(DI)与扩展点的,也许大家都发现在ASP.NET CORE中所有的组件都是通过依赖注入来扩展的,而且面向一组功能就会有一组接口或抽象工厂来扩展功能,就如IControllerActivator这样的功能点在上篇文章(查看.NET Core源代码通过Autofac实现依赖注入到Controller属性)中也提到了,今天我们主要介绍一个大类似的扩展点,ASP.NET Core MVC中为我们提供了新的机制为Action Filters(也就是过滤器)进行依赖注入的扩展。
yoyofx
2018/09/05
9960
ASP.NET Core - 在ActionFilter中使用依赖注入
当我们的ActionFilter需要使用某个Service的时候,我们一般会通过构造函数注入。 演示一下,首先自定义一个ActionFilter,通过构造函数注入IMyService:
MJ.Zhou
2020/03/25
1.2K0
ASP.NET Core ActionFilter引发的一个EF异常
最近在使用ASP.NET Core的时候出现了一个奇怪的问题。在一个Controller上使用了一个ActionFilter之后经常出现EF报错。
MJ.Zhou
2020/03/19
8000
【ASP.NET Core 基础知识】--依赖注入(DI)--在ASP.NET Core中使用依赖注入
在ASP.NET Core中实现依赖注入的第一步是配置依赖注入。ASP.NET Core使用了一个称为依赖注入容器(DI Container)的组件来管理对象之间的依赖关系。DI容器在应用程序启动时被配置,并且可以在应用程序的整个生命周期内使用。以下是配置依赖注入的基本步骤:
喵叔
2024/05/24
9820
asp.net core 系列之Dependency injection(依赖注入)
ASP.NET Core支持依赖注入。这是一种在类和其依赖之间实现控制反转的一种技术(IOC).
Vincent-yuan
2019/09/11
1.7K0
asp.net core 系列之Dependency injection(依赖注入)
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型
在对应用模型的基本构建方式具有大致的了解之后,我们来系统地认识一下描述应用模型的ApplicationModel类型。对于一个描述MVC应用模型的ApplicationModel对象来说,它承载的元数据绝大部分是由默认注册的DefaultApplicationModelProvider对象提供的,在接下来针对ApplicationModel及其相关类型(ControllerModel、ActionModel和ParameterModel等)的介绍中,我们还会着重介绍DefaultApplicationModelProvider对象采用怎样的方式提取并设置这些元数据。
蒋金楠
2024/02/28
2730
ASP.NET Core MVC应用模型的构建[2]: 定制应用模型
金三银四面试:ASP.NET Core面试题汇总
金三银四面试准备,奉上第三弹ASP.NET Core面试题汇总。先出题大家试答一下,然后再看后面的答案。希望对大家面试有所帮助。
郑子铭
2024/05/08
5250
金三银四面试:ASP.NET Core面试题汇总
asp.net core之依赖注入
ASP.NET Core 支持依赖关系注入 (DI) 软件设计模式,这是一种在类及其依赖关系之间实现控制反转 (IoC) 的技术。 按照官方文档的描述: 依赖关系注入通过以下方式解决了这些问题:
饭勺oO
2023/10/18
4960
asp.net core之依赖注入
ASP.NET Core 2.2 十八.各种Filter的内部处理机制及执行顺序
ASP.NET core 的Filter是系统中经常用到的,本文详细分享一下各种Filter定义、执行的内部机制以及执行顺序。(ASP.NET Core 系列目录)
FlyLolo
2019/03/06
2.4K0
ASP.NET Core应用基本编程模式[2]:依赖注入
基于IHostBuilder/IHost的服务承载系统建立在依赖注入框架之上,它在服务承载过程中依赖的服务(包括作为宿主的IHost对象)都由代表依赖注入容器的IServiceProvider对象提供。在定义承载服务时,也可以采用依赖注入方式来消费它所依赖的服务。作为依赖注入容器的IServiceProvider对象能否提供我们需要的服务实例,取决于相应的服务注册是否预先添加到依赖注入框架中。服务注册可以通过调用IHostBuilder接口或者IWebHostBuilder接口相应的方法来完成,前者在《服务承载系统》已经有详细介绍,下面介绍基于IWebHostBuilder接口的服务注册。[本文节选自《ASP.NET Core 3框架揭秘》第11章, 更多关于ASP.NET Core的文章请点这里]
蒋金楠
2020/11/13
1.1K0
ASP.NET Core应用基本编程模式[2]:依赖注入
ASP.NET Core 依赖注入(DI)简介
本文为官方文档译文 ASP.NET Core是从根本上设计来支持和利用依赖注入。 ASP.NET Core应用程序可以通过将其注入到Startup类中的方法中来利用内置的框架服务,并且应用程序服务也可以配置为注入。 ASP.NET Core提供的默认服务容器提供了一个最小的功能集,而不是替换其他容器。 什么是依赖注入? 依赖注入,英文是Dependency Injection一般简称DI,是实现对象与其协作者或依赖关系之间松散耦合的技术。为了执行其操作,类所需的对象不是直接实例化协作者或使用静态引用,
晓晨
2018/06/22
3.3K0
学习ASP.NET Core,你必须了解无处不在的“依赖注入”
ASP.NET Core的核心是通过一个Server和若干注册的Middleware构成的管道,不论是管道自身的构建,还是Server和Middleware自身的实现,以及构建在这个管道的应用,都需要相应的服务提供支持,ASP.NET Core自身提供了一个DI容器来实现针对服务的注册和消费。换句话说,不只是ASP.NET Core底层框架使用的服务是由这个DI容器来注册和提供,应用级别的服务的注册和提供也需要以来这个DI容器,所以正如本文标题所说的——学习ASP.NET Core,你必须了解无处不在的“依
蒋金楠
2018/01/15
1.2K0
学习ASP.NET Core,你必须了解无处不在的“依赖注入”
.net 温故知新【16】:Asp.Net Core WebAPI 筛选器
这即是我们经常听到的面向切面编程AOP(Aspect Oriented Programming)技术,AOP通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
SpringSun
2023/12/19
3920
.net 温故知新【16】:Asp.Net Core WebAPI  筛选器
ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
本篇代码以下代码进行调整:https://github.com/ken-io/asp.net-core-tutorial/tree/master/chapter-02
KenTalk
2019/04/12
2K0
ASP.NET Core 入门教程 10、ASP.NET Core 日志记录(NLog)入门
将传统 ASP.NET 应用迁移到 .NET Core
现在越来越多的人在谈论. NET Core。诚然,.NET Core 是未来, 但是.NET Framework 仍在支持, 因为大量的应用程序无法在短时间内迁移。
Edi Wang
2019/07/08
5.1K1
将传统 ASP.NET 应用迁移到 .NET Core
ASP.NET Core依赖注入解读&使用Autofac替代实现
标签: 依赖注入 Autofac ASPNETCore 1. 前言 关于IoC模式(控制反转)和DI技术(依赖注入),我们已经见过很多的探讨,这里就不再赘述了。比如说必看的Martin Fowler《IoC 容器和 Dependency Injection 模式》,相关资料链接都附于文章末尾。其中我非常赞同Artech的说法"控制更多地体现为一种流程的控制",而依赖注入技术让我们的应用程序实现了松散耦合。 ASP.NET Core本身已经集成了一个轻量级的IOC容器,开发者只需要定义好接口后,在Startu
潘成涛
2018/01/18
1.6K0
ASP.NET Core依赖注入解读&使用Autofac替代实现
推荐阅读
相关推荐
[译]ASP.NET Core依赖注入深入讨论
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档