Example #1
0
 public BenchmarkActionFilter(ILogger logger, NetProOption config, IWebHelper webHelper, IConfiguration configuration)
 {
     _logger        = logger;
     _config        = config;
     _webHelper     = webHelper;
     _configuration = configuration;
 }
Example #2
0
 public BenchmarkActionFilter(ILogger <BenchmarkActionFilter> logger, NetProOption config, IWebHelper webHelper, IConfiguration configuration, RequestCacheData requestCacheData)
 {
     _logger           = logger;
     _config           = config;
     _webHelper        = webHelper;
     _configuration    = configuration;
     _requestCacheData = requestCacheData;
 }
Example #3
0
        /// <summary>
        /// 所有xml默认当作swagger文档注入swagger
        /// </summary>
        /// <returns></returns>
        protected virtual List <string> GetXmlComments(NetProOption netProOption)
        {
            //var pattern = $"^{netProOption.ProjectPrefix}.*({netProOption.ProjectSuffix}|Domain)$";
            //List<string> assemblyNames = ReflectionHelper.GetAssemblyNames(pattern);
            List <string> assemblyNames = AppDomain.CurrentDomain.GetAssemblies().Select(s => s.GetName().Name).ToList();
            List <string> xmlFiles      = new List <string>();

            assemblyNames.ForEach(r =>
            {
                string fileName = $"{r}.xml";
                xmlFiles.Add(fileName);
            });
            return(xmlFiles);
        }
Example #4
0
        /// <summary>
        /// Register dependencies
        /// </summary>
        /// <param name="containerBuilder">Container builder</param>
        /// <param name="nopConfig">Nop configuration parameters</param>
        public virtual void RegisterDependencies(ContainerBuilder containerBuilder, NetProOption nopConfig)
        {
            //register engine
            containerBuilder.RegisterInstance(this).As <IEngine>().SingleInstance();

            //register type finder
            containerBuilder.RegisterInstance(_typeFinder).As <ITypeFinder>().SingleInstance();

            //find dependency registrars provided by other assemblies
            var dependencyRegistrars = _typeFinder.FindClassesOfType <IDependencyRegistrar>();

            //create and sort instances of dependency registrars
            var instances = dependencyRegistrars
                            .Select(dependencyRegistrar => (IDependencyRegistrar)Activator.CreateInstance(dependencyRegistrar))
                            .OrderBy(dependencyRegistrar => dependencyRegistrar.Order);

            //register all provided dependencies
            foreach (var dependencyRegistrar in instances)
            {
                dependencyRegistrar.Register(containerBuilder, _typeFinder, nopConfig);
            }
        }
 public CustomAuthorizeFilter(NetProOption config)
 {
     _config = config;
 }
Example #6
0
 public ReqeustBodyFilter(ILogger logger, NetProOption config)
 {
     _logger = logger;
     _config = config;
 }
Example #7
0
 public void Register(ContainerBuilder builder, ITypeFinder typeFinder, NetProOption config)
 {
     builder.Register(c => new DefaultDapperContext(config.ConnectionStrings.ServerIdConnection["2"], DataProvider.Mysql)).InstancePerLifetimeScope();
 }
Example #8
0
 public PermissionActionFilter(NetProOption config, INetProPermissionService NetProPermissionService, ILogger logger)
 {
     _config = config;
     _NetProPermissionService = NetProPermissionService;
     _logger = logger;
 }
