使用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在过滤器中通过属性注入来解析服务?

最佳答案

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

使用ASP.NET Core中的筛选器,而不是遵循服务定位器方法,您几乎可以使用依赖注入。

请享用!

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团队并不急于实现它。

关于c# - Autofac-ASP.NET Core中的 Action 过滤器中的属性注入(inject),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52797876/

10-17 02:33