Autofac не заполняет свойство фильтра действия
у меня есть фильтр действий в ASP.NET приложение MVC 3, которое нуждается в некоторых зависимостях, введенных в него. Я использую Autofac.Mvc3 в качестве инжектора зависимостей.
по данным Вики autofac мне просто нужно зарегистрировать типы, которые я хочу ввести, call RegisterFilterProvider
, и поместите общедоступное свойство в мой фильтр действий, а затем autofac заполнит свойство правильным объектом во время создания экземпляра фильтра.
вот часть моего действия фильтр:
Public Class LogActionAttribute
Inherits ActionFilterAttribute
Property tracer As TraceSource
Public Overrides Sub OnActionExecuting(filterContext As System.Web.Mvc.ActionExecutingContext)
...
tracer.TraceData(...)
...
End Sub
End Class
вот часть моего глобального.асакс:
Public Class MvcApplication
Inherits System.Web.HttpApplication
Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
filters.Add(New MyHandleErrorAttribute)
filters.Add(New LogActionAttribute)
End Sub
Sub Application_Start()
InitSettingRepoEtc()
...
End Sub
Protected Shared Sub InitSettingRepoEtc()
...
Dim builder = New ContainerBuilder
builder.RegisterControllers(Reflection.Assembly.GetExecutingAssembly)
...
builder.Register(Of TraceSource)(
Function(x) New TraceSource("requests", SourceLevels.All)).InstancePerHttpRequest()
...
builder.RegisterFilterProvider()
Dim container = builder.Build
DependencyResolver.SetResolver(New AutofacDependencyResolver(container))
...
End Sub
End Class
Я поставил точку останова сразу после SetResolver
и в окне immediate попробовал:
DependencyResolver.Current.GetService(Of TraceSource)
и я успешно получил объект TraceSource от autofac, поэтому регистрация, похоже, в порядке.
а в OnActionExecuting
мой tracer
свойство является пустым.
что я пропустил?
1 ответов
IIRC поставщик не работает с "глобальными" фильтрами.
удалить эту функцию:
Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
filters.Add(New MyHandleErrorAttribute)
filters.Add(New LogActionAttribute)
End Sub
и вместо этого зарегистрируйте глобальные фильтры с Autofac напрямую:
builder.Register(Of MyHandleErrorAttribute)
.As(Of IActionFilter)
.PropertiesAutowired()
.SingleInstance();
builder.Register(Of LogActionAttribute)
.As(Of IActionFilter)
.PropertiesAutowired()
.SingleInstance();
Autofac создаст фильтры и включит их соответствующим образом. Преимущество этого подхода заключается в том, что вы можете рефакторировать, чтобы фильтры не были производными от атрибутов, а затем использовать конструктор, а не инъекцию свойств.