public BenchmarkActionFilter(ILogger logger, NetProOption config, IWebHelper webHelper, IConfiguration configuration) { _logger = logger; _config = config; _webHelper = webHelper; _configuration = configuration; }
public BenchmarkActionFilter(ILogger <BenchmarkActionFilter> logger, NetProOption config, IWebHelper webHelper, IConfiguration configuration, RequestCacheData requestCacheData) { _logger = logger; _config = config; _webHelper = webHelper; _configuration = configuration; _requestCacheData = requestCacheData; }
/// <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); }
/// <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; }
public ReqeustBodyFilter(ILogger logger, NetProOption config) { _logger = logger; _config = config; }
public void Register(ContainerBuilder builder, ITypeFinder typeFinder, NetProOption config) { builder.Register(c => new DefaultDapperContext(config.ConnectionStrings.ServerIdConnection["2"], DataProvider.Mysql)).InstancePerLifetimeScope(); }
public PermissionActionFilter(NetProOption config, INetProPermissionService NetProPermissionService, ILogger logger) { _config = config; _NetProPermissionService = NetProPermissionService; _logger = logger; }
/// <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(); } }
/// <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); }
public NetProExceptionFilter(ILogger logger, IWebHelper webHelper, NetProOption config) { _logger = logger; _webHelper = webHelper; _config = config; }
/// <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; }
public ReqeustBodyFilter(ILogger logger, NetProOption config, IWebHelper webHelper) { _logger = logger; _config = config; _webHelper = webHelper; }
/// <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; }
/// <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(); } }