Injecter des dépendances dans l'attribut de filtre d'action de l'API Web personnalisée avec Autofac
Je suis en train d'essayer de résoudre les dépendances de ma coutume AuthorizeAttribute
que j'utilise pour décorer mon API contrôleurs dans un MVC4 app. Le problème est que je reçois un NullReferenceException
sur la dépendance de service-je utiliser dans mon filtre personnalisé. Voici mon Autofac configuration:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerApiRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(UserProfileRepository).Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(IUserProfileMapper).Assembly)
.Where(t => t.Name.EndsWith("Mapper"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterAssemblyTypes(typeof(UserProfileSvc).Assembly)
.Where(t => t.Name.EndsWith("Svc"))
.AsImplementedInterfaces().InstancePerApiRequest();
builder.RegisterWebApiFilterProvider(config);
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
}
}
et mon custom autoriser filtre:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public IAuthenticationSvc _authenticationSvc;
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (!base.IsAuthorized(actionContext))
{
return false;
}
var trueUserId = WebSecurity.CurrentUserId;
if (_authenticationSvc.GetUsersRoles(trueUserId).Any(x => x == "Admin")) return true;
//NullReferenceException on _authenticationSvc
}
}
Selon la officiel docs tout ce qui est nécessaire est:
var builder = new ContainerBuilder();
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Mais qui ne semble pas faire l'affaire. Reconnaissant de toute aide.
source d'informationauteur Mohammad Sepahvand
Vous devez vous connecter pour publier un commentaire.
Vous devez configurer la propriété d'injection pour votre attribut
et le constructeur
En plus de @Toan Nguyen réponse, si vous avez ce...
... il semble que vous aussi vous avez besoin (ou besoin) de la première ligne ci-dessous:
Référence: http://itprojectpool.blogspot.com.au/2014/03/autofac-di-on-action-filters.html
Je pense que Autofac de documentation offre une solution beaucoup plus simple pour WebApi action des filtres.
Il n'est pas "pure DI", comme il est d'utiliser le service de localisation, mais il est simple et fonctionne à la demande de la portée. Vous n'avez pas besoin de s'inquiéter à propos de l'enregistrement, l'action spécifique de filtre pour chaque WebApi contrôleur.
Source:
http://autofac.readthedocs.io/en/latest/integration/webapi.html#provide-filters-via-dependency-injection