Injection de dépendances avec l’atsortingbut Ninject et Filter pour asp.net mvc

J’écris un filtre d’autorisation personnalisé pour asp.net mvc 3. Je dois injecter un service utilisateur dans la classe mais je ne sais pas comment faire.

public class AuthorizeAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { private IUserService userService; private ssortingng[] roles; public AuthorizeAtsortingbute(params ssortingng[] roles) { this.roles = roles; } public void OnAuthorization(AuthorizationContext filterContext) { throw new NotImplementedException(); } } 

J’utilise ninject pour l’dependency injection. Je ne veux pas utiliser un modèle de localisateur d’usine ou de service.

Mes liaisons ressemblent à ceci dans le fichier global.acsx:

  internal class SiteModule : NinjectModule { public override void Load() { Bind().To(); } } 

Voir cette réponse:

Autorisation personnalisée MVC 3 et Ninject IoC

Si vous voulez utiliser l’injection de constructeur, vous devez créer un atsortingbut et un filtre.

 ///marker atsortingbute public class MyAuthorizeAtsortingbute : FilterAtsortingbute { } //filter public class MyAuthorizeFilter : IAuthorizationFilter { private readonly IUserService _userService; public MyAuthorizeFilter(IUserService userService) { _userService = userService; } public void OnAuthorization(AuthorizationContext filterContext) { var validUser = _userService.CheckIsValid(); if (!validUser) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "action", "AccessDenied" }, { "controller", "Error" } }); } } } 

Contraignant:

 this.BindFilter(System.Web.Mvc.FilterScope.Controller, 0).WhenControllerHas(); 

Manette:

 [MyAuthorizeAtsortingbute] public class YourController : Controller { } 

HTH …

Je recommande fortement la réponse de BZ. NE PAS utiliser [Injecter]!

J’ai utilisé un [Inject] comme Darin Dimitrov l’a dit était possible et cela a causé des problèmes de threading sous une charge élevée, des situations de conflit élevées en conjonction avec .InRequestScope.

La manière de BZ est aussi ce qui est sur le wiki et j’ai vu beaucoup d’endroits où Remo Gloor (auteur de Ninject) dit que c’est la bonne façon de le faire

https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations

Downvote [Inject] répond ici parce que vous serez sérieusement brûlé (probablement en production si vous ne chargez pas correctement les tests auparavant!)

Sur le chemin serait d’utiliser une injection de propriété et décorer la propriété avec l’atsortingbut [Inject] :

 public class AuthorizeAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { [Inject] public IUserService UserService { get; set; } private ssortingng[] roles; ... } 

L’injection de constructeur ne fonctionne pas bien avec les atsortingbuts car vous ne pourrez plus décorer les contrôleurs / actions avec eux. Vous ne pouvez utiliser que l’injection de constructeur avec la syntaxe de liaison de filtre dans NInject:

 public class AuthorizeAtsortingbute : FilterAtsortingbute, IAuthorizationFilter { private readonly IUserService userService; private ssortingng[] roles; public AuthorizeAtsortingbute(IUserService userService, params ssortingng[] roles) { this.userService = userService; this.roles = roles; } ... } 

et alors:

 internal class SiteModule : Ninject.Modules.NinjectModule { public override void Load() { Bind().To(); this.BindFilter(FilterScope.Controller, 0) .WhenControllerType(); } } 

La méthode d’extension BindFilter<> est définie dans l’ Ninject.Web.Mvc.FilterBindingSyntax noms Ninject.Web.Mvc.FilterBindingSyntax conséquent, assurez-vous d’avoir Ninject.Web.Mvc.FilterBindingSyntax cette fonctionnalité avant de l’appeler sur un kernel.

J’ai trouvé une solution simple pour toutes les occasions où la construction n’est pas gérée par Ninject:

 var session = (IMyUserService)DependencyResolver.Current.GetService(typeof (IMyUserService)); 

En fait, c’est exactement ce que j’utilise avec mon AuthorizeAtsortingbute personnalisé. Beaucoup plus facile que d’avoir à implémenter un FilterAtsortingbute séparé.