From d8351a6704b3e06cb1354e74ec49397c2fc5af10 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Sun, 12 Nov 2017 01:17:21 +0100 Subject: [PATCH] Code cleanup. --- .../Apps/MongoAppRepository.cs | 1 - .../Assets/MongoAssetRepository.cs | 1 - .../Assets/MongoAssetStatsRepository.cs | 1 - .../Schemas/MongoSchemaRepository.cs | 1 - .../CQRS/Events/CompoundEventConsumer.cs | 1 - .../SemanticLogLoggerFactoryExtensions.cs | 7 +- .../Log/Adapter/SemanticLogLoggerProvider.cs | 2 + src/Squidex/AppConfiguration.cs | 24 ++++++ src/Squidex/AppServices.cs | 53 ++++++++++++ .../Config/Domain/EventPublishersServices.cs | 6 +- .../Config/Identity/AuthenticationServices.cs | 4 +- .../Config/Identity/IdentityServices.cs | 8 +- src/Squidex/Program.cs | 19 +++-- src/Squidex/{Startup.cs => WebApp.cs} | 81 +++++-------------- 14 files changed, 122 insertions(+), 87 deletions(-) create mode 100644 src/Squidex/AppConfiguration.cs create mode 100644 src/Squidex/AppServices.cs rename src/Squidex/{Startup.cs => WebApp.cs} (58%) diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppRepository.cs index 92050fb6d..f55b7e494 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Apps/MongoAppRepository.cs @@ -13,7 +13,6 @@ using System.Threading.Tasks; using MongoDB.Driver; using Squidex.Domain.Apps.Read.Apps; using Squidex.Domain.Apps.Read.Apps.Repositories; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb.Apps diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository.cs index e00e6e34d..2caca0755 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetRepository.cs @@ -14,7 +14,6 @@ using MongoDB.Bson; using MongoDB.Driver; using Squidex.Domain.Apps.Read.Assets; using Squidex.Domain.Apps.Read.Assets.Repositories; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb.Assets diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository.cs index 2ef42ad04..290c754e7 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Assets/MongoAssetStatsRepository.cs @@ -14,7 +14,6 @@ using MongoDB.Driver; using Squidex.Domain.Apps.Read.Assets; using Squidex.Domain.Apps.Read.Assets.Repositories; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb.Assets diff --git a/src/Squidex.Domain.Apps.Read.MongoDb/Schemas/MongoSchemaRepository.cs b/src/Squidex.Domain.Apps.Read.MongoDb/Schemas/MongoSchemaRepository.cs index c9c9fb5f8..f17434021 100644 --- a/src/Squidex.Domain.Apps.Read.MongoDb/Schemas/MongoSchemaRepository.cs +++ b/src/Squidex.Domain.Apps.Read.MongoDb/Schemas/MongoSchemaRepository.cs @@ -15,7 +15,6 @@ using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Read.Schemas; using Squidex.Domain.Apps.Read.Schemas.Repositories; using Squidex.Infrastructure; -using Squidex.Infrastructure.CQRS.Events; using Squidex.Infrastructure.MongoDb; namespace Squidex.Domain.Apps.Read.MongoDb.Schemas diff --git a/src/Squidex.Infrastructure/CQRS/Events/CompoundEventConsumer.cs b/src/Squidex.Infrastructure/CQRS/Events/CompoundEventConsumer.cs index d86bdf58a..463348dde 100644 --- a/src/Squidex.Infrastructure/CQRS/Events/CompoundEventConsumer.cs +++ b/src/Squidex.Infrastructure/CQRS/Events/CompoundEventConsumer.cs @@ -6,7 +6,6 @@ // All rights reserved. // ========================================================================== -using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; diff --git a/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerFactoryExtensions.cs b/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerFactoryExtensions.cs index 662da7078..fbb32bc50 100644 --- a/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerFactoryExtensions.cs +++ b/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerFactoryExtensions.cs @@ -6,17 +6,18 @@ // All rights reserved. // ========================================================================== +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace Squidex.Infrastructure.Log.Adapter { public static class SemanticLogLoggerFactoryExtensions { - public static ILoggerFactory AddSemanticLog(this ILoggerFactory factory, ISemanticLog semanticLog) + public static ILoggingBuilder AddSemanticLog(this ILoggingBuilder builder) { - factory.AddProvider(new SemanticLogLoggerProvider(semanticLog)); + builder.Services.AddSingleton(); - return factory; + return builder; } } } diff --git a/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerProvider.cs b/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerProvider.cs index 3bd84a2b1..7e2ad2956 100644 --- a/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerProvider.cs +++ b/src/Squidex.Infrastructure/Log/Adapter/SemanticLogLoggerProvider.cs @@ -16,6 +16,8 @@ namespace Squidex.Infrastructure.Log.Adapter public SemanticLogLoggerProvider(ISemanticLog semanticLog) { + Guard.NotNull(semanticLog, nameof(semanticLog)); + this.semanticLog = semanticLog; } diff --git a/src/Squidex/AppConfiguration.cs b/src/Squidex/AppConfiguration.cs new file mode 100644 index 000000000..63579016c --- /dev/null +++ b/src/Squidex/AppConfiguration.cs @@ -0,0 +1,24 @@ +// ========================================================================== +// AppConfiguration.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using Microsoft.Extensions.Configuration; + +namespace Squidex +{ + public static class AppConfiguration + { + public static void AddAppConfiguration(this IConfigurationBuilder builder, string environmentName, string[] args) + { + builder.Sources.Clear(); + builder.AddJsonFile("appsettings.json", true, true); + builder.AddJsonFile($"appsettings.{environmentName}.json", true); + builder.AddEnvironmentVariables(); + builder.AddCommandLine(args); + } + } +} diff --git a/src/Squidex/AppServices.cs b/src/Squidex/AppServices.cs new file mode 100644 index 000000000..05d969b3f --- /dev/null +++ b/src/Squidex/AppServices.cs @@ -0,0 +1,53 @@ +// ========================================================================== +// Services.cs +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex Group +// All rights reserved. +// ========================================================================== + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Squidex.Config; +using Squidex.Config.Domain; +using Squidex.Config.Identity; +using Squidex.Config.Swagger; +using Squidex.Config.Web; + +namespace Squidex +{ + public static class AppServices + { + public static void AddAppServices(this IServiceCollection services, IConfiguration config) + { + services.AddLogging(); + services.AddMemoryCache(); + services.AddOptions(); + + services.AddMyAssetServices(config); + services.AddMyAuthentication(config); + services.AddMyDataProtectection(config); + services.AddMyEventPublishersServices(config); + services.AddMyEventStoreServices(config); + services.AddMyIdentity(); + services.AddMyIdentityServer(); + services.AddMyInfrastructureServices(config); + services.AddMyMvc(); + services.AddMyPubSubServices(config); + services.AddMyReadServices(config); + services.AddMySerializers(); + services.AddMyStoreServices(config); + services.AddMySwaggerSettings(); + services.AddMyWriteServices(); + + services.Configure( + config.GetSection("urls")); + services.Configure( + config.GetSection("identity")); + services.Configure( + config.GetSection("ui")); + services.Configure( + config.GetSection("usage")); + } + } +} diff --git a/src/Squidex/Config/Domain/EventPublishersServices.cs b/src/Squidex/Config/Domain/EventPublishersServices.cs index 90b46821b..0d3edbacb 100644 --- a/src/Squidex/Config/Domain/EventPublishersServices.cs +++ b/src/Squidex/Config/Domain/EventPublishersServices.cs @@ -17,9 +17,9 @@ namespace Squidex.Config.Domain { public static class EventPublishersServices { - public static void AddMyEventPublishersServices(this IServiceCollection services, IConfiguration configuration) + public static void AddMyEventPublishersServices(this IServiceCollection services, IConfiguration config) { - var eventPublishers = configuration.GetSection("eventPublishers"); + var eventPublishers = config.GetSection("eventPublishers"); foreach (var child in eventPublishers.GetChildren()) { @@ -30,7 +30,7 @@ namespace Squidex.Config.Domain throw new ConfigurationException($"Configure EventPublisher type with 'eventPublishers:{child.Key}:type'."); } - var eventsFilter = configuration.GetValue("eventsFilter"); + var eventsFilter = config.GetValue("eventsFilter"); var enabled = child.GetValue("enabled"); diff --git a/src/Squidex/Config/Identity/AuthenticationServices.cs b/src/Squidex/Config/Identity/AuthenticationServices.cs index efd01bebc..156ef6072 100644 --- a/src/Squidex/Config/Identity/AuthenticationServices.cs +++ b/src/Squidex/Config/Identity/AuthenticationServices.cs @@ -28,11 +28,11 @@ namespace Squidex.Config.Identity return services; } - public static AuthenticationBuilder AddMyApiProtection(this AuthenticationBuilder authBuilder, MyIdentityOptions identityOptions, IConfiguration configuration) + public static AuthenticationBuilder AddMyApiProtection(this AuthenticationBuilder authBuilder, MyIdentityOptions identityOptions, IConfiguration config) { var apiScope = Constants.ApiScope; - var urlsOptions = configuration.GetSection("urls").Get(); + var urlsOptions = config.GetSection("urls").Get(); if (!string.IsNullOrWhiteSpace(urlsOptions.BaseUrl)) { diff --git a/src/Squidex/Config/Identity/IdentityServices.cs b/src/Squidex/Config/Identity/IdentityServices.cs index 330af04b0..206637c1c 100644 --- a/src/Squidex/Config/Identity/IdentityServices.cs +++ b/src/Squidex/Config/Identity/IdentityServices.cs @@ -17,15 +17,15 @@ namespace Squidex.Config.Identity { public static class IdentityServices { - public static IServiceCollection AddMyDataProtectection(this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddMyDataProtectection(this IServiceCollection services, IConfiguration config) { var dataProtection = services.AddDataProtection().SetApplicationName("Squidex"); - configuration.ConfigureByOption("identity:keysStore:type", new Options + config.ConfigureByOption("identity:keysStore:type", new Options { ["Redis"] = () => { - var redisConfiguration = configuration.GetRequiredValue("identity:keysStore:redis:configuration"); + var redisConfiguration = config.GetRequiredValue("identity:keysStore:redis:configuration"); var connectionMultiplexer = Singletons.GetOrAdd(redisConfiguration, s => ConnectionMultiplexer.Connect(s)); @@ -33,7 +33,7 @@ namespace Squidex.Config.Identity }, ["Folder"] = () => { - var folderPath = configuration.GetRequiredValue("identity:keysStore:folder:path"); + var folderPath = config.GetRequiredValue("identity:keysStore:folder:path"); dataProtection.PersistKeysToFileSystem(new DirectoryInfo(folderPath)); }, diff --git a/src/Squidex/Program.cs b/src/Squidex/Program.cs index 35d74a6e0..f109dc475 100644 --- a/src/Squidex/Program.cs +++ b/src/Squidex/Program.cs @@ -8,7 +8,7 @@ using System.IO; using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Squidex.Infrastructure.Log.Adapter; namespace Squidex { @@ -20,14 +20,17 @@ namespace Squidex .UseKestrel(k => { k.AddServerHeader = false; }) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() - .UseStartup() - .ConfigureAppConfiguration((hostContext, options) => + .ConfigureLogging(builder => { - options.Sources.Clear(); - options.AddJsonFile("appsettings.json", true, true); - options.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true); - options.AddEnvironmentVariables(); - options.AddCommandLine(args); + builder.AddSemanticLog(); + }) + .ConfigureAppConfiguration((hostContext, builder) => + { + builder.AddAppConfiguration(hostContext.HostingEnvironment.EnvironmentName, args); + }) + .ConfigureServices((context, services) => + { + services.AddAppServices(context.Configuration); }) .Build() .Run(); diff --git a/src/Squidex/Startup.cs b/src/Squidex/WebApp.cs similarity index 58% rename from src/Squidex/Startup.cs rename to src/Squidex/WebApp.cs index 7deeb29a8..6b6a5f764 100644 --- a/src/Squidex/Startup.cs +++ b/src/Squidex/WebApp.cs @@ -1,5 +1,5 @@ // ========================================================================== -// Startup.cs +// WebApp.cs // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex Group @@ -13,20 +13,18 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Squidex.Config; using Squidex.Config.Domain; using Squidex.Config.Identity; using Squidex.Config.Swagger; using Squidex.Config.Web; using Squidex.Infrastructure.Log; -using Squidex.Infrastructure.Log.Adapter; #pragma warning disable RECS0002 // Convert anonymous method to method group namespace Squidex { - public class Startup + public static class WebApp { private static readonly string[] IdentityServerPaths = { @@ -36,52 +34,9 @@ namespace Squidex "/error" }; - private IConfiguration Configuration { get; } - - private IHostingEnvironment Environment { get; } - - public Startup(IHostingEnvironment env, IConfiguration config) - { - Environment = env; - - Configuration = config; - } - - public void ConfigureServices(IServiceCollection services) - { - services.AddLogging(); - services.AddMemoryCache(); - services.AddOptions(); - - services.AddMyAssetServices(Configuration); - services.AddMyAuthentication(Configuration); - services.AddMyDataProtectection(Configuration); - services.AddMyEventPublishersServices(Configuration); - services.AddMyEventStoreServices(Configuration); - services.AddMyIdentity(); - services.AddMyIdentityServer(); - services.AddMyInfrastructureServices(Configuration); - services.AddMyMvc(); - services.AddMyPubSubServices(Configuration); - services.AddMyReadServices(Configuration); - services.AddMySerializers(); - services.AddMyStoreServices(Configuration); - services.AddMySwaggerSettings(); - services.AddMyWriteServices(); - - services.Configure( - Configuration.GetSection("urls")); - services.Configure( - Configuration.GetSection("identity")); - services.Configure( - Configuration.GetSection("ui")); - services.Configure( - Configuration.GetSection("usage")); - } - - public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) + public static void ConfigureApp(this IApplicationBuilder app) { - loggerFactory.AddSemanticLog(app.ApplicationServices.GetRequiredService()); + var env = app.ApplicationServices.GetRequiredService(); app.TestExternalSystems(); @@ -89,30 +44,32 @@ namespace Squidex app.UseMyForwardingRules(); app.UseMyTracking(); - MapAndUseIdentity(app); - MapAndUseApi(app); - MapAndUseFrontend(app); - - app.UseMyEventStore(); + app.MapAndUseIdentityServer(env); + app.MapAndUseApi(env); + app.MapAndUseFrontend(env); var log = app.ApplicationServices.GetRequiredService(); + var config = app.ApplicationServices.GetRequiredService(); + log.LogInformation(w => w .WriteProperty("message", "Application started") .WriteObject("environment", c => { - foreach (var kvp in Configuration.AsEnumerable().Where(kvp => kvp.Value != null)) + foreach (var kvp in config.AsEnumerable().Where(kvp => kvp.Value != null)) { c.WriteProperty(kvp.Key, kvp.Value); } })); + + app.UseMyEventStore(); } - private void MapAndUseIdentity(IApplicationBuilder app) + private static void MapAndUseIdentityServer(this IApplicationBuilder app, IHostingEnvironment env) { app.Map(Constants.IdentityPrefix, identityApp => { - if (Environment.IsDevelopment()) + if (env.IsDevelopment()) { identityApp.UseDeveloperExceptionPage(); } @@ -127,18 +84,18 @@ namespace Squidex identityApp.UseMyAdmin(); identityApp.UseStaticFiles(); - identityApp.MapWhen(x => IsIdentityRequest(x), mvcApp => + identityApp.MapWhen(IsIdentityRequest, mvcApp => { mvcApp.UseMvc(); }); }); } - private void MapAndUseApi(IApplicationBuilder app) + private static void MapAndUseApi(this IApplicationBuilder app, IHostingEnvironment env) { app.Map(Constants.ApiPrefix, appApi => { - if (Environment.IsDevelopment()) + if (env.IsDevelopment()) { appApi.UseDeveloperExceptionPage(); } @@ -152,9 +109,9 @@ namespace Squidex }); } - private void MapAndUseFrontend(IApplicationBuilder app) + private static void MapAndUseFrontend(this IApplicationBuilder app, IHostingEnvironment env) { - if (Environment.IsDevelopment()) + if (env.IsDevelopment()) { app.UseWebpackProxy();