Esempio n. 1
0
        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());
        }