Ja też natknąłem się na ten problem i mam teraz działające rozwiązanie. Jest podobny do rozwiązania opisanego powyżej, ale z niewielkimi różnicami, a także z dodanym pełnym kodem Unity.
Najpierw użyję wtrysku własności z opisanego powyżej powodu i, jak wyżej, będę używał metody BuildUp na Unity, aby wprowadzić właściwości do już utworzonych filtrów.
Aby to zrobić, wszystkie moje kontrolery dziedziczą z nowej niestandardowej klasy bazowej. W tej klasie bazowej nadpisuję metodę CreateActionInvoker, aby ustawić własny niestandardowy ActionInvoker.
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
Return CustomActionInvoker
End Function
Następnie w moim CustomActionInvoker przesłonię metodę GetFilters.
Protected Overrides Function GetFilters(ByVal controllerContext As ControllerContext, ByVal actionDescriptor As ActionDescriptor) As FilterInfo
Dim info = MyBase.GetFilters(controllerContext, actionDescriptor)
For Each MyAuthorizationFilter In info.AuthorizationFilters
MvcApplication.Container.BuildUp(MyAuthorizationFilter.GetType, MyAuthorizationFilter)
Next
For Each MyActionFilter In info.ActionFilters
MvcApplication.Container.BuildUp(MyActionFilter.GetType, MyActionFilter)
Next
For Each MyResultFilter In info.ResultFilters
MvcApplication.Container.BuildUp(MyResultFilter.GetType, MyResultFilter)
Next
For Each MyExceptionFilter In info.ExceptionFilters
MvcApplication.Container.BuildUp(MyExceptionFilter.GetType, MyExceptionFilter)
Next
Return info
End Function
Wbrew temu, co wyżej powiedziano, że nie okaże się, że robi to gromadzeniu się wewnątrz pętli For Each spowodowała żadnych problemów.Przezwyciężyłem także pierwotny problem polegający tylko na tym, że obiekt odwoływał się poprzez interfejs, używając jednego z innych przeciążeń metody BuildUp, która pobiera typ System.Type oraz istniejący obiekt.
Po wykonaniu wszystkich powyższych czynności mogę teraz dodawać zależności bezpośrednio do moich filtrów.
Wszelkie komentarze i przemyślenia bardzo doceniane.
Zdrówko Mike
próbowałem znaleźć rozwiązanie w blogu, ale nie wydaje się być pewne różnice między jednością a Ninject, albo gdzieś czyjeś kod jest źle :). Filtry są tylko do odczytu, zanim przejdą do nadpisanego "InvokeExceptionFilters". Więc mogę zadeklarować nowy filtr i wstrzyknąć zależności, ale jeśli spróbuję wstrzyknąć zależności na podanej liście ExceptionFilters, nic się nie dzieje. Mogę utworzyć nowy filtr i przekazać go do klasy bazowej, ale wtedy straciłbym wszystkie deklaratywne informacje podane na samym atrybucie. –