Example #9
0
        /// <summary>
        /// Register services and interfaces
        /// </summary>
        /// <param name="builder">Container builder</param>
        /// <param name="typeFinder">Type finder</param>
        /// <param name="config">Config</param>
        /// <param name="configuration"></param>
        public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NetProOption config)
        {
            //file provider
            builder.RegisterType <NetProFileProvider>().As <INetProFileProvider>().InstancePerLifetimeScope();
            builder.RegisterType <NetProFileProvider>().As <INetProFileProvider>().PropertiesAutowired();
            //web helper
            builder.RegisterType <WebHelper>().As <IWebHelper>().InstancePerLifetimeScope();
            builder.RegisterType <ActionContextAccessor>().As <IActionContextAccessor>().InstancePerLifetimeScope();

            builder.RegisterGeneric(typeof(NetProUnitOfWorkFactory <>)).As(typeof(IUnitOfWorkFactory <>)).InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(DapperRepository <>)).As(typeof(IDapperRepository <>)).InstancePerLifetimeScope();
            builder.RegisterGeneric(typeof(GeneralRepository <,>)).As(typeof(IGeneralRepository <>)).InstancePerLifetimeScope();

            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies()
                                          .Where(r => RegexHelper.IsMatch(r.GetName().Name, "^NetPro.*\\.(Api|Domain)$")).ToArray())
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().Where(r => RegexHelper.IsMatch(r.GetName().Name, "^NetPro.*\\.(Api|Repository)$")).ToArray())
            .Where(t => t.Name.EndsWith("Repository"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().Where(r => RegexHelper.IsMatch(r.GetName().Name, "^NetPro.*\\.(Api|Aggregate)$")).ToArray())
            .Where(t => t.Name.EndsWith("Aggregate"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();

            builder.RegisterLogger(autowireProperties: true);

            var baseType = typeof(ControllerBase);

            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().ToArray())
            .Where(t => baseType.IsAssignableFrom(t) && t != baseType).InstancePerLifetimeScope();

            if (config.AppType == AppType.Api)            //api 没有权限验证判断使用默认的
            {
                builder.RegisterType <NullPermissionService>().As <INetProPermissionService>().InstancePerLifetimeScope();
            }
        }
Example #10
0
        /// <summary>
        /// Add and configure MVC for the application
        /// </summary>
        /// <param name="services">Collection of service descriptors</param>
        /// <returns>A builder for configuring MVC services</returns>
        public IMvcBuilder AddNetProCore(IServiceCollection services, NetProOption netProOption)
        {
            //TODO 流量分析

            //响应缓存
            services.AddResponseCachingExtension();

            var NetProOption = services.GetNetProConfig();

            //支持IIS
            services.Configure <IISOptions>(options =>
            {
                options.ForwardClientCertificate = false;
            });
            //替换控制器所有者
            services.Replace(ServiceDescriptor.Transient <IControllerActivator, ServiceBasedControllerActivator>());
            //add basic MVC feature
            //AddMvc
            var mvcBuilder = services.AddControllers(config =>
            {
                //增加路由统一前缀
                if (!string.IsNullOrWhiteSpace(netProOption.RoutePrefix))
                {
                    //参考:https://gist.github.com/itavero/2b40dfb476bebff756da35b5c7ff7384
                    //https://www.strathweb.com/2016/06/global-route-prefix-with-asp-net-core-mvc-revisited/
                    //https://benjii.me/2016/08/global-routes-for-asp-net-core-mvc/
                    config.Conventions.Insert(0, new GlobalRoutePrefixConvention(netProOption.RoutePrefix));
                }

                //config.Filters.Add(typeof(ShareResponseBodyFilter));//请求响应body
                //config.Filters.Add(typeof(NetProExceptionFilter));//自定义全局异常过滤器
                config.Filters.Add(typeof(BenchmarkActionFilter));//接口性能监控过滤器

                //if (NetProOption.PermissionEnabled)
                //{
                //    config.Filters.Add(typeof(PermissionActionFilter));//用户权限验证过滤器
                //}

                //config.Filters.Add(typeof(ReqeustBodyFilter));//请求数据过滤器
            }).ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    StringBuilder stringBuilder = new StringBuilder();
                    foreach (var keyModelStatePair in context.ModelState)
                    {
                        var key    = keyModelStatePair.Key;
                        var errors = keyModelStatePair.Value.Errors;
                        if (errors != null && errors.Count > 0)
                        {
                            stringBuilder.Append(errors[0].ErrorMessage);
                        }
                    }
                    return(new BadRequestObjectResult(new ResponseResult {
                        Code = -1, Msg = $"数据验证失败--详情:{stringBuilder}"
                    })
                    {
                        ContentTypes = { "application/problem+json", "application/problem+xml" }
                    });
                };
            });

            //mvc binder对象转换支持空字符串.如果传入空字符串为转成空字符串,默认会转成null
            mvcBuilder.AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider()));

            //MVC now serializes JSON with camel case names by default, use this code to avoid it
            //mvcBuilder.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

            //add fluent validation
            mvcBuilder.AddFluentValidation(configuration =>
            {
                //register all available validators from netpro assemblies

                var assemblies = mvcBuilder.PartManager.ApplicationParts
                                 .OfType <AssemblyPart>()
                                 //.Where(part => part.Name.StartsWith($"{netProOption.ProjectPrefix}", StringComparison.InvariantCultureIgnoreCase))
                                 .Select(part => part.Assembly);
                string AssemblySkipLoadingPattern = "^OpenTracing.Contrib.NetCor|^App.Metrics.AspNetCore|^SkyAPM|^Swashbuckle|^System|^mscorlib|^Microsoft|^AjaxControlToolkit|^Antlr3|^Autofac|^AutoMapper|^Castle|^ComponentArt|^CppCodeProvider|^DotNetOpenAuth|^EntityFramework|^EPPlus|^FluentValidation|^ImageResizer|^itextsharp|^log4net|^MaxMind|^MbUnit|^MiniProfiler|^Mono.Math|^MvcContrib|^Newtonsoft|^NHibernate|^nunit|^Org.Mentalis|^PerlRegex|^QuickGraph|^Recaptcha|^Remotion|^RestSharp|^Rhino|^Telerik|^Iesi|^TestDriven|^TestFu|^UserAgentStringLibrary|^VJSharpCodeProvider|^WebActivator|^WebDev|^WebGrease";
                var assembliesResult = new List <Assembly>();
                foreach (var item in assemblies)
                {
                    if (!Regex.IsMatch(item.FullName, AssemblySkipLoadingPattern, RegexOptions.IgnoreCase | RegexOptions.Compiled) && Regex.IsMatch(item.FullName, ".*", RegexOptions.IgnoreCase | RegexOptions.Compiled))
                    {
                        assembliesResult.Add(item);
                    }
                }
                configuration.RegisterValidatorsFromAssemblies(assembliesResult);
                //implicit/automatic validation of child properties 复合对象是否验证
                configuration.ImplicitlyValidateChildProperties = true;
            });

            //if (NetProOption.APMEnabled)
            //{
            //    mvcBuilder.AddMetrics();
            //}
            return(mvcBuilder);
        }
