J'essaie d'injecter une dépendance dans un AuthorizeAttribute
personnalisé comme suit:
public class UserCanAccessArea : AuthorizeAttribute
{
readonly IPermissionService permissionService;
public UserCanAccessArea() :
this(DependencyResolver.Current.GetService<IPermissionService>()) { }
public UserCanAccessArea(IPermissionService permissionService)
{
this.permissionService = permissionService;
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string AreaID =
httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;
bool isAuthorized = false;
if (base.AuthorizeCore(httpContext))
isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);
return isAuthorized;
}
}
Cela fonctionne mais semble se résoudre comme un singleton, ce qui signifie que je reçois les problèmes décrits dans ma question permanente
Ce que je voudrais faire, c'est utiliser l'injection de propriété mais comme mon attribut lui-même n'est pas résolu par Unity, je ne peux pas trouver un moyen de configurer le conteneur pour intercepter et résoudre une propriété. J'ai essayé ce qui suit:
public class UserCanAccessArea : AuthorizeAttribute
{
public IPermissionService permissionService { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string AreaID =
httpContext.Request.RequestContext.RouteData.Values["AreaID"] as string;
bool isAuthorized = false;
if (base.AuthorizeCore(httpContext))
isAuthorized = permissionService.UserCanAccessArea(AreaID, httpContext.User);
return isAuthorized;
}
}
Récipient:
container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));
Mais la propriété est toujours nulle au moment de l'exécution.
Quelqu'un at-il atteint cet objectif et si oui, avez-vous un exemple?
Vous devez empêcher complètement l'injection de dépendances dans les attributs. La raison de ceci est expliquée dans cet article: Injection de dépendance dans les attributs: ne le faites pas! . En résumé, l'article explique que:
Vous avez deux choix ici:
AuthorizeCore
dans votre cas) ne faire que résoudre le service à partir du localisateur de service/DependencyResolver et appelez la méthode du service. Il est important de noter ici que vous ne pouvez pas faire d'injection de constructeur, d'injection de propriété et que le service ne peut pas être stocké dans l'état privé des attributs (comme vous l'avez déjà remarqué).Quelle option utiliser: