繁体   English   中英

Autofac-ASP.NET Core中的动作过滤器中的属性注入

[英]Autofac - Property Injection in Action Filter in ASP.NET Core

在使用ASP.NET Web API 2编写应用程序时,我设法使用Autofac在过滤器级别实现了属性注入

(下面的示例属于非核心ASP.NET Web API)

builder.Register(x => new MyCustomGlobalActionFilter())
    .AsWebApiActionFilterOverrideFor<MyCustomController>()
    .InstancePerRequest()
    .PropertiesAutowired();

有两件事要提到:

  • 我们应该为任何这样的控制器注册它: .AsWebApiActionFilterOverrideFor<MyCustomController>()
  • 以下位用于启用属性注入.PropertiesAutowired()

只要动作过滤器与Autofac密切相关,它看起来就有点与众不同-我们实现了IAutofacActionFilter接口。

然后,我可以通过属性注入在过滤器级别解析服务,这里是代码示例:

public class MyCustomGlobalActionFilter : IAutofacActionFilter
{
    public Session Session { get; set; }
    public DbContextWithUserAuditing DbContext { get; set; }
    public ITenantService TenantService { get; set; }

    public Task OnActionExecutingAsync(
        HttpActionContext actionContext, 
        CancellationToken cancellationToken
        )
    {
        string userId = null;
        int? tenantId = null;

        var claimsIdentity = actionContext.RequestContext.Principal as ClaimsPrincipal;

        // do some stuff

        return Task.FromResult(0);
    }

    public Task OnActionExecutedAsync(
        HttpActionExecutedContext actionExecutedContext,
        CancellationToken cancellationToken
        )
    {
        return Task.FromResult(0);
    }
}

因此,为了将服务解析为属性,我们只需要声明它们如下:

public Session Session { get; set; }
public DbContextWithUserAuditing DbContext { get; set; }
public ITenantService TenantService { get; set; }

我的问题: 有没有办法通过使用ASP.NET Core Autofac在过滤器中通过属性注入来解析服务?

好吧,这实际上并不能回答我的问题,仍然有些人可能会觉得它有用。

不用遵循Service Locator方法,而是使用ASP.NET Core中的过滤器,您几乎可以使用Dependency Injection

请享用!

public class MyCustomFilter : IAsyncActionFilter
{
    private Session _session;
    private DBContextWithUserAuditing _dbContext;
    private ITenantService _tenantService;

    public MyCustomFilter(
        Session session,
        DBContextWithUserAuditing dbContext,
        ITenantService tenantService
        )
    {
        _session = session;
        _dbContext = dbContext;
        _tenantService = tenantService;
    }

    public async Task OnActionExecutionAsync(
        ActionExecutingContext context,
        ActionExecutionDelegate next
        )
    {
        string userId = null;
        int? tenantId = null;

        // do stuff
        // ...

        var resultContext = await next();
    }
}

解决了主要的难题-至少我们不使用Service Locator

恕我直言, 属性注入不是非常关键,所以我理解为什么Autofac团队并不急于实现它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM