public static bool TryCreateInstance(this IResolverSession session, ConstructorInfo constructorInfo, out object obj) { if (session == null) { throw new ArgumentNullException(nameof(session)); } if (constructorInfo == null) { throw new ArgumentNullException(nameof(constructorInfo)); } obj = null; var parameters = constructorInfo.GetParameters(); object[] arguments = new object[parameters.Length]; for (int i = 0; i < parameters.Length; i++) { if (!session.TryResolve(parameters[i].ParameterType, out var value)) { return(false); } arguments[i] = value; } obj = constructorInfo.Invoke(arguments); return(true); }
//public virtual async Task<object> HandleAsync(object[] requests, CancellationToken cancellationToken) //{ // return await HandleAsync(new Resolver(), requests, cancellationToken); //} public virtual async Task <object> HandleAsync(IResolverSession session, object[] requests, CancellationToken cancellationToken) { if (requests == null) { throw new ArgumentNullException(nameof(requests)); } if (classRoles.Length > 0 || methodRoles.Length > 0) { if (!session.TryResolve <IRole>(out var role)) { throw new UnauthorizedException(UnauthorizedReason.NoRoleProvider); } if (classRoles.Length > 0 && !classRoles.All(ar => ar.AnyOfRoles.Any(r => role.Contains(r)))) { throw new UnauthorizedException(UnauthorizedReason.ClassAccess); } if (methodRoles.Length > 0 && !methodRoles.All(ar => ar.AnyOfRoles.Any(r => role.Contains(r)))) { throw new UnauthorizedException(UnauthorizedReason.MethodAccess); } } var instance = session.Resolve(handlerType); var parameters = method.GetParameters(); var arguments = new object[parameters.Length]; var argumentIndex = 0; for (int i = 0; i < arguments.Length; i++) { if (session.TryResolve(parameters[i].ParameterType, out var arg)) { arguments[i] = arg; } else { if (parameters[i].ParameterType.GetTypeInfo().IsAssignableFrom(typeof(CancellationToken))) { arguments[i] = cancellationToken; } else if (parameters[i].ParameterType.GetTypeInfo().IsAssignableFrom(typeof(IResolverSession))) { arguments[i] = session; } else { if (requests.Length > argumentIndex) { var req = requests[argumentIndex]; var typeInfo = parameters[i].ParameterType.GetTypeInfo(); if (!typeInfo.IsClass || typeInfo.IsAssignableFrom(req.GetType())) { arguments[i] = req; argumentIndex++; continue; } } arguments[i] = null; } } } var result = method.Invoke(instance, arguments); if (result == null) { return(null); } if (result is Task) { var task = (Task)result; await task; if (resultProperty != null) { return(resultProperty.GetValue(result)); } return(null); } return(result); }