Example #11
0
 public NetProExceptionFilter(ILogger logger, IWebHelper webHelper, NetProOption config)
 {
     _logger    = logger;
     _webHelper = webHelper;
     _config    = config;
 }
Example #12
0
        /// <summary>
        /// Add and configure services
        /// </summary>
        /// <param name="services">Collection of service descriptors</param>
        /// <param name="configuration">Configuration of the application</param>
        /// <param name="nopConfig">Nop configuration parameters</param>
        public void ConfigureServices(IServiceCollection services, IConfiguration configuration, NetProOption nopConfig)
        {
            //find startup configurations provided by other assemblies
            _typeFinder = new WebAppTypeFinder();
            var startupConfigurations = _typeFinder.FindClassesOfType <INetProStartup>();

            //create and sort instances of startup configurations
            var instances = startupConfigurations
                            .Select(startup => (INetProStartup)Activator.CreateInstance(startup))
                            .OrderBy(startup => startup.Order);

            //configure services
            foreach (var instance in instances)
            {
                instance.ConfigureServices(services, configuration, _typeFinder);
            }

            //register mapper configurations
            AddAutoMapper(services, _typeFinder);

            //run startup tasks
            RunStartupTasks(_typeFinder);

            //resolve assemblies here. otherwise, plugins can throw an exception when rendering views
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        }
Example #13
0
 public ReqeustBodyFilter(ILogger logger, NetProOption config, IWebHelper webHelper)
 {
     _logger    = logger;
     _config    = config;
     _webHelper = webHelper;
 }
