private static IServiceProvider ConfigureServices(IServiceCollection services, IConfiguration configuration, IWebHostEnvironment webHostEnvironment, AppConfig mozOptions) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; services.AddAuthorization(options => { options.AddPolicy("admin_authorize", policy => { policy.Requirements.Add(new DefaultAuthorizationRequirement("admin")); }); options.AddPolicy("member_authorize", policy => { policy.Requirements.Add(new DefaultAuthorizationRequirement("member")); }); }); services.AddAuthentication() .AddJwtBearer(MozAuthAttribute.MozAuthorizeSchemes, cfg => { cfg.RequireHttpsMetadata = false; cfg.SaveToken = true; var parameters = EngineContext.Current.Resolve <IJwtService>().GetTokenValidationParameters(); cfg.TokenValidationParameters = parameters; cfg.Events = new JwtBearerEvents { //OnAuthenticationFailed = o => throw new AlertException("auth failure") }; }); //Session会话 services.AddSession(options => { options.Cookie.Name = "__moz__session"; options.Cookie.HttpOnly = true; options.IdleTimeout = TimeSpan.FromMinutes(30); }); //添加MVC services.AddMvc(options => { }) .ConfigureApiBehaviorOptions(options => { options.SuppressModelStateInvalidFilter = true; }) .AddRazorRuntimeCompilation() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; }) .AddFluentValidation(options => { options.ImplicitlyValidateChildProperties = true; options.ValidatorFactoryType = typeof(MozValidatorFactory); options.RunDefaultMvcValidationAfterFluentValidationExecutes = false; }); /* * services.AddApiVersioning(o => * { * o.ReportApiVersions = true; * o.AssumeDefaultVersionWhenUnspecified = true; * o.DefaultApiVersion = new ApiVersion(1, 0); * }); */ #region 依赖注入 services.AddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton <IActionContextAccessor, ActionContextAccessor>(); services.AddTransient <IWorkContext, WebWorkContext>(); services.AddSingleton <IFileUploader, LocalFileUploader>(); services.AddTransient <HttpContextHelper>(); services.AddSingleton <IEventPublisher, DefaultEventPublisher>(); services.AddSingleton <ITaskScheduleManager, TaskScheduleManager>(); services.AddSingleton <IAuthorizationHandler, DefaultAuthorizationHandler>(); services.AddSingleton <IJobFactory, JobFactory>(); services.AddTransient <FileStorageDataSource>(); services.AddTransient <IFileManager, DefaultFileManager>(); //注入服务类 查找所有Service结尾的类进行注册 var allServiceInterfaces = TypeFinder.GetAllTypes() .Where(t => (t?.IsInterface ?? false) && !t.IsDefined <IgnoreRegisterAttribute>(false) && t.TypeName.EndsWith("Service")); foreach (var serviceInterface in allServiceInterfaces) { var service = TypeFinder.FindClassesOfType(serviceInterface.Type)?.FirstOrDefault(); if (service != null) { services.AddTransient(serviceInterface.Type, service.Type); } } //注入所有Job类 var jobTypes = TypeFinder.FindClassesOfType <IJob>().ToList(); foreach (var jobType in jobTypes) { services.AddTransient(jobType.Type); } //注入所有Uploader类 var uploaderTypes = TypeFinder.FindClassesOfType <IFileUploader>(); foreach (var uploaderType in uploaderTypes) { services.AddTransient(uploaderType.Type); } //注册settings var settingTypes = TypeFinder.FindClassesOfType(typeof(ISettings)).ToList(); foreach (var settingType in settingTypes) { services.TryAddTransient(settingType.Type, serviceProvider => { if (DbFactory.CheckInstalled(mozOptions)) { var settingService = serviceProvider.GetService <ISettingService>(); return(settingService.LoadSetting(settingType.Type)); } var instance = Activator.CreateInstance(settingType.Type); return(instance); }); } //注入 ExceptionHandler var exceptionHandlers = TypeFinder.FindClassesOfType(typeof(IExceptionHandler)) .Where(it => it.Type != typeof(ErrorHandlingMiddleware)) .ToList(); foreach (var exceptionHandler in exceptionHandlers) { services.AddSingleton(exceptionHandler.Type); } //注入 StatusCodePageHandler var statusCodePageHandlers = TypeFinder.FindClassesOfType(typeof(IStatusCodePageHandler)).ToList(); foreach (var statusCodePageHandler in statusCodePageHandlers) { services.AddSingleton(statusCodePageHandler.Type); } //事件发布 var consumerTypes = TypeFinder.FindClassesOfType(typeof(ISubscriber <>)).ToList(); foreach (var consumerType in consumerTypes) { var interfaceTypes = consumerType.Type.FindInterfaces((type, criteria) => { var isMatch = type.IsGenericType && ((Type)criteria).IsAssignableFrom(type.GetGenericTypeDefinition()); return(isMatch); }, typeof(ISubscriber <>)); var interfaceType = interfaceTypes.FirstOrDefault(); if (interfaceType != null) { services.AddTransient(interfaceType, consumerType.Type); } } #endregion //获取所有的 IAppStartup var startupConfigurations = TypeFinder.FindClassesOfType <IAppStartup>(); //添加嵌入cshtml资源 services.Configure <MvcRazorRuntimeCompilationOptions>(options => { foreach (var cfg in startupConfigurations) { options.FileProviders.Add(new EmbeddedFileProvider(cfg.Type.GetTypeInfo().Assembly)); } }); //执行各个模块的启动类 var instances = startupConfigurations .Select(startup => (IAppStartup)Activator.CreateInstance(startup.Type)) .OrderBy(startup => startup.Order); foreach (var instance in instances) { instance.ConfigureServices(services, configuration, webHostEnvironment, mozOptions); } //services. return(services.BuildServiceProvider()); }