Próbuję rozwiązać zależności mojego niestandardowego AuthorizeAttribute
, którego używam do ozdabiania kontrolerów API w aplikacji MVC4. Problem polega na tym, że wciąż uzyskuję NullReferenceException
zależność usługi, której używam w moim filtrze niestandardowym. Oto moja konfiguracja Autofac:Wstrzykiwanie zależności do niestandardowego atrybutu filtru działania Web API z 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;
}
}
i mój zwyczaj zezwolić filtr:
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
}
}
Według official docs wszystko, co potrzebne jest:
var builder = new ContainerBuilder();
builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration);
Ale to nie wydaje się rób to. Doceniam każdą pomoc.
myślę _authenticationSvc musi być nie własność pole – MikeSW
@MikeSW Teraz to daje mi ten wyjątek: 'no z zakresu dopasowania tag„AutofacWebRequest”jest widoczny od zakresu, w którym wystąpiono o wystąpienie instancji. Zasadniczo oznacza to, że komponent zarejestrowany jako żądanie na HTTP jest żądany przez komponent SingleInstance() (lub podobny scenariusz). W ramach integracji sieciowej zawsze żądaj zależności od DependencyResolver.Current lub ILifetimeScopeProvider.RequestLifetime, nigdy z samego kontenera . " –