Comment utiliser l'injection de dépendance avec un attribut?
Dans un projet MVC je suis de la création j'ai le texte suivant RequirePermissionAttribute
qui obtient mis sur n'importe quelle action qui a besoin d'autorisations spécifiques (il a été simplifié pour cet exemple):
public class RequirePermissionAttribute : ActionFilterAttribute, IAuthorizationFilter
{
public Operation Permissions { get; set; }
public RequirePermissionAttribute() { }
public RequirePermissionAttribute(Operation permissions)
{
this.Permissions = permissions;
}
public bool AuthorizeCore(HttpContextBase httpContext)
{
IAuthorizationService authServ = new ASPNETAuthorizationService();
return authServ.Authorize(httpContext);
}
public void OnAuthorization(AuthorizationContext filterContext)
{
Enforce.ArgNotNull(filterContext);
if (this.AuthorizeCore(filterContext.HttpContext))
{
//code snipped.
}
else
{
//code snipped.
}
}
}
De sorte que le problème évidemment c'est que mes autoriser attribut a une dépendance sur le ASPNETAuthorizationService
que j'ai créé. Je ne peux pas aller le constructeur de chemin depuis les attributs de la compilation vérifié.
Une chose à dire, je suis en utilisant ma propre petite Cio que j'ai fait et il n'a pas le support de la propriété d'injection (encore). Bien sûr, si je l'ai fait aller la propriété de l'injection de route, j'aurais à ajouter le support (que je devrais faire de la recherche).
Quel est le meilleur moyen d'injecter quelque chose dans un attribut de la classe?
Vous devez vous connecter pour publier un commentaire.
J'ai d'abord pensé que ce n'était pas possible, mais je suis corrigé. Voici un exemple avec une Ninject:
http://codeclimber.net.nz/archive/2009/02/10/how-to-use-ninject-to-inject-dependencies-into-asp.net-mvc.aspx
Mise à jour 2016-10-13
C'est une jolie vieille question maintenant, et les cadres ont un peu changé. Ninject permet maintenant de vous pour ajouter des fixations spécifiques des filtres basés sur la présence de certains attributs, avec ce code:
Ceci est en accord avec le principe, a fait valoir par Mark Seeman et par l'auteur de la Simple Injecteur, qui est que vous devez garder la logique de votre filtre d'actions distinctes de la classe attribut personnalisé.
MVC 5 et 6, il est beaucoup plus facile à injecter des valeurs dans les attributs qu'elle ne l'habitude d'être. Encore, la séparation de l'action du filtre de votre attribut est vraiment la meilleure approche à adopter.
IActionFilter
interface est une classe séparée qui contient comportement.Strictement parlant, on ne peut pas utiliser l'injection de dépendance pour injecter une dépendance dans un attribut. Les attributs de métadonnées pas de comportement.
[AttributeSpecification()]
encourage en interdisant les types de référence arguments.Ce que vous êtes probablement à la recherche pour l'utilisation d'un attribut et d'un filtre, puis à injecter des dépendances dans le filtre. L'attribut ajoute des métadonnées, qui détermine s'il convient d'appliquer le filtre et le filtre reçoit l'injection de dépendances.
Il y a très peu de raisons pour ce faire.
Cela dit, si vous avez l'intention de les injecter dans un attribut, vous pouvez utiliser le ASP.NET Core, MVC
IApplicationModelProvider
. Le cadre passe de dépendances dans le fournisseur du constructeur et le fournisseur peut passer des dépendances à l'attribut propriétés ou méthodes.Dans votre Démarrage, enregistrer votre fournisseur.
Utilisation du constructeur d'injection dans le fournisseur, et de transmettre ces dépendances à l'attribut.
Créer un attribut public setters qui peut recevoir des dépendances.
Appliquer l'attribut d'un contrôleur ou d'une action.
Ci-dessus montre une façon, pour les rares cas d'utilisation, que vous pouvez injecter des dépendances dans un attribut. Si vous trouver une raison valable pour ce faire, veuillez les poster dans les commentaires.