[英]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.