/// <summary> /// Register a delegate /// </summary> /// <param name="currentApi"></param> /// <param name="instanceConfiguration"></param> /// <param name="delegate"></param> protected virtual void RegisterDelegate(ICurrentApiInformation currentApi, BaseDelegateInstanceConfiguration instanceConfiguration, Delegate @delegate) { foreach (var configuration in CreateEndPointMethodConfigurationForDelegate(currentApi, instanceConfiguration, @delegate)) { var endPointMethodHandler = CreateEndPointMethodHandler(currentApi, configuration); _handlers.Add(endPointMethodHandler); } }
/// <summary> /// Create endpoints for a delegate /// </summary> /// <param name="currentApi"></param> /// <param name="instanceConfiguration"></param> /// <param name="func"></param> /// <returns></returns> protected virtual IEnumerable <EndPointMethodConfiguration> CreateEndPointMethodConfigurationForDelegate(ICurrentApiInformation currentApi, BaseDelegateInstanceConfiguration instanceConfiguration, Delegate func) { var fullPath = instanceConfiguration.Path; var funcMethod = func.Method; var routeList = GenerateRouteInformationList(fullPath, instanceConfiguration.Method, GetDefaultRequestBody(instanceConfiguration.Method, instanceConfiguration.HasRequestBody), currentApi, typeof(object), "", funcMethod, new List <Attribute>()); foreach (var routeInformation in routeList) { var configuration = new EndPointMethodConfiguration(routeInformation, context => null, new MethodInvokeInformation { DelegateToInvoke = func }, funcMethod.ReturnType); var parameters = GenerateMethodParameters(null, funcMethod, routeInformation); configuration.Parameters.AddRange(parameters); configuration.RawContentType = instanceConfiguration.RawContentType; SetStatusAndResponseBodyConfigValues(configuration, instanceConfiguration.HasResponseBody, instanceConfiguration.SuccessStatusCode); if (string.IsNullOrEmpty(configuration.RawContentType)) { var returnType = funcMethod.ReturnType; if (returnType.IsConstructedGenericType && (returnType.GetGenericTypeDefinition() == typeof(Task <>) || returnType.GetGenericTypeDefinition() == typeof(ValueTask <>))) { returnType = returnType.GenericTypeArguments[0]; } if (_exposeConfigurations.TypeWrapSelector(returnType)) { configuration.WrappedType = _wrappedResultTypeCreator.GetTypeWrapper(returnType); } } if (currentApi.Headers != ImmutableLinkedList <IResponseHeader> .Empty || instanceConfiguration.Headers != ImmutableLinkedList <IResponseHeader> .Empty) { var responseHeaders = new List <IResponseHeader>(); responseHeaders.AddRange(currentApi.Headers); responseHeaders.AddRange(instanceConfiguration.Headers); configuration.ResponseHeaders = responseHeaders; } ApplyAuthorizations(currentApi, null, configuration, EmptyList, EmptyList); ApplyFilters(currentApi, GetFilterList(currentApi, configuration, EmptyList, EmptyList), configuration); if (_supportCompression) { configuration.SupportsCompression = _compressionSelectorService.ShouldCompressResult(configuration); } yield return(configuration); } }