Anche io ho riscontrato questo problema e ora ho una soluzione funzionante. È simile alla soluzione sopra descritta ma con alcune leggere differenze e anche con il codice Unity completo aggiunto.
Per prima cosa utilizzerò l'iniezione di proprietà per la ragione sopra descritta e, come sopra, userò il metodo BuildUp su Unity per iniettare le proprietà nei filtri già creati.
Per fare ciò ho ereditato tutti i controller da una nuova classe di base personalizzata. Su quella classe base sovrascrivo il metodo CreateActionInvoker per impostare il mio ActionInvoker personalizzato.
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
Return CustomActionInvoker
End Function
Quindi nel mio CustomActionInvoker sovrascrivo il metodo 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
Contrariamente a quanto detto sopra non ho trovato che facendo l'accumulo all'interno di un ciclo For Each causato problemi.Ho anche superato il problema originale di avere solo l'oggetto referenziato tramite un'interfaccia utilizzando uno degli altri overload del metodo BuildUp che accetta un System.Type così come l'oggetto esistente.
Con tutte le operazioni precedenti, ora posso iniettare direttamente le dipendenze nei miei filtri.
Qualsiasi commento e pensiero molto apprezzato.
Acclamazioni Mike
fonte
2010-05-10 19:01:35
ho tentato la soluzione trovata nel post del blog, ma sembra che ci sia alcune differenze tra l'Unità e Ninject, oppure da qualche parte, il codice di qualcuno è sbagliato :). I filtri sono in sola lettura quando raggiungono "InvokeExceptionFilters" sovrascritto. Quindi posso dichiarare un nuovo filtro e iniettare dipendenze, ma se provo a iniettare dipendenze dall'elenco fornito di ExceptionFilters, non succede nulla. Potrei creare un nuovo filtro e passarlo alla classe base, ma poi perderei tutte le informazioni dichiarative fornite sull'attributo stesso. –