Я нашел несколько вопросов по этому поводу, но они, как правило, указывают на точную документацию, которой я следую... но она все еще не работает.
Я создаю довольно простой сайт ASP.NET MVC 4, и я планирую использовать ведение журнала на основе ActionFilterAttribute
. У меня есть класс DataAccessProvider
, который открывает транзакции с базой данных и предоставляет экземпляры единиц работы, и я пытаюсь внедрить его в атрибут фильтра.
В документации говорится, что достаточно просто вызвать RegisterFilterProvider()
и убедиться, что соответствующие типы зарегистрированы. Там конкретно написано, что атрибут прописывать не надо, но я пробовал и с ним и без. Мой код в настоящее время выглядит примерно так:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(x => new EntityAccessProvider())
.As<IDataAccessProvider>()
.InstancePerHttpRequest();
builder.RegisterType<DebugLogAttribute>().PropertiesAutowired();
// ^ I've tried it with and without this line
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Затем пример в документах просто помещает свойство в фильтр, поэтому я сделал то же самое:
public class DebugLogAttribute : ActionFilterAttribute
{
private IDataAccessProvider DataAccess { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext) { ... }
public override void OnActionExecuted(ActionExecutedContext filterContext) { ... }
}
Документы говорят, что это все, что требуется - даже не конструктор для внедрения; это делается путем внедрения свойства. Однако, когда я запускаю этот код, свойство DataAccess
всегда равно null
; Autofac, кажется, игнорирует это. Я знаю, что регистрация работает правильно, потому что она правильно вводит EntityAccessProvider
в мои контроллеры, но не работает для атрибутов. Что мне не хватает?