【发布时间】:2018-05-31 23:58:25
【问题描述】:
我面临的问题是 AutoFac 没有将预期的参数注入相应的过滤器。
我有一个过滤器,用于记录所有控制器中所有方法的执行持续时间。为了完成该任务,我创建了一个 ActionFilter,如下所示:
//... other usings here...
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
namespace MyNamespace
{
internal class ExecutionTimeFilter : ActionFilterAttribute
{
public Logger _logger { get; set; }
public ExecutionTimeFilter(Logger logger)
{
_logger = logger;
}
public override void OnActionExecuting(HttpActionContext actionContext)
{
_logger.Log("Log the starting time + controller + action + etc");
actionContext.Request.Properties["Stopwatch"] = Stopwatch.StartNew();
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var stopwatch = (Stopwatch)actionExecutedContext.Request.Properties["Stopwatch"];
_logger.Log("Log the stopwatch.ElapsedMilliseconds + controller + action + etc");
}
}
}
我正在注册我的依赖项,如下所示:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
var container = new IocConfiguration().Configure(GlobalConfiguration.Configuration);
var resolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
//This is the only way I can get the logger injected
//This is what ideally I want to avoid
GlobalConfiguration.Configuration.Filters.Add(new ExecutionTimeFilter(_logger));
}
//IocConfiguration
using Autofac;
using Autofac.Integration.WebApi;
using System.Reflection;
using System.Web.Http;
using System.Web.Mvc;
namespace MyNamespace
{
internal class IocConfiguration
{
public IContainer Configure(HttpConfiguration httpConfiguration)
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterInstance(LogManager.GetLogger("LoggerName")).As<Logger>().SingleInstance();
builder.RegisterWebApiFilterProvider(httpConfiguration);
return builder.Build();
}
}
}
如果我按照official site 中描述的步骤操作,我会收到代码 sn-p 后描述的错误:
var builder = new ContainerBuilder();
builder.Register(c => new ExecutionTimeFilter(c.Resolve<Logger>()))
.AsWebApiActionFilterFor<MyController>()
.InstancePerRequest();
类型“MyController”必须可分配给 'Autofac.Integration.WebApi.IAutofacActionFilter'。参数名称: 注册
这是控制器的摘录:
//...Other usings...
using System.Threading.Tasks;
using System.Web.Http;
using System;
namespace MyNamespace.Controllers
{
public class MyController : ApiController
{
private readonly Logger _logger;
public MarketoController(Logger logger)
{
_logger = logger;
}
}
[HttpGet]
[Route("path/{entityId}")]
[ValidateEntityId]
public async Task<IHttpActionResult> Get(int? entityId = null)
{
return Ok();
}
}
我错过了什么?
【问题讨论】:
-
请附上
MyController的源代码(尤其是前30行)。 -
我已经完成了控制器 sn-p。谢谢!
-
您是否在 Autofac 构建器中注册过滤器提供程序?
builder.RegisterWebApiFilterProvider(config);可能有助于查看您的IocConfiguration.Configure方法。 -
是的,抱歉,我不想让问题变得非常大。我已经包括了所有涉及的组件。谢谢。
标签: c# asp.net-web-api2 autofac