/// <summary>
        /// 添加数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文</typeparam>
        /// <typeparam name="TDbContextLocator">数据库上下文定位器</typeparam>
        /// <param name="services">服务</param>
        /// <param name="optionBuilder">自定义配置</param>
        /// <param name="interceptors">拦截器</param>
        /// <returns>服务集合</returns>
        public static IServiceCollection AddDb <TDbContext, TDbContextLocator>(this IServiceCollection services, Action <DbContextOptionsBuilder> optionBuilder, params IInterceptor[] interceptors)
            where TDbContext : DbContext
            where TDbContextLocator : class, IDbContextLocator
        {
            // 注册数据库上下文
            services.RegisterDbContext <TDbContext, TDbContextLocator>();

            // 配置数据库上下文
            services.AddDbContext <TDbContext>(Penetrates.ConfigureDbContext(optionBuilder, interceptors));

            return(services);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 配置多语言服务
        /// </summary>
        /// <param name="mvcBuilde"></param>
        /// <returns></returns>
        public static IMvcBuilder AddAppLocalization(this IMvcBuilder mvcBuilde)
        {
            // 判断是否含有空类
            if (L.LangType == null)
            {
                return(mvcBuilde);
            }

            var services = mvcBuilde.Services;

            // 添加多语言配置选项
            services.AddConfigurableOptions <LocalizationSettingsOptions>();

            // 获取多语言配置选项
            using var serviceProvider = services.BuildServiceProvider();
            var localizationSettings = serviceProvider.GetService <IOptions <LocalizationSettingsOptions> >().Value;

            // 如果没有配置多语言选项,则不注册服务
            if (localizationSettings.SupportedCultures == null || localizationSettings.SupportedCultures.Length == 0)
            {
                return(mvcBuilde);
            }

            // 注册多语言服务
            services.AddLocalization(options =>
            {
                if (!string.IsNullOrWhiteSpace(localizationSettings.ResourcesPath))
                {
                    options.ResourcesPath = localizationSettings.ResourcesPath;
                }
            });

            // 配置视图多语言和验证多语言
            mvcBuilde.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization(options =>
            {
                options.DataAnnotationLocalizerProvider = (type, factory) =>
                                                          factory.Create(L.LangType);
            });

            // 注册请求多语言配置选项
            services.Configure((Action <RequestLocalizationOptions>)(options =>
            {
                Penetrates.SetRequestLocalization(options, localizationSettings);
            }));

            // 处理多语言在 Razor 视图中文乱码问题
            services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All));

            return(mvcBuilde);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 添加其他数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文</typeparam>
        /// <typeparam name="TDbContextLocator">数据库上下文定位器</typeparam>
        /// <param name="services">服务</param>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="poolSize">池大小</param>
        /// <param name="interceptors">拦截器</param>
        /// <returns>服务集合</returns>
        public static IServiceCollection AddSqlServerPool <TDbContext, TDbContextLocator>(this IServiceCollection services, string connectionString = default, int poolSize = 100, params IInterceptor[] interceptors)
            where TDbContext : DbContext
            where TDbContextLocator : class, IDbContextLocator
        {
            // 注册数据库上下文
            services.RegisterDbContext <TDbContext, TDbContextLocator>();

            // 配置数据库上下文
            var connStr = Penetrates.GetDbContextConnectionString <TDbContext>(connectionString);

            services.AddDbContextPool <TDbContext>(Penetrates.ConfigureDbContext(connStr, options => ConfigureSqlServer(connStr, options), interceptors), poolSize: poolSize);

            return(services);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 添加其他数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文</typeparam>
        /// <typeparam name="TDbContextLocator">数据库上下文定位器</typeparam>
        /// <param name="services">服务</param>
        /// <param name="providerName">数据库提供器</param>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="poolSize">池大小</param>
        /// <param name="dynamicDbContext">动态数据库上下文,用于分表分库用</param>
        /// <param name="interceptors">拦截器</param>
        /// <returns>服务集合</returns>
        public static IServiceCollection AddDbPool <TDbContext, TDbContextLocator>(this IServiceCollection services, string providerName, string connectionString = default, int poolSize = 100, bool dynamicDbContext = false, params IInterceptor[] interceptors)
            where TDbContext : DbContext
            where TDbContextLocator : class, IDbContextLocator
        {
            // 注册数据库上下文
            services.RegisterDbContext <TDbContext, TDbContextLocator>();

            // 配置数据库上下文
            var connStr = DbProvider.GetDbContextConnectionString <TDbContext>(connectionString);

            services.AddDbContextPool <TDbContext>(Penetrates.ConfigureDbContext(options => ConfigureDatabase(providerName, connStr, options, dynamicDbContext), interceptors), poolSize: poolSize);

            return(services);
        }
        /// <summary>
        /// 配置多语言服务
        /// </summary>
        /// <param name="mvcBuilde"></param>
        /// <returns></returns>
        public static IMvcBuilder AddAppLocalization(this IMvcBuilder mvcBuilde)
        {
            // 判断是否含有空类
            if (L.LangType == null)
            {
                return(mvcBuilde);
            }

            var services = mvcBuilde.Services;

            // 添加多语言配置选项
            services.AddConfigurableOptions <LocalizationSettingsOptions>();

            // 获取多语言配置选项
            var localizationSettings = App.GetOptions <LocalizationSettingsOptions>();

            // 如果没有配置多语言选项,则不注册服务
            if (localizationSettings.SupportedCultures == null || localizationSettings.SupportedCultures.Length == 0)
            {
                return(mvcBuilde);
            }

            // 注册多语言服务
            services.AddLocalization(options =>
            {
                if (!string.IsNullOrEmpty(localizationSettings.ResourcesPath))
                {
                    options.ResourcesPath = localizationSettings.ResourcesPath;
                }
            });

            // 配置视图多语言和验证多语言
            mvcBuilde.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
            .AddDataAnnotationsLocalization(options =>
            {
                options.DataAnnotationLocalizerProvider = (type, factory) =>
                                                          factory.Create(L.LangType);
            });

            // 注册请求多语言配置选项
            services.Configure((Action <RequestLocalizationOptions>)(options =>
            {
                Penetrates.SetRequestLocalization(options, localizationSettings);
            }));

            return(mvcBuilde);
        }
        /// <summary>
        /// 添加其他数据库上下文
        /// </summary>
        /// <typeparam name="TDbContext">数据库上下文</typeparam>
        /// <typeparam name="TDbContextLocator">数据库上下文定位器</typeparam>
        /// <param name="services">服务</param>
        /// <param name="providerName">数据库提供器</param>
        /// <param name="optionBuilder"></param>
        /// <param name="connectionString">连接字符串</param>
        /// <param name="poolSize">池大小</param>
        /// <param name="interceptors">拦截器</param>
        /// <returns>服务集合</returns>
        public static IServiceCollection AddDbPool <TDbContext, TDbContextLocator>(this IServiceCollection services, string providerName = default, Action <DbContextOptionsBuilder> optionBuilder = null, string connectionString = default, int poolSize = 100, params IInterceptor[] interceptors)
            where TDbContext : DbContext
            where TDbContextLocator : class, IDbContextLocator
        {
            // 注册数据库上下文
            services.RegisterDbContext <TDbContext, TDbContextLocator>();

            // 配置数据库上下文
            var connStr = DbProvider.GetConnectionString <TDbContext>(connectionString);

            services.AddDbContextPool <TDbContext>(Penetrates.ConfigureDbContext(options =>
            {
                var _options = ConfigureDatabase <TDbContext>(providerName, connStr, options);
                optionBuilder?.Invoke(_options);
            }, interceptors), poolSize: poolSize);

            return(services);
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 配置多语言中间件拓展
        /// </summary>
        /// <param name="app"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseAppLocalization(this IApplicationBuilder app)
        {
            // 获取多语言配置选项
            var localizationSettings = app.ApplicationServices.GetRequiredService <IOptions <LocalizationSettingsOptions> >().Value;

            // 如果没有配置多语言选项,则不注册服务
            if (localizationSettings.SupportedCultures == null || localizationSettings.SupportedCultures.Length == 0)
            {
                return(app);
            }

            var requestLocalization = new RequestLocalizationOptions();

            Penetrates.SetRequestLocalization(requestLocalization, localizationSettings);

            // 设置多语言请求中间件
            app.UseRequestLocalization(requestLocalization);

            return(app);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 通过定位器解析上下文
        /// </summary>
        /// <param name="provider"></param>
        /// <param name="dbContextLocator"></param>
        /// <returns></returns>
        private static DbContext ResolveDbContext(IServiceProvider provider, Type dbContextLocator)
        {
            // 判断数据库上下文定位器是否绑定
            Penetrates.CheckDbContextLocator(dbContextLocator, out var dbContextType);

            // 动态解析数据库上下文
            var dbContext = provider.GetService(dbContextType) as DbContext;

            // 实现动态数据库上下文功能,刷新 OnModelCreating
            var dbContextAttribute = DbProvider.GetAppDbContextAttribute(dbContextType);

            if (dbContextAttribute?.Mode == DbContextMode.Dynamic)
            {
                DynamicModelCacheKeyFactory.RebuildModels();
            }

            // 添加数据库上下文到池中
            var dbContextPool = provider.GetService <IDbContextPool>();

            dbContextPool?.AddToPool(dbContext);

            return(dbContext);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 动作方法执行之前操作
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // 获取控制器/方法信息
            var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

            // 跳过验证类型
            var nonValidationAttributeType = typeof(NonValidationAttribute);
            var method = actionDescriptor.MethodInfo;

            // 如果参数为 0或贴了 [NonValidation] 特性 或所在类型贴了 [NonValidation] 特性,则跳过验证
            if (actionDescriptor.Parameters.Count == 0 ||
                method.IsDefined(nonValidationAttributeType, true) ||
                method.DeclaringType.IsDefined(nonValidationAttributeType, true))
            {
                return;
            }

            // 获取验证状态
            var modelState = context.ModelState;

            // 判断是否验证成功
            if (modelState.IsValid)
            {
                return;
            }

            // 如果其他过滤器已经设置了结果,那么跳过
            if (context.Result != null)
            {
                return;
            }

            // 解析验证消息
            var validationMetadata = ValidatorContext.GetValidationMetadata(modelState);

            // 判断是否跳过规范化结果,如果跳过,返回 400 BadRequestResult
            if (UnifyContext.CheckFailedNonUnify(actionDescriptor.MethodInfo, out var unifyResult))
            {
                if (!Penetrates.IsApiController(method.DeclaringType))
                {
                    context.Result = new BadRequestResult();
                }
                else
                {
                    context.Result = _apiBehaviorOptions.InvalidModelStateResponseFactory(context);
                }
            }
            else
            {
                // 判断是否支持 MVC 规范化处理
                if (!UnifyContext.CheckSupportMvcController(context.HttpContext, actionDescriptor, out _))
                {
                    return;
                }

                context.Result = unifyResult.OnValidateFailed(context, validationMetadata);
            }

            // 打印验证失败信息
            App.PrintToMiniProfiler("validation", "Failed", $"Validation Failed:\r\n{validationMetadata.Message}", true);
        }