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

问题描述 投票:0回答:2

在使用 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; }

我的问题:有没有一种方法可以通过使用 Autofac 中的过滤器中的属性注入来解析服务?


    

c# asp.net-core inversion-of-control autofac
2个回答
0
投票

使用 ASP.NET Core 中的过滤器,您几乎可以使用

依赖注入

,而不是遵循服务定位器方法。 享受吧!

ASP.NET Core

主要的困境已经解决了 - 我们至少不使用 
Service Locator

恕我直言,

属性注入

并不是很重要,所以我理解为什么Autofac团队不急于实施它。


0
投票
记录了如何执行此操作。您必须将依赖项声明为公共属性,并在注册所有依赖项后调用

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(); } }

© www.soinside.com 2019 - 2024. All rights reserved.