Example #14
0
        /// <summary>
        /// Add and configure services
        /// </summary>
        /// <param name="services">Collection of service descriptors</param>
        /// <param name="configuration">Configuration of the application</param>
        /// <param name="nopConfig">Nop configuration parameters</param>
        public void ConfigureServices(IServiceCollection services, IConfiguration configuration, NetProOption nopConfig)
        {
            //用户基础框架在运行成功前执行EngineContext.Current.Resolve<xxx>
            //_serviceProvider = services.BuildServiceProvider(); //TODO 预留,运行成功前需要用到基础对象时打开
            //find startup configurations provided by other assemblies

            _typeFinder = services.BuildServiceProvider().GetRequiredService <ITypeFinder>();
            //_typeFinder = new WebAppTypeFinder();
            var startupConfigurations = _typeFinder.FindClassesOfType <INetProStartup>();

            //create and sort instances of startup configurations
            var instances = startupConfigurations
                            .Select(startup => new { NetProStartupImplement = (INetProStartup)Activator.CreateInstance(startup), Name = startup.Name })
                            .OrderBy(startup => startup.NetProStartupImplement.Order);

            //configure services
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine($"服务注入顺序:", System.Drawing.Color.FromArgb(1, 212, 1));
            var table = new ConsoleTable("Order", "StartUpName", "Path");

            foreach (var instance in instances)
            {
                instance.NetProStartupImplement.ConfigureServices(services, configuration, _typeFinder);
                table.AddRow(instance.NetProStartupImplement.Order, instance.Name, instance.NetProStartupImplement);
            }
            Console.WriteLine(table.ToStringAlternative());
            Console.ResetColor();

            //register mapper configurations
            AddAutoMapper(services, _typeFinder);

            //run startup tasks
            RunStartupTasks(_typeFinder);

            //resolve assemblies here. otherwise, plugins can throw an exception when rendering views
            //load the plug-in assembly
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
        }
