Beispiel #1
0
        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);
        }