protected override void Initialize(HttpControllerContext controllerContext) { base.Initialize(controllerContext); if (DocumentationProvider != null) { return; } DocumentationProvider = Configuration.Services.GetDocumentationProviderEx(); }
public void SetUp() { httpConfiguration = new HttpConfiguration(new HttpRouteCollection("/myApp")); httpConfiguration.Services.Replace(typeof(IDocumentationProvider), new WebApiHtmlDocumentationProvider(new HtmlDocumentation())); documentationProvider = httpConfiguration.Services.GetDocumentationProviderEx(); }
/// <summary> /// Converts an <see cref="ApiParameterDescription"/> to one or more <see cref="SimpleApiParameterDescriptor"/>s. /// In simple cases, such as a string or primitive type parameter, a simple mapping will occur. When a parameter /// represents a complex type, one parameter will be returned for each public property on the type. /// </summary> public static IEnumerable <SimpleApiParameterDescriptor> Flatten(ApiDescription apiDescription, ApiParameterDescription parameterDescription, IDocumentationProviderEx documentationProvider) { var descriptor = parameterDescription.ParameterDescriptor; if (descriptor == null) { return(new[] { new SimpleApiParameterDescriptor(parameterDescription.Name, typeof(string), apiDescription.RelativePath, parameterDescription.Source, parameterDescription.Documentation) }); } bool isMany; var parameterType = Unwrap(descriptor.ParameterType, out isMany); if (IsSimpleType(parameterType)) { return(new[] { new SimpleApiParameterDescriptor(descriptor, apiDescription.RelativePath, isMany, parameterDescription.Documentation) }); } if (UsesCustomModelBinder(descriptor)) { var callingConvention = SimpleApiParameterDescriptor.GetCallingConvention(apiDescription.RelativePath, descriptor.ParameterName); return(new[] { new SimpleApiParameterDescriptor(descriptor.ParameterName, parameterType, callingConvention, descriptor.DefaultValue, descriptor.IsOptional, isMany, parameterDescription.Documentation) }); } return(EnumerateProperties(apiDescription, parameterType, documentationProvider)); }
private static IEnumerable <SimpleApiParameterDescriptor> EnumerateProperties(ApiDescription apiDescription, IReflect type, IDocumentationProviderEx documentationProvider, string prefix = "", IList <SimpleApiParameterDescriptor> list = null, ISet <Type> visitedTypes = null) { if (list == null) { list = new List <SimpleApiParameterDescriptor>(); } if (visitedTypes == null) { visitedTypes = new HashSet <Type>(); } var props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); var callingConvention = (apiDescription.HttpMethod == HttpMethod.Get || apiDescription.HttpMethod == HttpMethod.Head) ? "query-string" : "body"; foreach (var p in props.Where(prop => prop.CanWrite)) { bool isMany; var parameterType = Unwrap(p.PropertyType, out isMany); if (IsSimpleType(parameterType) || UsesCustomModelBinder(p.PropertyType)) { list.Add(new SimpleApiParameterDescriptor(prefix + p.Name, parameterType, callingConvention, null, false, isMany, documentationProvider.GetDocumentation(p))); } else { if (visitedTypes.Contains(p.PropertyType)) { list.Add(new SimpleApiParameterDescriptor(prefix + p.Name, parameterType, callingConvention, null, false, isMany, documentationProvider.GetDocumentation(p))); } else { visitedTypes.Add(p.PropertyType); EnumerateProperties(apiDescription, parameterType, documentationProvider, prefix + p.Name + ".", list, visitedTypes); } } } return(list); }