使用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/