如何将服务注入自定义ActionFilterAttribute(Web API)?

尝试更好

我尝试了以下答案:[https://stackoverflow.com/questions/18406506/custom-filter-attributes-inject-dependency][1]为Web API项目(不是MVC)实现ActionFilterAttribute(System.Web.Http.Filters) )。但是我的自定义属性从未在控制器中调用。如有任何建议,我将不胜感激。

自定义属性:

public class MyAttribute : FilterAttribute { }

筛选:

public class MyFilter : ActionFilterAttribute
{
    private readonly IMyService _myService;

    public MyFilter(IMyService myService)
    {
        _myService = myService;
    }

    public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        //do some with actionContext
        throw new Exception("You can`t go here");
    }
}

控制器方式:

[My] // Not called
[HttpPost]
[Route("/do-some")]
public async Task DoSome(string myString)
{
     //do some
}

注册过滤器:

public partial class Startup 
{
    protected void ConfigureApi(IAppBuilder app, IContainer container) 
    {
        var configuration = new HttpConfiguration();
        //...
        var serviceInstance = container.GetInstance<IMyService>();
        configuration.Filters.Add(new MyFilter(serviceInstance));
    }
}

这有什么问题吗?

暗面月亮

您的代码几乎可以解决所有问题,但是您应该以其他方式注册过滤器和服务。

在Asp Net Core WebAPI中,有几种注册过滤器的方法:

全局注册示例:

            services.AddControllers(options => 
            {
                options.Filters.Add(typeof(LoggerFilterAttribute));
            });

在Controller中注册方法的示例:

我想通知您-在这种情况下,您应该使用ServiceFilter-这有助于DI为您的过滤器解析所有依赖项。

        [HttpGet]
        [ServiceFilter(typeof(LoggerFilterAttribute))]
        public IEnumerable<WeatherForecast> Get()
        {

        }

这是我完成此任务的简单示例:

  1. 我的 SimpleService
    public interface ISimpleService 
    {
        void Notify(string text);
    }
    public class SimpleService : ISimpleService
    {
        public void Notify(string text)
        {
            Console.WriteLine($"Notify from {nameof(SimpleService)}. {text}");
        }
    }
  1. ActionFilterAttribute
    public class LoggerFilterAttribute : ActionFilterAttribute
    {
        private readonly ISimpleService _simpleService;

        public LoggerFilterAttribute(ISimpleService simpleService)
        {
            _simpleService = simpleService;
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            _simpleService.Notify($"Method {nameof(OnActionExecuting)}");
        }

        public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            _simpleService.Notify($"Method {nameof(OnActionExecutionAsync)}");
            return base.OnActionExecutionAsync(context, next);
        }
    }
  1. 主要步骤-你应该选择注册的方式,因为有全球注册每代码控制器/法之间的主要区别。
  • 如果要使用这种注册方式-您只需要注册全局过滤器就足够了。一切神奇将通过WebAPIDI注册来完成。
            services.AddControllers(options => 
            {
                options.Filters.Add(typeof(LoggerFilterAttribute));
            });
  • 如果要按控制器/方法使用注册。您需要在DI中注册过滤器。因为没有它,您将有异常。
services.AddScoped<LoggerFilterAttribute>();
        [HttpGet]
        [ServiceFilter(typeof(LoggerFilterAttribute))]
        public IEnumerable<WeatherForecast> Get()
        {

        }
  1. 最后一步注册我的服务
services.AddTransient<ISimpleService, SimpleService>();
  1. 结果 结果

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将 nifi web-api bean 注入自定义处理器

来自分类Dev

Autofac注入到自定义Web-Api FilterAttribute

来自分类Dev

如何将数据从自定义授权属性传递到Web API操作方法?

来自分类Dev

如何从Azure移动服务自定义Api调用方法?

来自分类Dev

如何在QT中自定义“ Notification Web API”

来自分类Dev

自定义动作过滤器统一依赖注入Web API 2

来自分类Dev

Asana API - 如何将子任务添加到具有自定义字段的项目

来自分类Dev

Web Speech API自定义单词

来自分类Dev

Web Speech API自定义单词

来自分类Dev

Web API-自定义路由

来自分类Dev

自定义授权 - Web Api

来自分类Dev

Angular2-如何将服务注入自定义异常处理程序

来自分类Dev

如何将服务动态注入到grails自定义工件中

来自分类Dev

如何将服务注入到Orchard中的自定义IHttpHandler中

来自分类Dev

如何将服务注入 Angular 2+ 中的自定义 .ts 文件

来自分类Dev

如何键入自定义的堆积API?

来自分类Dev

如何使用AWS api网关和Web api实施自定义身份验证(逻辑)

来自分类Dev

如何将自定义数据添加到标记(Google Maps API SWIFT)

来自分类Dev

如何使用angularJS自定义服务从REST API获取数据

来自分类Dev

将通用参数绑定到Web API中的自定义模型绑定器

来自分类Dev

使用Web API自定义属性将JSON响应更改为Pascal大小写

来自分类Dev

XMPP服务器和自定义API

来自分类Dev

TypeScript和自定义React Hook Api服务

来自分类Dev

为Kubernetes集群安装自定义Metrics API服务

来自分类Dev

自定义API移动服务Azure IOS

来自分类Dev

在移动服务自定义api中解析HTML

来自分类Dev

为自定义 api 设置 ruby 服务器

来自分类Dev

如何在我的自定义数据提供程序上注入 api-plaform 的分页过滤器

来自分类Dev

如何在ASP.NET Framework Web API中返回自定义JSON对象?

Related 相关文章

  1. 1

    将 nifi web-api bean 注入自定义处理器

  2. 2

    Autofac注入到自定义Web-Api FilterAttribute

  3. 3

    如何将数据从自定义授权属性传递到Web API操作方法?

  4. 4

    如何从Azure移动服务自定义Api调用方法?

  5. 5

    如何在QT中自定义“ Notification Web API”

  6. 6

    自定义动作过滤器统一依赖注入Web API 2

  7. 7

    Asana API - 如何将子任务添加到具有自定义字段的项目

  8. 8

    Web Speech API自定义单词

  9. 9

    Web Speech API自定义单词

  10. 10

    Web API-自定义路由

  11. 11

    自定义授权 - Web Api

  12. 12

    Angular2-如何将服务注入自定义异常处理程序

  13. 13

    如何将服务动态注入到grails自定义工件中

  14. 14

    如何将服务注入到Orchard中的自定义IHttpHandler中

  15. 15

    如何将服务注入 Angular 2+ 中的自定义 .ts 文件

  16. 16

    如何键入自定义的堆积API?

  17. 17

    如何使用AWS api网关和Web api实施自定义身份验证(逻辑)

  18. 18

    如何将自定义数据添加到标记(Google Maps API SWIFT)

  19. 19

    如何使用angularJS自定义服务从REST API获取数据

  20. 20

    将通用参数绑定到Web API中的自定义模型绑定器

  21. 21

    使用Web API自定义属性将JSON响应更改为Pascal大小写

  22. 22

    XMPP服务器和自定义API

  23. 23

    TypeScript和自定义React Hook Api服务

  24. 24

    为Kubernetes集群安装自定义Metrics API服务

  25. 25

    自定义API移动服务Azure IOS

  26. 26

    在移动服务自定义api中解析HTML

  27. 27

    为自定义 api 设置 ruby 服务器

  28. 28

    如何在我的自定义数据提供程序上注入 api-plaform 的分页过滤器

  29. 29

    如何在ASP.NET Framework Web API中返回自定义JSON对象?

热门标签

归档