Проблема, с которой я сталкиваюсь, заключается в том, что 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();
}
}
}
Если я выполняю шаги, описанные в официальный сайт Я получаю ошибку, описанную после фрагмента кода:
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();
}
}
Чего мне не хватает?