Sto cercando di risolvere le dipendenze della mia personalizzata AuthorizeAttribute
che uso per decorare i miei controller API in un'app MVC4. Il problema è che continuo a ricevere un NullReferenceException
sulla dipendenza dal servizio che utilizzo all'interno del mio filtro personalizzato. Qui è la mia configurazione Autofac:Iniezione di dipendenze nell'attributo filtro azione API Web personalizzato con Autofac
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;
}
}
e mia abitudine autorizzare filtro:
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
}
}
Secondo il official docs tutto quello che serve è:
var builder = new ContainerBuilder();
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Ma questo non sembra fare il trucco sia Apprezzo qualsiasi aiuto.
penso _authenticationSvc ha bisogno di essere un non di proprietà di un campo – MikeSW
@MikeSW Ora mi dà questa eccezione: 'No portata con un corrispondente tag 'AutofacWebRequest' è visibile dal campo di applicazione in cui la istanza è stata richiesta. Questo in genere indica che un componente registrato come richiesta HTTP viene richiesto da un componente SingleInstance() o uno scenario simile. Nell'integrazione Web vengono sempre richieste dipendenze da DependencyResolver.Current o ILifetimeScopeProvider.RequestLifetime, mai dal contenitore stesso .' –