Clase AuthenticationRequiredAttribute
public class AuthenticationRequiredAttribute : ActionFilterAttribute { ILoginTokenKeyApi _loginTokenKeyApi; IMemoryCache _memoryCache; public AuthenticationRequiredAttribute(IMemoryCache memoryCache) { _memoryCache = memoryCache; _loginTokenKeyApi = new LoginTokenKeyController(new UnitOfWork()); } public override void OnActionExecuting(ActionExecutingContext filterContext) { var memory = _memoryCache.Get(Constants.KEYNAME_FOR_AUTHENTICATED_PAGES); string requestedPath = filterContext.HttpContext.Request.Path; string tokenKey = filterContext.HttpContext.Session.GetString("TokenKey")?.ToString(); bool? isLoggedIn = _loginTokenKeyApi.IsLoggedInByTokenKey(tokenKey).Data; if (isLoggedIn == null || !((bool)isLoggedIn) || !Constants.AUTHENTICATED_PAGES_FOR_NORMAL_USERS.Contains(requestedPath)) { filterContext.Result = new JsonResult(new { HttpStatusCode.Unauthorized }); } } public override void OnActionExecuted(ActionExecutedContext filterContext) { } }
InicioControlador
public class HomeController : Controller { IUserApi _userApi; ILoginTokenKeyApi _loginTokenKey; IMemoryCache _memoryCache; public HomeController(IUserApi userApi, ILoginTokenKeyApi loginTokenKey, IMemoryCache memoryCache) { _loginTokenKey = loginTokenKey; _userApi = userApi; _memoryCache = memoryCache; } [AuthenticationRequired] // There is AN ERROR !! public IActionResult Example() { return View(); } }
ERROR :
Error CS7036 No se proporciona ningún argumento que corresponda al parámetro formal requerido 'memoryCache' de 'AuthenticationRequiredAttribute.AuthenticationRequiredAttribute(IMemoryCache)' Project.Ground.WebUI
Mi problema es en realidad: no puedo usar la inyección de dependencia en las clases de atributos .
Quiero usar ese atributo sin ningún parámetro. ¿Hay alguna solución para solucionarlo? Uso inyección de dependencia pero no se puede usar para atributos. ¿Cómo puedo usarlo?
En lugar de resolver en la construcción, ActionExecutingContext.HttpContext.RequestServices
debería brindarle una referencia al contenedor de servicios de la solicitud en el momento de la solicitud.
Entonces:
public override void OnActionExecuting(ActionExecutingContext filterContext) { var svc = filterContext.HttpContext.RequestServices; var memCache = svc.GetService<IMemoryCache>(); //..etc