J'essaie d'utiliser Ninject sur mon projet actuel, et jusqu'à présent, je l'aimais. Je suis en train de tenter de configurer un objet IInterceptor pour intercepter et gérer un appel de méthode ayant échoué vers ma couche de service. Ceci est hébergé dans une application ASP.NET MVC 5.La tentative de résolution d'un élément de Ninject dans IInterceptor échoue
Dans le IInterceptor
, j'ai essayé plusieurs choses, telles que:
Définition des variables privées à l'aide de l'injection de constructeur, mais il est venu découvrir qu'il semble Ninject réutilisera une instance
IInterceptor
pour une méthode indéfiniment, et je n'ai pas trouvé un moyen d'arrêter ça. Puisque l'une des choses que j'apporte dans la portée est uneDbContext
qui est disposée ailleurs, elle finit par échouer sur toutes les demandes futures que celle sur laquelle elle a été créée. J'ai trouvé queIInvocation
a une propriétéRequest.Kernel
. Cependant, lorsque je tente de résoudre mon UOW à partir du conteneur, qui est.InRequestScope()
, il échoue, car il tente de résoudre les dépendancesIUowService
(l'une des dépendances dépend du HttpContext qui est null à ce stade), mais semble être le faire en dehors de la portée de la demande. Il ignore le fait que les dépendances dont il a besoin ont déjà été créées dans la requête ASP.NET et tente d'en créer de nouvelles.Définition d'une liaison pour l'intercepteur
this.Bind<NinjectExceptionHandler>().ToSelf().InTransientScope()
, mais cela n'a pas semblé arrêter la mise en cache de l'intercepteur.
J'imagine qu'il y a quelque chose qui me manque. Je comprends vouloir mettre en cache des objets IInterceptor
pour la performance, mais je trouve ça ennuyeux que je ne peux pas facilement utiliser le conteneur ou l'injection IOC pour obtenir les objets dont j'ai besoin pour ma demande.
Ceci est le dernier problème que je rencontre pour obtenir l'interception en fonction de mes besoins, donc toute aide est grandement appréciée!
concernant 2 .: Avez-vous essayé d'utiliser l'extension de préservation du contexte de ninject? Et puis vous devez faire 'Request.Kernel.ContextPreservingGet <...>()'. Nous avons rencontré le même problème et nous avons créé notre propre implémentation d'injection par proxy/interception où chaque instance de proxy obtient sa propre instance d'intercepteur. Cependant, nous avons eu une discussion avec le responsable du projet et je pense qu'il devrait y avoir un moyen de spécifier que l'intercepteur ne devrait pas être réutilisé, mais je ne me souviens pas exactement de quoi il s'agissait, désolé. – BatteryBackupUnit
@BatteryBackupUnit, toute information supplémentaire que vous seriez en mesure de donner sur ce serait utile. J'ai juste essayé le plugin de préservation de contexte, et cela n'a pas semblé fonctionner - même problème, il semble fonctionner en dehors de la portée de la demande originale de Ninject - bizarre. Je devine par «discussion avec le mainteneur de projet» vous voulez dire Ninject? Comment avez-vous exactement écrit votre implémentation pour que chaque proxy ait son propre intercepteur? Merci pour votre réponse rapide! – tostringtheory