在使用 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; }
我的问题:有没有一种方法可以通过使用 Autofac 中的过滤器中的属性注入来解析服务?
使用 ASP.NET Core 中的过滤器,您几乎可以使用
依赖注入,而不是遵循服务定位器方法。 享受吧!
ASP.NET Core
主要的困境已经解决了 - 我们至少不使用Service Locator
。 恕我直言,
属性注入并不是很重要,所以我理解为什么Autofac团队不急于实施它。
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();
}
}
。