Example #15
0
        /// <summary>
        /// Add and configure MVC for the application
        /// </summary>
        /// <param name="services">Collection of service descriptors</param>
        /// <returns>A builder for configuring MVC services</returns>
        public static IMvcBuilder AddNetProCore(this IServiceCollection services, NetProOption netProOption)
        {
            //TODO 流量分析

            //响应缓存
            services.AddResponseCachingExtension();

            var NetProOption = services.GetNetProConfig();

            //支持IIS
            services.Configure <IISOptions>(options =>
            {
                options.ForwardClientCertificate = false;
            });
            //替换控制器所有者
            services.Replace(ServiceDescriptor.Transient <IControllerActivator, ServiceBasedControllerActivator>());
            //add basic MVC feature
            //AddMvc
            var mvcBuilder = services.AddControllers(config =>
            {
                //config.Filters.Add(typeof(ShareResponseBodyFilter));//请求响应body
                //config.Filters.Add(typeof(NetProExceptionFilter));//自定义全局异常过滤器
                config.Filters.Add(typeof(BenchmarkActionFilter));//接口性能监控过滤器

                //if (NetProOption.PermissionEnabled)
                //{
                //    config.Filters.Add(typeof(PermissionActionFilter));//用户权限验证过滤器
                //}

                //config.Filters.Add(typeof(ReqeustBodyFilter));//请求数据过滤器
            }).ConfigureApiBehaviorOptions(options =>
            {
                options.InvalidModelStateResponseFactory = context =>
                {
                    StringBuilder stringBuilder = new StringBuilder();
                    foreach (var keyModelStatePair in context.ModelState)
                    {
                        var key    = keyModelStatePair.Key;
                        var errors = keyModelStatePair.Value.Errors;
                        if (errors != null && errors.Count > 0)
                        {
                            stringBuilder.Append(errors[0].ErrorMessage);
                        }
                    }
                    return(new BadRequestObjectResult(new ResponseResult {
                        Code = -1, Msg = $"数据验证失败--详情:{stringBuilder}"
                    })
                    {
                        ContentTypes = { "application/problem+json", "application/problem+xml" }
                    });
                };
            });

            //mvc binder对象转换支持空字符串.如果传入空字符串为转成空字符串,默认会转成null
            mvcBuilder.AddMvcOptions(options => options.ModelMetadataDetailsProviders.Add(new CustomMetadataProvider()));

            //MVC now serializes JSON with camel case names by default, use this code to avoid it
            //mvcBuilder.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());

            //add fluent validation
            mvcBuilder.AddFluentValidation(configuration =>
            {
                //register all available validators from netpro assemblies

                var assemblies = mvcBuilder.PartManager.ApplicationParts
                                 .OfType <AssemblyPart>()
                                 .Where(part => part.Name.StartsWith($"{netProOption.ProjectPrefix}", StringComparison.InvariantCultureIgnoreCase))
                                 .Select(part => part.Assembly);
                configuration.RegisterValidatorsFromAssemblies(assemblies);

                //implicit/automatic validation of child properties 复合对象是否验证
                configuration.ImplicitlyValidateChildProperties = true;
            });

            var corsOrigins = ConvertHelper.ToList <string>(NetProOption.CorsOrigins).ToArray();

            //支持跨域访问
            services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy", (builder) =>
                {
                    if (!string.IsNullOrEmpty(NetProOption.CorsOrigins) && NetProOption.CorsOrigins == "*")//所有域名都可跨域
                    {
                        builder = builder.SetIsOriginAllowed((host) => true);
                    }
                    else
                    {
                        builder = builder.WithOrigins(corsOrigins);
                    }

                    builder.AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
            });

            //if (NetProOption.APMEnabled)
            //{
            //    mvcBuilder.AddMetrics();
            //}
            return(mvcBuilder);
        }
        /// <summary>
        /// Register services and interfaces
        /// </summary>
        /// <param name="builder">Container builder</param>
        /// <param name="typeFinder">Type finder</param>
        /// <param name="config">Config</param>
        /// <param name="configuration"></param>
        public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NetProOption config)
        {
            //file provider
            //builder.RegisterType<NetProFileProvider>().As<INetProFileProvider>().InstancePerLifetimeScope();
            //builder.RegisterType<NetProFileProvider>().As<INetProFileProvider>().PropertiesAutowired();//属性注入;TODO 保留,可能用到,实际注入在NetPro.TypeFinder
            //web helper
            builder.RegisterType <WebHelper>().As <IWebHelper>().InstancePerLifetimeScope();
            builder.RegisterType <ActionContextAccessor>().As <IActionContextAccessor>().InstancePerLifetimeScope();

            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies()
                                          .Where(r => RegexHelper.IsMatch(r.GetName().Name, $"^{config.ProjectPrefix}.*({config.ProjectSuffix}|Service)$")).ToArray())
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();
            //builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().Where(r => RegexHelper.IsMatch(r.GetName().Name, $"^{config.ProjectPrefix}.*({config.ProjectSuffix}|Repository)$")).ToArray())
            //.Where(t => t.Name.EndsWith("Repository"))
            //.AsImplementedInterfaces().InstancePerLifetimeScope();
            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().Where(r => RegexHelper.IsMatch(r.GetName().Name, $"^{config.ProjectPrefix}.*({config.ProjectSuffix}|Aggregate)$")).ToArray())
            .Where(t => t.Name.EndsWith("Aggregate"))
            .AsImplementedInterfaces().InstancePerLifetimeScope();

            builder.RegisterLogger(autowireProperties: true);

            var baseType = typeof(ControllerBase);

            builder.RegisterAssemblyTypes(typeFinder.GetAssemblies().ToArray())
            .Where(t => baseType.IsAssignableFrom(t) && t != baseType).InstancePerLifetimeScope();

            if (config.AppType == AppType.Api)//api 没有权限验证判断使用默认的
            {
                builder.RegisterType <NullPermissionService>().As <INetProPermissionService>().InstancePerLifetimeScope();
            }
        }