Mam filtr akcji w aplikacji ASP.NET MVC 3, która wymaga wstrzyknięcia pewnych zależności. Używam Autofac.Mvc3 jako wtryskiwacza zależności.Autofac nie wypełnia właściwości filtra akcji
Po prostu muszę zarejestrować typy, które chcę wstrzyknąć, zadzwonić pod numer RegisterFilterProvider
i umieścić właściwość publiczną na moim filtrze akcji, a następnie autofac wypełni właściwość odpowiednim obiektem podczas instancji filtra.
Tutaj jest częścią mojego działania filtra:
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
Tutaj jest częścią mojego 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
Włożyłem breakpoint prawo po SetResolver
w bezpośrednim oknie próbował :
DependencyResolver.Current.GetService(Of TraceSource)
I udało mi się uzyskać obiekt TraceSource z autofac, więc rejestracja wydaje się być OK.
Ale podczas OnActionExecuting
mój tracer
nieruchomość jest pusta.
Czego mi brakowało?
Dzięki! Na razie po prostu bezpośrednio nazywam 'DependencyResolver.Current.GetService (Of TraceSource)' w filtrze, ale spróbuję twoją sugestię później. –
Odpowiedź powyżej w C#: 'builder.Register (c => new MyHandleErrorAttribute()) \t \t \t \t .AsExceptionFilterFor() .InstancePerHttpRequest();' –
Pete
aw przypadku, gdy nie jest to filtr działanie błędu rejestracja będzie wyglądać tak: builder.Register (c => new SomeGlobalActionFilter()) .AsActionFilterFor() .PropertiesAutowired(). InstancePerRequest(); –
Sergey