У меня есть фильтр действий в приложении ASP.NET MVC 3, которому необходимо внедрить в него некоторые зависимости. Я использую Autofac.Mvc3 в качестве инжектора зависимостей.
Согласно вики autofac мне просто нужно зарегистрировать типы, которые я хочу внедрить, вызвать 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
Вот часть моего global.asax:
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
и в ближайшем окне попытался:
DependencyResolver.Current.GetService(Of TraceSource)
И я успешно получил TraceSource объект из autofac, так что с регистрацией все в порядке.
Но во время OnActionExecuting
моя tracer
собственность пуста.
Что я пропустил?