【发布时间】:2019-03-18 18:26:15
【问题描述】:
在使用 ASP.NET Web API 2 编写应用程序时,我设法使用 Autofac 在过滤器级别实现了Property Injection。
(以下示例属于非核心 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 action filter dependency injection上快速搜索Google 会产生this blog article,这建议您使用[ServiceFilter(MyFilterType)]将您的过滤器推过DI。在 Autofac 中使用PropertiesAutowired注册您的类型会得到您想要的。 -
嗨@TravisIllig,感谢您的回复。用
PropertiesAutowired尝试过,它不能解析属性。请参阅下面关于依赖注入的答案。
标签: c# asp.net-core inversion-of-control autofac