Exemple #1
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.RegisterAddonServices(Configuration);

            services.Decorate <IContextDriver>((driver, provider) => new TimedContextDriver(driver, provider.GetService <IMetrics>()));

            services.AddSingleton <IDiagnosticsProvider>(ctx => new RulesDriverDiagnosticsProvider(ctx.GetServices <IRulesDriver>().Single()));
            services.AddSingleton <IDiagnosticsProvider>(new EnvironmentDiagnosticsProvider());

            services.AddSingleton(CreateParserResolver());
            services.AddSingleton(provider =>
            {
                var parserResolver = provider.GetService <GetRuleParser>();
                var rulesDriver    = provider.GetService <IRulesDriver>();
                return(Task.Run(async() => await Engine.Tweek.Create(rulesDriver, parserResolver)).Result);
            });
            services.AddSingleton(provider =>
            {
                var rulesDriver = provider.GetService <IRulesDriver>();
                return(Task.Run(async() => await TweekIdentityProvider.Create(rulesDriver)).Result);
            });
            services.AddSingleton(provider => Authorization.CreateReadConfigurationAccessChecker(provider.GetService <ITweek>(), provider.GetService <TweekIdentityProvider>()));
            services.AddSingleton(provider => Authorization.CreateWriteContextAccessChecker(provider.GetService <ITweek>(), provider.GetService <TweekIdentityProvider>()));
            services.AddSingleton(provider => Validator.GetValidationDelegate(provider.GetService <GetRuleParser>()));

            var tweekContactResolver = new TweekContractResolver();
            var jsonSerializer       = new JsonSerializer()
            {
                ContractResolver = tweekContactResolver
            };

            services.AddSingleton(jsonSerializer);
            services.AddMvc(options => options.AddMetricsResourceFilter())
            .AddJsonOptions(opt =>
            {
                opt.SerializerSettings.ContractResolver = tweekContactResolver;
            });

            services.SetupCors(Configuration);

            RegisterMetrics(services);
            services.AdaptSingletons <IDiagnosticsProvider, HealthCheck>(inner => new DiagnosticsProviderDecorator(inner));
            services.AddSwaggerGen(options =>
            {
                options.SwaggerDoc("api", new Info
                {
                    Title   = "Tweek Api",
                    License = new License {
                        Name = "MIT", Url = "https://github.com/Soluto/tweek/blob/master/LICENSE"
                    },
                    Version = Assembly.GetEntryAssembly()
                              .GetCustomAttribute <AssemblyInformationalVersionAttribute>()
                              .InformationalVersion
                });
                // Generate Dictionary<string,JsonValue> as JSON object in Swagger
                options.MapType(typeof(Dictionary <string, JsonValue>), () => new Schema {
                    Type = "object"
                });

                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                var xmlPath  = Path.Combine(basePath, "Tweek.ApiService.NetCore.xml");
                options.IncludeXmlComments(xmlPath);
            });
            services.ConfigureAuthenticationProviders(Configuration, loggerFactory.CreateLogger("AuthenticationProviders"));
        }