Moi aussi, je suis tombé sur ce problème et ont maintenant une solution de travail. Il est similaire à la solution décrite ci-dessus mais avec de légères différences et également avec le code Unity complet ajouté.
Tout d'abord je vais utiliser l'injection de propriété pour la raison décrite ci-dessus et, comme ci-dessus, je vais utiliser la méthode de colmatages sur l'unité pour injecter les propriétés dans les filtres déjà créés. Pour ce faire, tous mes contrôleurs héritent d'une nouvelle classe de base personnalisée. Sur cette classe de base, je substitue la méthode CreateActionInvoker afin de définir mon propre ActionInvoker personnalisé.
Protected Overrides Function CreateActionInvoker() As System.Web.Mvc.IActionInvoker
Return CustomActionInvoker
End Function
Ensuite, dans mon CustomActionInvoker, je remplace la méthode 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
Contrairement à ce qui est dit plus haut, je n'ai pas trouvé que faire l'accumulation dans une boucle For Each a causé aucun problème.J'ai également surmonté le problème original de n'avoir que l'objet référencé via une interface en utilisant l'une des autres surcharges de la méthode BuildUp qui prend un System.Type ainsi que l'objet existant.
Avec tout ce qui précède fait, je peux maintenant injecter des dépendances directement dans mes filtres.
Tous les commentaires et pensées très apprécié.
Vive Mike
j'ai essayé la solution trouvée dans le billet de blog, mais il semble y avoir quelques différences entre l'unité et Ninject, ou bien quelque part, le code de quelqu'un est mal :). Les filtres sont en lecture seule au moment où ils sont remplacés par les "InvokeExceptionFilters" remplacés. Je peux donc déclarer un nouveau filtre et injecter des dépendances, mais si j'essaie d'injecter des dépendances sur la liste fournie d'ExceptionFilters, rien ne se passe. Je pourrais créer un nouveau filtre et le passer à la classe de base, mais alors je perdrais toutes les informations déclaratives fournies sur l'attribut lui-même. –