gpt4 book ai didi

c# - Autofac - ASP.NET Core Action 过滤器中的属性注入(inject)

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:51 25 4
gpt4 key购买 nike

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

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

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

有几点需要说明:

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

Action 过滤器本身看起来有点不寻常,只要它与 Autofac 密切相关 - 我们实现 IAutofacActionFilter界面。

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

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 在过滤器中注入(inject)属性来解决服务问题? ?

最佳答案

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

无需遵循服务定位器方法,借助 ASP.NET Core 中的过滤器,您几乎可以使用依赖注入(inject)

尽情享受吧!

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

恕我直言,属性注入(inject) 不是很重要,所以我理解为什么 Autofac 团队并不急于实现它。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com