L'Injection de dépendance dans les attributs
Je suis en train d'injecter une dépendance dans un personnalisé AuthorizeAttribute
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 être le résoudre comme un singleton sens-je obtenir les problèmes décrits dans mon perméable à la question
Ce que je voudrais faire est d'utiliser la propriété d'injection, mais que mon Attribut lui-même n'est pas résolu par l'Unité, je suis incapable de trouver un moyen de configurer le conteneur de les intercepter et de les résoudre d'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;
}
}
Conteneur:
container.RegisterType<UserCanAccessArea>(new InjectionProperty("permissionService"));
Mais la propriété est toujours nulle au moment de l'exécution.
Quelqu'un a réalisé cela et si oui avez-vous un exemple?
Vous devez vous connecter pour publier un commentaire.
Vous devriez éviter de faire de l'injection de dépendances dans les attributs complètement. La raison pour cela est expliqué dans cet article: L'Injection de dépendance dans les Attributs: ne faites pas ça!. En résumé, l'article explique que:
l'exactitude du conteneur de configuration.
Vous avez deux choix ici:
AuthorizeCore
dans votre cas) ne sont rien de plus que de la résolution du service du service locator /DependencyResolver et l'appel de la méthode du service. Important à noter ici est que vous ne pouvez pas faire de constructeur, d'injection, de la propriété d'injection et le service ne peut pas être stockée dans les attributs privés de l'état (comme vous l'avez déjà remarqué).De l'option à utiliser:
IFilterProvider
pour résoudre le filtre sur la demande de la DI conteneur plutôt que d'enregistrer le filtre dans la statiqueGlobalFilterCollection
.