Я нашел несколько вопросов по этому вопросу, но они, как правило, указывают на точную документацию, которую я следую... но она все еще не работает.
Я создаю довольно простой сайт 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
в мои контроллеры, но не работает для атрибутов. Что мне не хватает?