protected virtual IAsyncQueryHandler <TQuery, TResult> Resolve <TQuery, TResult>(CancellationToken cancellationToken) where TQuery : IQuery <TResult> { cancellationToken.ThrowIfCancellationRequested(); this.logger.LogDebug($"Resolving the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); IAsyncQueryHandler <TQuery, TResult> handler = this.GetQueryHandler <TQuery, TResult>(); if (handler == null) { this.logger.LogCritical($"Trying to resolve a handler for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result failed. No handler found."); throw new RequiredHandlerNotFoundException(); } //try { IEnumerable <Attribute> attrs = typeof(TQuery).GetTypeInfo().GetCustomAttributes(); // Any permission check decorator found on the command? if (attrs.Any(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) || attrs.Any(a => a.GetType().GetTypeInfo().BaseType == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute))) { this.logger.LogDebug($"Found a permission check decorator for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); // Let's get the permission check handler, we need it. IAsyncQueryHandler <TQuery, TResult> permissionCheckHandler = this.GetPermissionCheckHandler <TQuery, TResult>(handler); if (permissionCheckHandler == null) { CreativeMinds.CQS.Decorators.CheckPermissionsAttribute attr = attrs.FirstOrDefault(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) as CreativeMinds.CQS.Decorators.CheckPermissionsAttribute; if (attr == null) { attr = attrs.FirstOrDefault(a => a.GetType().BaseType == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) as CreativeMinds.CQS.Decorators.CheckPermissionsAttribute; } if (attr.FailWhenMissing == true) { throw new NoCheckPermissionsHandlerImplementedException(typeof(TQuery), typeof(TResult)); } else { this.logger.LogWarning($"A permission check decorator was found for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result, but no handler was located."); } } else { handler = permissionCheckHandler; this.logger.LogDebug($"Found the permission check handle \"{permissionCheckHandler.GetType().Name}\" for the \"{typeof(TQuery).Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); } } else { this.logger.LogWarning($"No permission decorator found for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); } // Any validation decorator found on the query? if (attrs.Any(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute))) { this.logger.LogDebug($"Found a validation decorator for the \"{typeof(TQuery).Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); // Let's get the validation handler, we need it. IAsyncQueryHandler <TQuery, TResult> validationHandler = this.GetValidationHandler <TQuery, TResult>(handler); if (validationHandler == null) { CreativeMinds.CQS.Decorators.ValidateAttribute attr = attrs.FirstOrDefault(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute)) as CreativeMinds.CQS.Decorators.ValidateAttribute; if (attr == null) { attr = attrs.FirstOrDefault(a => a.GetType().BaseType == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute)) as CreativeMinds.CQS.Decorators.ValidateAttribute; } if (attr.FailWhenMissing == true) { throw new NoValidatorHandlerImplementedException(typeof(TQuery), typeof(TResult)); } else { this.logger.LogWarning($"A validation decorator was found for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result, but no handler was located."); } } else { handler = validationHandler; this.logger.LogDebug($"Found the validation handle \"{validationHandler.GetType().Name}\" for the \"{typeof(TQuery).Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); } } else { this.logger.LogWarning($"No validation decorator found for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result."); } //} //catch (Exception ex) { // // TODO: log // throw ex; //} this.logger.LogInformation($"Found the \"{handler.GetType().Name}\" QueryHandler for the \"{typeof(TQuery).GetTypeInfo().Name}\" query and \"{typeof(TResult).GetTypeInfo().Name}\" result"); return(handler); }
protected virtual IAsyncCommandHandler <TCommand> Resolve <TCommand>() where TCommand : ICommand { this.logger.LogDebug($"Resolving the \"{typeof(TCommand).Name}\" command."); //try { // Let's get the command handler, we're going to need this, no matter what!! IAsyncCommandHandler <TCommand> handler = this.GetCommandHandler <TCommand>(); if (handler == null) { this.logger.LogCritical($"Trying to resolve a handler for the \"{typeof(TCommand).Name}\" command failed. No handler found."); throw new RequiredHandlerNotFoundException(); } IEnumerable <Attribute> attrs = typeof(TCommand).GetTypeInfo().GetCustomAttributes(); // Any permission check decorator found on the command? if (attrs.Any(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) || attrs.Any(a => a.GetType().GetTypeInfo().BaseType == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute))) { this.logger.LogDebug($"Found a permission check decorator for the \"{typeof(TCommand).Name}\" command."); // Let's get the permission check handler, we need it. IAsyncCommandHandler <TCommand> permissionCheckHandler = this.GetPermissionCheckHandler <TCommand>(handler); if (permissionCheckHandler == null) { CreativeMinds.CQS.Decorators.CheckPermissionsAttribute attr = attrs.FirstOrDefault(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) as CreativeMinds.CQS.Decorators.CheckPermissionsAttribute; if (attr == null) { attr = attrs.FirstOrDefault(a => a.GetType().BaseType == typeof(CreativeMinds.CQS.Decorators.CheckPermissionsAttribute)) as CreativeMinds.CQS.Decorators.CheckPermissionsAttribute; } if (attr.FailWhenMissing == true) { throw new NoCheckPermissionsHandlerImplementedException(typeof(TCommand)); } else { this.logger.LogWarning($"A permission check decorator was found for the \"{typeof(TCommand).GetTypeInfo().Name}\" command, but no handler was located."); } } else { handler = permissionCheckHandler; this.logger.LogDebug($"Found the permission check handle \"{permissionCheckHandler.GetType().Name}\" for the \"{typeof(TCommand).Name}\" command."); } } else { this.logger.LogWarning($"No permission decorator found for the \"{typeof(TCommand).Name}\" command."); } // Any validation decorator found on the command? if (attrs.Any(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute))) { this.logger.LogDebug($"Found a validation decorator for the \"{typeof(TCommand).Name}\" command."); // Let's get the validation handler, we need it. IAsyncCommandHandler <TCommand> validationHandler = this.GetValidationHandler <TCommand>(handler); if (validationHandler == null) { CreativeMinds.CQS.Decorators.ValidateAttribute attr = attrs.FirstOrDefault(a => a.GetType() == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute)) as CreativeMinds.CQS.Decorators.ValidateAttribute; if (attr == null) { attr = attrs.FirstOrDefault(a => a.GetType().BaseType == typeof(CreativeMinds.CQS.Decorators.ValidateAttribute)) as CreativeMinds.CQS.Decorators.ValidateAttribute; } if (attr.FailWhenMissing == true) { throw new NoValidatorHandlerImplementedException(typeof(TCommand)); } else { this.logger.LogWarning($"A validation decorator was found for the \"{typeof(TCommand).GetTypeInfo().Name}\" command, but no handler was located."); } } else { handler = validationHandler; this.logger.LogDebug($"Found the validation handle \"{validationHandler.GetType().Name}\" for the \"{typeof(TCommand).Name}\" command."); } } else { this.logger.LogWarning($"No validation decorator found for the \"{typeof(TCommand).Name}\" command."); } //} //catch (Exception ex) { // logger.LogError("An exception occured trying to ") // throw ex; //} this.logger.LogInformation($"Found the \"{handler.GetType().Name}\" CommandHandler for the \"{typeof(TCommand).GetTypeInfo().Name}\" command"); return(handler); }