public static IMvcBuilder AddApiExtensions(this IMvcBuilder builder, IConfigurationSection config = null, Action <ApiExtensionOptions> build = null) { var apiOptions = new ApiExtensionOptions(); #region Include services needed for building uri's in the paging object builder.Services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); builder.Services.TryAddSingleton <IActionContextAccessor, ActionContextAccessor>(); builder.Services.AddScoped <IUrlHelper>(x => { var actionContext = x.GetService <IActionContextAccessor>().ActionContext; return(new UrlHelper(actionContext)); }); builder.Services.AddScoped <ILinkProvider, LinkProvider>(); #endregion #region Register Options if (config != null && build != null) { builder.Services.Configure <ApiExtensionOptions>(x => { }); } if (config != null) { builder.Services.Configure <ApiExtensionOptions>(config); config.Bind(apiOptions); } if (build != null) { builder.Services.Configure <ApiExtensionOptions>(build); build(apiOptions); } #endregion #region Configuration from options if (!apiOptions.DisableVersioning) { builder.AddMvcOptions(options => { options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("{apiVersion}"))); }); builder.Services.ConfigureSwaggerGen(options => { options.DocInclusionPredicate((version, apiDescription) => { var allowedVersions = apiDescription.ActionAttributes().OfType <VersionsAttribute>().FirstOrDefault(); return(allowedVersions != null && allowedVersions.AcceptedVersions.Contains(version)); }); }); } #endregion builder.AddMvcOptions(options => { options.Filters.Insert(0, new ConsumesAttribute("application/json")); options.Filters.Insert(1, new ProducesAttribute("application/json")); options.ModelBinderProviders.Insert(0, new CommaDelimitedArrayModelBinderProvider()); JsonOutputFormatter jsonFormatter = options.OutputFormatters.OfType <JsonOutputFormatter>().FirstOrDefault(); jsonFormatter?.SupportedMediaTypes.Add("application/hal+json"); }); builder.AddJsonOptions(x => { x.SerializerSettings.Initialize(); }); return(builder); }
private Mock <HttpContext> CreateMockHttpContext(IExceptionHandler exceptionHandler, ApiExtensionOptions options, HttpStatusCode httpStatusCode) { var mock = new Mock <HttpContext>(); mock.SetupGet(m => m.RequestServices) .Returns(CreateMockServiceProvider(exceptionHandler, options).Object); var defaultContext = new DefaultHttpContext(); defaultContext.Features.Get <IHttpResponseFeature>().StatusCode = (int)httpStatusCode; mock.SetupGet(m => m.Response) .Returns(defaultContext.Response); return(mock); }
public static IMvcBuilder AddApiExtensions(this IMvcBuilder builder, IConfigurationSection config = null, Action <ApiExtensionOptions> build = null) { var apiOptions = new ApiExtensionOptions(); #region Include services needed for building uri's in the paging object builder.Services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); builder.Services.TryAddSingleton <IActionContextAccessor, ActionContextAccessor>(); builder.Services.AddScoped <IUrlHelper>(x => { var actionContext = x.GetService <IActionContextAccessor>().ActionContext; return(new UrlHelper(actionContext)); }); builder.Services.TryAddSingleton <ILinkProvider, LinkProvider>(); #endregion #region Register Options if (config != null && build != null) { builder.Services.Configure <ApiExtensionOptions>(x => { }); } if (config != null) { builder.Services.Configure <ApiExtensionOptions>(config); config.Bind(apiOptions); } if (build != null) { builder.Services.Configure <ApiExtensionOptions>(build); build(apiOptions); } #endregion #region Configuration from options if (!apiOptions.DisableGlobalErrorHandling && !apiOptions.DisableGlobalExceptionFilter) { builder.AddMvcOptions(options => { options.Filters.Add(typeof(GlobalExceptionFilter)); }); } if (!apiOptions.DisableVersioning) { builder.AddMvcOptions(options => { options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("{apiVersion}"))); }); } #endregion builder.AddMvcOptions(options => { options.Filters.Insert(0, new ConsumesAttribute("application/json")); options.Filters.Insert(1, new ProducesAttribute("application/json")); options.ModelBinderProviders.Insert(0, new CommaDelimitedArrayModelBinderProvider()); JsonOutputFormatter jsonFormatter = options.OutputFormatters.OfType <JsonOutputFormatter>().FirstOrDefault(); jsonFormatter?.SupportedMediaTypes.Add("application/hal+json"); }); builder.AddJsonOptions(x => { x.SerializerSettings.ContractResolver = new BaseContractResolver(); x.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; x.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; x.SerializerSettings.Converters.Add(new TimeSpanConverter()); x.SerializerSettings.Converters.Add(new PagedResultConverter()); x.SerializerSettings.Converters.Add(new GuidConverter()); x.SerializerSettings.Formatting = Formatting.None; }); return(builder); }
private Mock <IServiceProvider> CreateMockServiceProvider(IExceptionHandler exceptionHandler, ApiExtensionOptions options) { var mock = new Mock <IServiceProvider>(); mock.Setup(m => m.GetService(typeof(IExceptionHandler))) .Returns(exceptionHandler); mock.Setup(m => m.GetService(typeof(IOptions <ApiExtensionOptions>))) .Returns(Options.Create <ApiExtensionOptions>(options)); return(mock); }
public static IMvcBuilder AddApiExtensions(this IMvcBuilder builder, IConfigurationSection config = null, Action <ApiExtensionOptions> build = null, Type exception = null) { var apiOptions = new ApiExtensionOptions(); #region Include services needed for building uri's in the paging object builder.Services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); builder.Services.TryAddSingleton <IActionContextAccessor, ActionContextAccessor>(); #endregion #region Register Options if (config != null && build != null) { builder.Services.Configure <ApiExtensionOptions>(x => { }); } if (config != null) { builder.Services.Configure <ApiExtensionOptions>(config); config.Bind(apiOptions); } if (build != null) { builder.Services.Configure <ApiExtensionOptions>(build); build(apiOptions); } #endregion #region Configuration from options if (!apiOptions.DisableGlobalErrorHandling) { builder.AddMvcOptions(options => { options.Filters.Add(typeof(GlobalExceptionFilter)); }); } if (!apiOptions.DisableVersioning) { builder.AddMvcOptions(options => { options.Conventions.Insert(0, new RouteConvention(new RouteAttribute("{apiVersion}"))); }); } #endregion builder.AddMvcOptions(options => { options.Filters.Add(new PagedResultAttribute() { Order = 1000 }); }); builder.AddJsonOptions(x => { x.SerializerSettings.ContractResolver = new BaseContractResolver(); x.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; x.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; x.SerializerSettings.Converters.Add(new TimeSpanConverter()); x.SerializerSettings.Converters.Add(new GuidConverter()); x.SerializerSettings.Formatting = Formatting.None; }); return(builder); }