diff --git a/apps/NewBlazor/Components/Pages/Counter.razor b/apps/NewBlazor/Components/Pages/Counter.razor index 624373ca2..471fbaa93 100644 --- a/apps/NewBlazor/Components/Pages/Counter.razor +++ b/apps/NewBlazor/Components/Pages/Counter.razor @@ -10,7 +10,7 @@ @code { - private int currentCount = 0; + private int currentCount; private void IncrementCount() { diff --git a/apps/NewBlazor/Components/Pages/Weather.razor b/apps/NewBlazor/Components/Pages/Weather.razor index 6cdac744f..78d1c3361 100644 --- a/apps/NewBlazor/Components/Pages/Weather.razor +++ b/apps/NewBlazor/Components/Pages/Weather.razor @@ -1,5 +1,5 @@ @page "/weather" -@attribute [StreamRendering(true)] +@attribute [StreamRendering] Weather diff --git a/apps/NewBlazor/NewBlazor.csproj b/apps/NewBlazor/NewBlazor.csproj index d19aa4c13..4d825d403 100644 --- a/apps/NewBlazor/NewBlazor.csproj +++ b/apps/NewBlazor/NewBlazor.csproj @@ -11,6 +11,7 @@ + diff --git a/perf/Sitko.Core.App.Perf/Program.cs b/perf/Sitko.Core.App.Perf/Program.cs index 61b99373b..561c28f0f 100644 --- a/perf/Sitko.Core.App.Perf/Program.cs +++ b/perf/Sitko.Core.App.Perf/Program.cs @@ -2,7 +2,9 @@ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Localization; +using Sitko.Core.App.Localization; using Sitko.Core.App.Tests; namespace Sitko.Core.App.Perf; @@ -23,8 +25,9 @@ public class LocalizationTest [GlobalSetup] public void GlobalSetup() { - var application = new LocalizationTestApplication(Array.Empty()); - var host = application.GetHostBuilder().Build(); + var builder = Host.CreateApplicationBuilder(); + builder.AddJsonLocalization(options => options.AddDefaultResource()); + var host = builder.Build(); factory = host.Services.GetService(); type = typeof(LocalizationTests); } @@ -53,4 +56,3 @@ public void GlobalSetup() [Benchmark] public string DefaultInvariantFallback() => Localizer["DefaultBaz"]; } - diff --git a/src/Sitko.Core.App.Web/IWebApplicationModule.cs b/src/Sitko.Core.App.Web/IWebApplicationModule.cs index 9c7fd3dfa..2ee17730d 100644 --- a/src/Sitko.Core.App.Web/IWebApplicationModule.cs +++ b/src/Sitko.Core.App.Web/IWebApplicationModule.cs @@ -35,7 +35,7 @@ public interface IWebApplicationModule : IWebApplicationModule, where TModuleOptions : class, new() { void ConfigureWebHost(IApplicationContext applicationContext, ConfigureWebHostBuilder webHostBuilder, - TModuleOptions valueTuple) + TModuleOptions options) { } } diff --git a/src/Sitko.Core.App.Web/WebApplication.cs b/src/Sitko.Core.App.Web/WebApplication.cs deleted file mode 100644 index 0ee212bb5..000000000 --- a/src/Sitko.Core.App.Web/WebApplication.cs +++ /dev/null @@ -1,135 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Sitko.Core.App.Web; - -// public abstract class WebApplication : HostedApplication -// { -// protected WebApplication(string[] args) : base(args) -// { -// } - - - - // - // public virtual void BeforeRoutingHook(IApplicationContext applicationContext, - // IApplicationBuilder appBuilder) - // { - // foreach (var webModule in GetWebModules(applicationContext)) - // { - // webModule.ConfigureBeforeUseRouting(applicationContext, appBuilder); - // } - // } - // - // public virtual void AfterRoutingHook(IApplicationContext applicationContext, - // IApplicationBuilder appBuilder) - // { - // foreach (var webModule in GetWebModules(applicationContext)) - // { - // webModule.ConfigureAfterUseRouting(applicationContext, appBuilder); - // } - // } - // - // public virtual void AuthMiddlewareHook(IApplicationContext applicationContext, - // IApplicationBuilder appBuilder) - // { - // foreach (var webModule in GetWebModules(applicationContext)) - // { - // webModule.ConfigureAuthMiddleware(applicationContext, appBuilder); - // } - // } - // - // public virtual void EndpointsHook(IApplicationContext applicationContext, - // IApplicationBuilder appBuilder, IEndpointRouteBuilder endpoints) - // { - // foreach (var webModule in GetWebModules(applicationContext)) - // { - // webModule.ConfigureEndpoints(applicationContext, appBuilder, endpoints); - // } - // } -//} - -// public abstract class WebApplication : WebApplication where TStartup : BaseStartup -// { -// protected WebApplication(string[] args) : base(args) -// { -// } -// -// // protected override void ConfigureAppConfiguration(HostBuilderContext context, -// // IConfigurationBuilder configurationBuilder) -// // { -// // base.ConfigureAppConfiguration(context, configurationBuilder); -// // -// // configurationBuilder.AddEnvironmentVariables(); -// // } -// -// // protected override void ConfigureHostConfiguration(IConfigurationBuilder configurationBuilder) -// // { -// // base.ConfigureHostConfiguration(configurationBuilder); -// // configurationBuilder.AddUserSecrets(true); -// // configurationBuilder.AddEnvironmentVariables(); -// // } -// -// // protected override void ConfigureHostBuilder(IHostBuilder builder) -// // { -// // base.ConfigureHostBuilder(builder); -// // builder -// // .ConfigureServices(collection => -// // { -// // collection.AddSingleton(typeof(WebApplication), this); -// // collection.AddSingleton(typeof(WebApplication), this); -// // }); -// // } -// -// // protected override void PostConfigureHostBuilder(IApplicationContext applicationContext, IHostBuilder hostBuilder) -// // { -// // base.PostConfigureHostBuilder(applicationContext, hostBuilder); -// // hostBuilder.ConfigureWebHostDefaults(webBuilder => -// // { -// // webBuilder.UseSetting("ApplicationId", Id.ToString()); -// // webBuilder.UseStartup(); -// // ConfigureWebHostDefaults(applicationContext, webBuilder); -// // }); -// // } -// -// // protected virtual void ConfigureWebHostDefaults(IApplicationContext applicationContext, -// // IWebHostBuilder webHostBuilder) -// // { -// // } -// -// // public WebApplication Run() -// // { -// // CreateAppHost().Start(); -// // return this; -// // } -// // -// // public WebApplication Run(int port) -// // { -// // CreateAppHost(builder => -// // builder.ConfigureWebHostDefaults( -// // webHostBuilder => webHostBuilder.UseUrls($"http://*:{port}"))).Start(); -// // return this; -// // } -// } - -// public static class WebApplicationExtensions -// { -// // public static TWebApplication Run(this TWebApplication application) -// // where TWebApplication : WebApplication where TStartup : BaseStartup -// // { -// // application.Run(); -// // return application; -// // } -// // -// // public static TWebApplication Run(this TWebApplication application, int port) -// // where TStartup : BaseStartup -// // where TWebApplication : WebApplication -// // { -// // application.Run(port); -// // return application; -// // } -// } diff --git a/src/Sitko.Core.App.Web/WebApplicationExtensions.cs b/src/Sitko.Core.App.Web/WebApplicationExtensions.cs index 77490cc93..918f32d87 100644 --- a/src/Sitko.Core.App.Web/WebApplicationExtensions.cs +++ b/src/Sitko.Core.App.Web/WebApplicationExtensions.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Sitko.Core.App.Web; @@ -22,7 +23,7 @@ protected override void ConfigureHostBuilder(Applicatio if (module is TModule and IWebApplicationModule webModule && options is TModuleOptions webModuleOptions) { - webModule?.ConfigureWebHost(BootApplicationContext, webApplicationBuilder.WebHost, webModuleOptions); + webModule.ConfigureWebHost(BootApplicationContext, webApplicationBuilder.WebHost, webModuleOptions); } } } @@ -30,13 +31,12 @@ protected override void ConfigureHostBuilder(Applicatio public static class WebApplicationExtensions { + public static SitkoCoreApplicationBuilder AddSitkoCore(this WebApplicationBuilder builder) => + builder.AddSitkoCore(Array.Empty()); + public static SitkoCoreApplicationBuilder AddSitkoCore(this WebApplicationBuilder builder, string[] args) { - builder.Services.AddTransient(); - // if (builder.Builder is WebApplicationBuilder webApplicationBuilder) - // { - // webApplicationBuilder.WebHost. - // } + builder.Services.TryAddTransient(); return new SitkoCoreWebApplicationBuilder(builder, args); } diff --git a/src/Sitko.Core.App/Application.cs b/src/Sitko.Core.App/Application.cs index a19c21c89..c8dbb4a21 100644 --- a/src/Sitko.Core.App/Application.cs +++ b/src/Sitko.Core.App/Application.cs @@ -1,215 +1,215 @@ -using System.Text.Json; -using JetBrains.Annotations; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace Sitko.Core.App; - -public abstract class Application : IApplication -{ - // private readonly List moduleRegistrations = - // new(); - - //private readonly Dictionary store = new(); - //private bool disposed; - - protected Application(string[] args) - { - //Args = args; - //AddModule(); - } - - - protected string[] Args { get; set; } - - public static string OptionsKey => nameof(Application); - - public Guid Id { get; } = Guid.NewGuid(); - - - // public string Name => GetApplicationOptions().Name; - // public string Version => GetApplicationOptions().Version; - - // public async ValueTask DisposeAsync() - // { - // if (disposed) - // { - // return; - // } - // - // await DisposeAsync(true); - // GC.SuppressFinalize(this); - // disposed = true; - // } - - protected virtual ValueTask DisposeAsync(bool disposing) => new(); - - [PublicAPI] - //public ApplicationOptions GetApplicationOptions() => GetContext().Options; - - - - protected virtual void ConfigureHostConfiguration(IConfigurationBuilder configurationBuilder) - { - } - - protected virtual void ConfigureAppConfiguration(HostBuilderContext context, - IConfigurationBuilder configurationBuilder) - { - } - - - [PublicAPI] - //public Dictionary GetModulesOptions() => GetModulesOptions(GetContext()); - - - - public async Task RunAsync() - { - // LogInternal("Run app start"); - // LogInternal("Build and init"); - // var context = await BuildAppContextAsync(); - - // var enabledModules = GetEnabledModuleRegistrations(context).ToArray(); - // foreach (var enabledModule in enabledModules) - // { - // var shouldContinue = await enabledModule.GetInstance().OnBeforeRunAsync(this, context, Args); - // if (!shouldContinue) - // { - // return; - // } - // } - - // LogInternal("Check required modules"); - // var modulesCheckSuccess = true; - // foreach (var registration in enabledModules) - // { - // var result = - // registration.CheckRequiredModules(context, - // enabledModules.Select(r => r.Type).ToArray()); - // if (!result.isSuccess) - // { - // foreach (var missingModule in result.missingModules) - // { - // LogInternal($"Required module {missingModule} for module {registration.Type} is not registered"); - // } - // - // modulesCheckSuccess = false; - // } - // } - - // if (!modulesCheckSuccess) - // { - // LogInternal("Check required modules failed"); - // return; - // } - - // foreach (var enabledModule in enabledModules) - // { - // var shouldContinue = await enabledModule.GetInstance().OnAfterRunAsync(this, context, Args); - // if (!shouldContinue) - // { - // return; - // } - // } - - //await DoRunAsync(); - } - - protected abstract Task DoRunAsync(); - - protected abstract Task BuildAppContextAsync(); - - public abstract Task StopAsync(); - - // protected async Task InitAsync(IServiceProvider serviceProvider) - // { - // LogInternal("Build and init async start"); - // using var scope = serviceProvider.CreateScope(); - // var logger = scope.ServiceProvider.GetRequiredService>(); - // logger.LogInformation("Init modules"); - // // var registrations = GetEnabledModuleRegistrations(GetContext(scope.ServiceProvider)); - // // var context = GetContext(scope.ServiceProvider); - // // foreach (var configurationModule in registrations.Select(module => module.GetInstance()) - // // .OfType()) - // // { - // // configurationModule.CheckConfiguration(context, scope.ServiceProvider); - // // } - // // - // // foreach (var registration in registrations) - // // { - // // logger.LogInformation("Init module {Module}", registration.Type); - // // await registration.InitAsync(context, scope.ServiceProvider); - // // } - // - // LogInternal("Build and init async done"); - // } - - protected virtual void LogInternal(string message) { } - - protected abstract bool CanAddModule(); - - // [PublicAPI] - // protected void RegisterModule( - // Action? configureOptions = null, - // string? optionsKey = null) - // where TModule : IApplicationModule, new() where TModuleOptions : BaseModuleOptions, new() - // { - // if (!CanAddModule()) - // { - // throw new InvalidOperationException("App host is already built. Can't add modules after it"); - // } - // - // var instance = new TModule(); - // if (!instance.AllowMultiple && HasModule()) - // { - // throw new InvalidOperationException($"Module {typeof(TModule)} already registered"); - // } - // - // moduleRegistrations.Add( - // new ApplicationModuleRegistration(instance, configureOptions, optionsKey)); - // } - - // protected virtual void InitApplication() - // { - // } - - - // [PublicAPI] - // protected abstract IApplicationContext GetContext(); - // - // [PublicAPI] - // protected abstract IApplicationContext GetContext(IServiceProvider serviceProvider); - - - - - public Application AddModule() where TModule : BaseApplicationModule, new() - - { - //RegisterModule(); - return this; - } - - public Application AddModule( - Action configureOptions, - string? optionsKey = null) - where TModule : IApplicationModule, new() - where TModuleOptions : BaseModuleOptions, new() - { - //RegisterModule(configureOptions, optionsKey); - return this; - } - - public Application AddModule( - Action? configureOptions = null, - string? optionsKey = null) - where TModule : IApplicationModule, new() - where TModuleOptions : BaseModuleOptions, new() => - AddModule((_, moduleOptions) => - { - configureOptions?.Invoke(moduleOptions); - }, optionsKey); -} +// using System.Text.Json; +// using JetBrains.Annotations; +// using Microsoft.Extensions.Configuration; +// using Microsoft.Extensions.DependencyInjection; +// using Microsoft.Extensions.Hosting; +// using Microsoft.Extensions.Logging; +// +// namespace Sitko.Core.App; +// +// public abstract class Application : IApplication +// { +// // private readonly List moduleRegistrations = +// // new(); +// +// //private readonly Dictionary store = new(); +// //private bool disposed; +// +// protected Application(string[] args) +// { +// //Args = args; +// //AddModule(); +// } +// +// +// protected string[] Args { get; set; } +// +// public static string OptionsKey => nameof(Application); +// +// public Guid Id { get; } = Guid.NewGuid(); +// +// +// // public string Name => GetApplicationOptions().Name; +// // public string Version => GetApplicationOptions().Version; +// +// // public async ValueTask DisposeAsync() +// // { +// // if (disposed) +// // { +// // return; +// // } +// // +// // await DisposeAsync(true); +// // GC.SuppressFinalize(this); +// // disposed = true; +// // } +// +// protected virtual ValueTask DisposeAsync(bool disposing) => new(); +// +// [PublicAPI] +// //public ApplicationOptions GetApplicationOptions() => GetContext().Options; +// +// +// +// protected virtual void ConfigureHostConfiguration(IConfigurationBuilder configurationBuilder) +// { +// } +// +// protected virtual void ConfigureAppConfiguration(HostBuilderContext context, +// IConfigurationBuilder configurationBuilder) +// { +// } +// +// +// [PublicAPI] +// //public Dictionary GetModulesOptions() => GetModulesOptions(GetContext()); +// +// +// +// public async Task RunAsync() +// { +// // LogInternal("Run app start"); +// // LogInternal("Build and init"); +// // var context = await BuildAppContextAsync(); +// +// // var enabledModules = GetEnabledModuleRegistrations(context).ToArray(); +// // foreach (var enabledModule in enabledModules) +// // { +// // var shouldContinue = await enabledModule.GetInstance().OnBeforeRunAsync(this, context, Args); +// // if (!shouldContinue) +// // { +// // return; +// // } +// // } +// +// // LogInternal("Check required modules"); +// // var modulesCheckSuccess = true; +// // foreach (var registration in enabledModules) +// // { +// // var result = +// // registration.CheckRequiredModules(context, +// // enabledModules.Select(r => r.Type).ToArray()); +// // if (!result.isSuccess) +// // { +// // foreach (var missingModule in result.missingModules) +// // { +// // LogInternal($"Required module {missingModule} for module {registration.Type} is not registered"); +// // } +// // +// // modulesCheckSuccess = false; +// // } +// // } +// +// // if (!modulesCheckSuccess) +// // { +// // LogInternal("Check required modules failed"); +// // return; +// // } +// +// // foreach (var enabledModule in enabledModules) +// // { +// // var shouldContinue = await enabledModule.GetInstance().OnAfterRunAsync(this, context, Args); +// // if (!shouldContinue) +// // { +// // return; +// // } +// // } +// +// //await DoRunAsync(); +// } +// +// protected abstract Task DoRunAsync(); +// +// protected abstract Task BuildAppContextAsync(); +// +// public abstract Task StopAsync(); +// +// // protected async Task InitAsync(IServiceProvider serviceProvider) +// // { +// // LogInternal("Build and init async start"); +// // using var scope = serviceProvider.CreateScope(); +// // var logger = scope.ServiceProvider.GetRequiredService>(); +// // logger.LogInformation("Init modules"); +// // // var registrations = GetEnabledModuleRegistrations(GetContext(scope.ServiceProvider)); +// // // var context = GetContext(scope.ServiceProvider); +// // // foreach (var configurationModule in registrations.Select(module => module.GetInstance()) +// // // .OfType()) +// // // { +// // // configurationModule.CheckConfiguration(context, scope.ServiceProvider); +// // // } +// // // +// // // foreach (var registration in registrations) +// // // { +// // // logger.LogInformation("Init module {Module}", registration.Type); +// // // await registration.InitAsync(context, scope.ServiceProvider); +// // // } +// // +// // LogInternal("Build and init async done"); +// // } +// +// protected virtual void LogInternal(string message) { } +// +// protected abstract bool CanAddModule(); +// +// // [PublicAPI] +// // protected void RegisterModule( +// // Action? configureOptions = null, +// // string? optionsKey = null) +// // where TModule : IApplicationModule, new() where TModuleOptions : BaseModuleOptions, new() +// // { +// // if (!CanAddModule()) +// // { +// // throw new InvalidOperationException("App host is already built. Can't add modules after it"); +// // } +// // +// // var instance = new TModule(); +// // if (!instance.AllowMultiple && HasModule()) +// // { +// // throw new InvalidOperationException($"Module {typeof(TModule)} already registered"); +// // } +// // +// // moduleRegistrations.Add( +// // new ApplicationModuleRegistration(instance, configureOptions, optionsKey)); +// // } +// +// // protected virtual void InitApplication() +// // { +// // } +// +// +// // [PublicAPI] +// // protected abstract IApplicationContext GetContext(); +// // +// // [PublicAPI] +// // protected abstract IApplicationContext GetContext(IServiceProvider serviceProvider); +// +// +// +// +// public Application AddModule() where TModule : BaseApplicationModule, new() +// +// { +// //RegisterModule(); +// return this; +// } +// +// public Application AddModule( +// Action configureOptions, +// string? optionsKey = null) +// where TModule : IApplicationModule, new() +// where TModuleOptions : BaseModuleOptions, new() +// { +// //RegisterModule(configureOptions, optionsKey); +// return this; +// } +// +// public Application AddModule( +// Action? configureOptions = null, +// string? optionsKey = null) +// where TModule : IApplicationModule, new() +// where TModuleOptions : BaseModuleOptions, new() => +// AddModule((_, moduleOptions) => +// { +// configureOptions?.Invoke(moduleOptions); +// }, optionsKey); +// } diff --git a/src/Sitko.Core.App/ApplicationLifetimeService.cs b/src/Sitko.Core.App/ApplicationLifetimeService.cs deleted file mode 100644 index f5c4f7624..000000000 --- a/src/Sitko.Core.App/ApplicationLifetimeService.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Microsoft.Extensions.Hosting; - -namespace Sitko.Core.App; - -public class ApplicationLifetimeService : BackgroundService -{ - /*private readonly Application application; - private readonly IApplicationContext applicationContext; - private readonly IHostApplicationLifetime hostApplicationLifetime; - private readonly IServiceProvider serviceProvider; - - public ApplicationLifetimeService(IHostApplicationLifetime hostApplicationLifetime, - IServiceProvider serviceProvider, Application application, IApplicationContext applicationContext) - { - this.hostApplicationLifetime = hostApplicationLifetime; - this.serviceProvider = serviceProvider; - this.application = application; - this.applicationContext = applicationContext; - }*/ - - protected override Task ExecuteAsync(CancellationToken stoppingToken) - { - // ReSharper disable once AsyncVoidLambda - // hostApplicationLifetime.ApplicationStarted.Register(async () => - // await application.OnStarted(applicationContext, serviceProvider)); - // // ReSharper disable once AsyncVoidLambda - // hostApplicationLifetime.ApplicationStopping.Register(async () => - // await application.OnStopping(applicationContext, serviceProvider)); - // // ReSharper disable once AsyncVoidLambda - // hostApplicationLifetime.ApplicationStopped.Register(async () => - // await application.OnStopped(applicationContext, serviceProvider)); - - return Task.CompletedTask; - } -} - diff --git a/src/Sitko.Core.App/BuilderApplicationContext.cs b/src/Sitko.Core.App/BuilderApplicationContext.cs index 4ac441b2b..077099245 100644 --- a/src/Sitko.Core.App/BuilderApplicationContext.cs +++ b/src/Sitko.Core.App/BuilderApplicationContext.cs @@ -1,5 +1,4 @@ using System.Globalization; -using System.Linq.Expressions; using System.Reflection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; @@ -41,6 +40,12 @@ public BuilderApplicationContext(IConfiguration configuration, IHostEnvironment public IConfiguration Configuration { get; } public ILogger Logger { get; } + public string AspNetEnvironmentName => environment.EnvironmentName; + public bool IsDevelopment() => environment.IsDevelopment(); + + public bool IsProduction() => environment.IsProduction(); + public string[] Args { get; } + private ApplicationOptions GetApplicationOptions() { if (applicationOptions is not null) @@ -49,7 +54,7 @@ private ApplicationOptions GetApplicationOptions() } applicationOptions = new ApplicationOptions(); - Configuration.Bind(Application.OptionsKey, applicationOptions); + Configuration.Bind(SitkoCoreApplicationBuilder.OptionsKey, applicationOptions); if (string.IsNullOrEmpty(applicationOptions.Name)) { applicationOptions.Name = Assembly.GetEntryAssembly()?.GetName().Name ?? "App"; @@ -69,12 +74,6 @@ private ApplicationOptions GetApplicationOptions() return applicationOptions; } - public string AspNetEnvironmentName => environment.EnvironmentName; - public bool IsDevelopment() => environment.IsDevelopment(); - - public bool IsProduction() => environment.IsProduction(); - public string[] Args { get; } - protected void ConfigureApplicationOptions(ApplicationOptions options) => options.EnableConsoleLogging ??= environment.IsDevelopment(); } diff --git a/src/Sitko.Core.App/Helpers/DictionaryExtensions.cs b/src/Sitko.Core.App/Helpers/DictionaryExtensions.cs new file mode 100644 index 000000000..7ae5523f6 --- /dev/null +++ b/src/Sitko.Core.App/Helpers/DictionaryExtensions.cs @@ -0,0 +1,15 @@ +namespace Sitko.Core.App.Helpers; + +public static class DictionaryExtensions +{ + public static TValue GetOrCreate(this IDictionary dict, TKey key, Func factory) + { + if (!dict.TryGetValue(key, out var val)) + { + val = factory(); + dict.Add(key, val); + } + + return val; + } +} diff --git a/src/Sitko.Core.App/HostApplicationBuilderExtensions.cs b/src/Sitko.Core.App/HostApplicationBuilderExtensions.cs index d67c9b02a..8420449f5 100644 --- a/src/Sitko.Core.App/HostApplicationBuilderExtensions.cs +++ b/src/Sitko.Core.App/HostApplicationBuilderExtensions.cs @@ -1,9 +1,16 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.Hosting; namespace Sitko.Core.App; public static class HostApplicationBuilderExtensions { + private static readonly ConcurrentDictionary Builders = new(); + + public static SitkoCoreApplicationBuilder + AddSitkoCore(this IHostApplicationBuilder builder) => + builder.AddSitkoCore(Array.Empty()); + public static SitkoCoreApplicationBuilder AddSitkoCore(this IHostApplicationBuilder builder, string[] args) => - new(builder, args); + Builders.GetOrAdd(builder, _ => new SitkoCoreApplicationBuilder(builder, args)); } diff --git a/src/Sitko.Core.App/HostedApplication.cs b/src/Sitko.Core.App/HostedApplication.cs index bd25ecde9..9e6ed1685 100644 --- a/src/Sitko.Core.App/HostedApplication.cs +++ b/src/Sitko.Core.App/HostedApplication.cs @@ -1,248 +1,248 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; - -namespace Sitko.Core.App; - -public abstract class HostedApplication : Application -{ -// private IHost? appHost; - - protected HostedApplication(string[] args) : base(args) - { -// Console.OutputEncoding = Encoding.UTF8; - // var loggerConfiguration = new LoggerConfiguration(); - // loggerConfiguration - // .WriteTo.Console(outputTemplate: ApplicationOptions.BaseConsoleLogFormat, - // formatProvider: CultureInfo.InvariantCulture, - // restrictedToMinimumLevel: LogEventLevel.Debug); - // InternalLogger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()).CreateLogger(); - } - - /*protected ILogger InternalLogger { get; } - - protected virtual IHostBuilder CreateHostBuilderBase(string[] hostBuilderArgs) => - Host.CreateDefaultBuilder(hostBuilderArgs); - - private IHostBuilder CreateHostBuilder(string[] hostBuilderArgs) - { - var builder = CreateHostBuilderBase(hostBuilderArgs); - ConfigureHostBuilder(builder); - return builder; - } - - protected virtual void ConfigureHostBuilder(IHostBuilder builder) - { - builder.ConfigureHostConfiguration(ConfigureHostConfiguration); - builder.ConfigureAppConfiguration(ConfigureAppConfiguration); - } - - protected override void LogInternal(string message) => - InternalLogger.LogInformation("Check log: {Message}", message);*/ - - // protected IHost CreateAppHost(Action? configure = null) - // { - // LogInternal("Create app host start"); - // - // if (appHost is not null) - // { - // LogInternal("App host is already built"); - // - // return appHost; - // } - // - // LogInternal("Configure host builder"); - // - // var hostBuilder = ConfigureHostBuilder(configure); - // - // LogInternal("Build host"); - // var newHost = hostBuilder.Build(); - // - // appHost = newHost; - // LogInternal("Create app host done"); - // return appHost; - // } - - // protected IApplicationContext GetContext(IHostEnvironment environment, IConfiguration configuration) => - // new HostedApplicationContext(this, configuration, environment); - - // protected IHostBuilder ConfigureHostBuilder(Action? configure = null) - // { - // // LogInternal("Configure host builder start"); - // // - // // LogInternal("Create tmp host builder"); - // // - // // var startEnvironment = new HostingEnvironment - // // { - // // ApplicationName = GetType().Assembly.FullName!, EnvironmentName = EnvHelper.GetEnvironmentName() - // // }; - // // - // // var configBuilder = new ConfigurationBuilder() - // // .AddEnvironmentVariables() - // // .AddEnvironmentVariables("DOTNET_") - // // .AddEnvironmentVariables("ASPNETCORE_") - // // .AddJsonFile("appsettings.json", true, false) - // // .AddJsonFile($"appsettings.{startEnvironment.EnvironmentName}.json", true, false); - // // var startApplicationContext = GetContext(startEnvironment, configBuilder.Build()); - // // ConfigureConfiguration(startApplicationContext, configBuilder); - // - // //LogInternal("Init application"); - // - // //InitApplication(); - // - // // LogInternal("Create main host builder"); - // // var hostBuilder = CreateHostBuilder(Args) - // // .UseDefaultServiceProvider(options => - // // { - // // options.ValidateOnBuild = true; - // // options.ValidateScopes = true; - // // }); - // - // //LogInternal("Configure host builder in modules"); - // //var bootConfiguration = configBuilder.Build(); - // // var bootEnvironment = new HostingEnvironment - // // { - // // ApplicationName = bootConfiguration[HostDefaults.ApplicationKey] ?? "", - // // EnvironmentName = bootConfiguration[HostDefaults.EnvironmentKey] ?? Environments.Production - // // }; - // //var bootApplicationContext = GetContext(bootEnvironment, bootConfiguration); - // - // // foreach (var moduleRegistration in GetEnabledModuleRegistrations(bootApplicationContext)) - // // { - // // moduleRegistration.ConfigureHostBuilder(bootApplicationContext, hostBuilder); - // // } - // - // //LogInternal("Configure host builder"); - // // hostBuilder.ConfigureAppConfiguration((_, builder) => - // // { - // // //ConfigureConfiguration(bootApplicationContext, builder); - // // }) - // // // .ConfigureServices((_, services) => - // // // { - // // // //RegisterApplicationServices(bootApplicationContext, services); - // // // //services.AddHostedService(); - // // // }) - // // .ConfigureLogging((builderContext, builder) => - // // { - // // // LogInternal("Configure logging"); - // // // var runtimeContext = GetContext(builderContext.HostingEnvironment, builderContext.Configuration); - // // // LoggingExtensions.ConfigureSerilog(runtimeContext, builder, - // // // configuration => - // // // { - // // // configuration = configuration.Enrich.WithMachineName(); - // // // if (runtimeContext.Options.EnableConsoleLogging == true) - // // // { - // // // configuration = configuration.WriteTo.Console( - // // // outputTemplate: runtimeContext.Options.ConsoleLogFormat, - // // // formatProvider: CultureInfo.InvariantCulture); - // // // } - // // // - // // // return ConfigureLogging(runtimeContext, configuration); - // // // }); - // // }); - // //configure?.Invoke(hostBuilder); - // //PostConfigureHostBuilder(bootApplicationContext, hostBuilder); - // // foreach (var moduleRegistration in GetEnabledModuleRegistrations(bootApplicationContext)) - // // { - // // moduleRegistration.PostConfigureHostBuilder(bootApplicationContext, hostBuilder); - // // } - // LogInternal("Create host builder done"); - // return hostBuilder; - // } - - // protected virtual void PostConfigureHostBuilder(IApplicationContext applicationContext, IHostBuilder hostBuilder) - // { - // } - // - // protected override async ValueTask DisposeAsync(bool disposing) - // { - // await base.DisposeAsync(disposing); - // if (disposing) - // { - // appHost?.Dispose(); - // } - // } - - // public async Task ExecuteAsync(Func command) - // { - // var currentHost = await GetOrCreateHostAsync(builder => builder.UseConsoleLifetime()); - // - // var serviceProvider = currentHost.Services; - // - // try - // { - // using var scope = serviceProvider.CreateScope(); - // await command(scope.ServiceProvider); - // } - // catch (Exception ex) - // { - // var logger = serviceProvider.GetRequiredService>(); - // logger.LogError(ex, "Error: {ErrorText}", ex.ToString()); - // } - // } - - - //public override Task StopAsync() => CreateAppHost().StopAsync(); - // protected override bool CanAddModule() => appHost is null; - //public IHostBuilder GetHostBuilder() => ConfigureHostBuilder(); - - // protected override IApplicationContext GetContext() => appHost is not null - // ? GetContext(appHost.Services) - // : throw new InvalidOperationException("App host is not built yet"); - - // protected async Task GetOrCreateHostAsync(Action? configure = null) - // { - // if (appHost is not null) - // { - // return appHost; - // } - // - // appHost = CreateAppHost(configure); - // - // await InitAsync(appHost.Services); - // - // return appHost; - // } - - // protected override async Task BuildAppContextAsync() - // { - // var currentHost = await GetOrCreateHostAsync(); - // return GetContext(currentHost.Services); - // } - // - // public async Task StartAsync() - // { - // var currentHost = await GetOrCreateHostAsync(); - // await currentHost.StartAsync(); - // return currentHost; - // } - // - // protected override async Task DoRunAsync() - // { - // var currentHost = await GetOrCreateHostAsync(); - // await currentHost.RunAsync(); - // } - // - // public async Task GetServiceProviderAsync() => (await GetOrCreateHostAsync()).Services; - - // protected override IApplicationContext GetContext(IServiceProvider serviceProvider) => GetContext( - // serviceProvider.GetRequiredService(), - // serviceProvider.GetRequiredService()); -} - -// public class HostedApplicationContext : BaseApplicationContext +// using Microsoft.Extensions.Configuration; +// using Microsoft.Extensions.Hosting; +// +// namespace Sitko.Core.App; +// +// public abstract class HostedApplication : Application // { -// private readonly IHostEnvironment environment; +// // private IHost? appHost; +// +// protected HostedApplication(string[] args) : base(args) +// { +// // Console.OutputEncoding = Encoding.UTF8; +// // var loggerConfiguration = new LoggerConfiguration(); +// // loggerConfiguration +// // .WriteTo.Console(outputTemplate: ApplicationOptions.BaseConsoleLogFormat, +// // formatProvider: CultureInfo.InvariantCulture, +// // restrictedToMinimumLevel: LogEventLevel.Debug); +// // InternalLogger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()).CreateLogger(); +// } +// +// /*protected ILogger InternalLogger { get; } +// +// protected virtual IHostBuilder CreateHostBuilderBase(string[] hostBuilderArgs) => +// Host.CreateDefaultBuilder(hostBuilderArgs); +// +// private IHostBuilder CreateHostBuilder(string[] hostBuilderArgs) +// { +// var builder = CreateHostBuilderBase(hostBuilderArgs); +// ConfigureHostBuilder(builder); +// return builder; +// } +// +// protected virtual void ConfigureHostBuilder(IHostBuilder builder) +// { +// builder.ConfigureHostConfiguration(ConfigureHostConfiguration); +// builder.ConfigureAppConfiguration(ConfigureAppConfiguration); +// } +// +// protected override void LogInternal(string message) => +// InternalLogger.LogInformation("Check log: {Message}", message);*/ // -// public HostedApplicationContext(Application application, IConfiguration configuration, IHostEnvironment environment) -// : base(application, -// configuration) => -// this.environment = environment; +// // protected IHost CreateAppHost(Action? configure = null) +// // { +// // LogInternal("Create app host start"); +// // +// // if (appHost is not null) +// // { +// // LogInternal("App host is already built"); +// // +// // return appHost; +// // } +// // +// // LogInternal("Configure host builder"); +// // +// // var hostBuilder = ConfigureHostBuilder(configure); +// // +// // LogInternal("Build host"); +// // var newHost = hostBuilder.Build(); +// // +// // appHost = newHost; +// // LogInternal("Create app host done"); +// // return appHost; +// // } // -// public override string AspNetEnvironmentName => environment.EnvironmentName; -// public override bool IsDevelopment() => environment.IsDevelopment(); +// // protected IApplicationContext GetContext(IHostEnvironment environment, IConfiguration configuration) => +// // new HostedApplicationContext(this, configuration, environment); // -// public override bool IsProduction() => environment.IsProduction(); +// // protected IHostBuilder ConfigureHostBuilder(Action? configure = null) +// // { +// // // LogInternal("Configure host builder start"); +// // // +// // // LogInternal("Create tmp host builder"); +// // // +// // // var startEnvironment = new HostingEnvironment +// // // { +// // // ApplicationName = GetType().Assembly.FullName!, EnvironmentName = EnvHelper.GetEnvironmentName() +// // // }; +// // // +// // // var configBuilder = new ConfigurationBuilder() +// // // .AddEnvironmentVariables() +// // // .AddEnvironmentVariables("DOTNET_") +// // // .AddEnvironmentVariables("ASPNETCORE_") +// // // .AddJsonFile("appsettings.json", true, false) +// // // .AddJsonFile($"appsettings.{startEnvironment.EnvironmentName}.json", true, false); +// // // var startApplicationContext = GetContext(startEnvironment, configBuilder.Build()); +// // // ConfigureConfiguration(startApplicationContext, configBuilder); +// // +// // //LogInternal("Init application"); +// // +// // //InitApplication(); +// // +// // // LogInternal("Create main host builder"); +// // // var hostBuilder = CreateHostBuilder(Args) +// // // .UseDefaultServiceProvider(options => +// // // { +// // // options.ValidateOnBuild = true; +// // // options.ValidateScopes = true; +// // // }); +// // +// // //LogInternal("Configure host builder in modules"); +// // //var bootConfiguration = configBuilder.Build(); +// // // var bootEnvironment = new HostingEnvironment +// // // { +// // // ApplicationName = bootConfiguration[HostDefaults.ApplicationKey] ?? "", +// // // EnvironmentName = bootConfiguration[HostDefaults.EnvironmentKey] ?? Environments.Production +// // // }; +// // //var bootApplicationContext = GetContext(bootEnvironment, bootConfiguration); +// // +// // // foreach (var moduleRegistration in GetEnabledModuleRegistrations(bootApplicationContext)) +// // // { +// // // moduleRegistration.ConfigureHostBuilder(bootApplicationContext, hostBuilder); +// // // } +// // +// // //LogInternal("Configure host builder"); +// // // hostBuilder.ConfigureAppConfiguration((_, builder) => +// // // { +// // // //ConfigureConfiguration(bootApplicationContext, builder); +// // // }) +// // // // .ConfigureServices((_, services) => +// // // // { +// // // // //RegisterApplicationServices(bootApplicationContext, services); +// // // // //services.AddHostedService(); +// // // // }) +// // // .ConfigureLogging((builderContext, builder) => +// // // { +// // // // LogInternal("Configure logging"); +// // // // var runtimeContext = GetContext(builderContext.HostingEnvironment, builderContext.Configuration); +// // // // LoggingExtensions.ConfigureSerilog(runtimeContext, builder, +// // // // configuration => +// // // // { +// // // // configuration = configuration.Enrich.WithMachineName(); +// // // // if (runtimeContext.Options.EnableConsoleLogging == true) +// // // // { +// // // // configuration = configuration.WriteTo.Console( +// // // // outputTemplate: runtimeContext.Options.ConsoleLogFormat, +// // // // formatProvider: CultureInfo.InvariantCulture); +// // // // } +// // // // +// // // // return ConfigureLogging(runtimeContext, configuration); +// // // // }); +// // // }); +// // //configure?.Invoke(hostBuilder); +// // //PostConfigureHostBuilder(bootApplicationContext, hostBuilder); +// // // foreach (var moduleRegistration in GetEnabledModuleRegistrations(bootApplicationContext)) +// // // { +// // // moduleRegistration.PostConfigureHostBuilder(bootApplicationContext, hostBuilder); +// // // } +// // LogInternal("Create host builder done"); +// // return hostBuilder; +// // } // -// protected override void ConfigureApplicationOptions(ApplicationOptions options) => -// options.EnableConsoleLogging ??= environment.IsDevelopment(); +// // protected virtual void PostConfigureHostBuilder(IApplicationContext applicationContext, IHostBuilder hostBuilder) +// // { +// // } +// // +// // protected override async ValueTask DisposeAsync(bool disposing) +// // { +// // await base.DisposeAsync(disposing); +// // if (disposing) +// // { +// // appHost?.Dispose(); +// // } +// // } +// +// // public async Task ExecuteAsync(Func command) +// // { +// // var currentHost = await GetOrCreateHostAsync(builder => builder.UseConsoleLifetime()); +// // +// // var serviceProvider = currentHost.Services; +// // +// // try +// // { +// // using var scope = serviceProvider.CreateScope(); +// // await command(scope.ServiceProvider); +// // } +// // catch (Exception ex) +// // { +// // var logger = serviceProvider.GetRequiredService>(); +// // logger.LogError(ex, "Error: {ErrorText}", ex.ToString()); +// // } +// // } +// +// +// //public override Task StopAsync() => CreateAppHost().StopAsync(); +// // protected override bool CanAddModule() => appHost is null; +// //public IHostBuilder GetHostBuilder() => ConfigureHostBuilder(); +// +// // protected override IApplicationContext GetContext() => appHost is not null +// // ? GetContext(appHost.Services) +// // : throw new InvalidOperationException("App host is not built yet"); +// +// // protected async Task GetOrCreateHostAsync(Action? configure = null) +// // { +// // if (appHost is not null) +// // { +// // return appHost; +// // } +// // +// // appHost = CreateAppHost(configure); +// // +// // await InitAsync(appHost.Services); +// // +// // return appHost; +// // } +// +// // protected override async Task BuildAppContextAsync() +// // { +// // var currentHost = await GetOrCreateHostAsync(); +// // return GetContext(currentHost.Services); +// // } +// // +// // public async Task StartAsync() +// // { +// // var currentHost = await GetOrCreateHostAsync(); +// // await currentHost.StartAsync(); +// // return currentHost; +// // } +// // +// // protected override async Task DoRunAsync() +// // { +// // var currentHost = await GetOrCreateHostAsync(); +// // await currentHost.RunAsync(); +// // } +// // +// // public async Task GetServiceProviderAsync() => (await GetOrCreateHostAsync()).Services; +// +// // protected override IApplicationContext GetContext(IServiceProvider serviceProvider) => GetContext( +// // serviceProvider.GetRequiredService(), +// // serviceProvider.GetRequiredService()); // } +// +// // public class HostedApplicationContext : BaseApplicationContext +// // { +// // private readonly IHostEnvironment environment; +// // +// // public HostedApplicationContext(Application application, IConfiguration configuration, IHostEnvironment environment) +// // : base(application, +// // configuration) => +// // this.environment = environment; +// // +// // public override string AspNetEnvironmentName => environment.EnvironmentName; +// // public override bool IsDevelopment() => environment.IsDevelopment(); +// // +// // public override bool IsProduction() => environment.IsProduction(); +// // +// // protected override void ConfigureApplicationOptions(ApplicationOptions options) => +// // options.EnableConsoleLogging ??= environment.IsDevelopment(); +// // } diff --git a/src/Sitko.Core.App/IApplication.cs b/src/Sitko.Core.App/IApplication.cs deleted file mode 100644 index e998bcad6..000000000 --- a/src/Sitko.Core.App/IApplication.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Sitko.Core.App; - -public interface IApplication -{ - // string Name { get; } - // string Version { get; } -} - diff --git a/src/Sitko.Core.App/IApplicationContext.cs b/src/Sitko.Core.App/IApplicationContext.cs index 49cce50be..90b908890 100644 --- a/src/Sitko.Core.App/IApplicationContext.cs +++ b/src/Sitko.Core.App/IApplicationContext.cs @@ -1,10 +1,5 @@ -using System.Globalization; -using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using Serilog; -using Serilog.Events; -using Serilog.Extensions.Logging; -using ILogger = Microsoft.Extensions.Logging.ILogger; namespace Sitko.Core.App; @@ -18,73 +13,7 @@ public interface IApplicationContext ILogger Logger { get; } string Environment { get; } string AspNetEnvironmentName { get; } + public string[] Args { get; } bool IsDevelopment(); bool IsProduction(); - public string[] Args { get; } -} - -public abstract class BaseApplicationContext : IApplicationContext -{ - private readonly Application application; - private ApplicationOptions? applicationOptions; - - protected BaseApplicationContext(Application application, IConfiguration configuration) - { - this.application = application; - Configuration = configuration; - var loggerConfiguration = new LoggerConfiguration(); - loggerConfiguration - .WriteTo.Console(outputTemplate: ApplicationOptions.BaseConsoleLogFormat, - formatProvider: CultureInfo.InvariantCulture, - restrictedToMinimumLevel: LogEventLevel.Debug); - Logger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()).CreateLogger(); - } - - public ApplicationOptions Options => GetApplicationOptions(); - - public Guid Id { get; } = Guid.NewGuid(); - public string Name => Options.Name; - public string Version => Options.Version; - public string Environment => Options.Environment; - - public IConfiguration Configuration { get; } - public ILogger Logger { get; } - public abstract string AspNetEnvironmentName { get; } - public abstract bool IsDevelopment(); - - public abstract bool IsProduction(); - public string[] Args { get; } - - private ApplicationOptions GetApplicationOptions() - { - if (applicationOptions is not null) - { - return applicationOptions; - } - - applicationOptions = new ApplicationOptions(); - Configuration.Bind(Application.OptionsKey, applicationOptions); - if (string.IsNullOrEmpty(applicationOptions.Name)) - { - applicationOptions.Name = application.GetType().Assembly.GetName().Name ?? "App"; - } - - if (string.IsNullOrEmpty(applicationOptions.Version)) - { - applicationOptions.Version = application.GetType().Assembly.GetName().Version?.ToString() ?? "dev"; - } - - if (string.IsNullOrEmpty(applicationOptions.Environment)) - { - applicationOptions.Environment = AspNetEnvironmentName; - } - - ConfigureApplicationOptions(applicationOptions); - return applicationOptions; - } - - protected virtual void ConfigureApplicationOptions(ApplicationOptions options) - { - } } - diff --git a/src/Sitko.Core.App/Localization/ApplicationExtensions.cs b/src/Sitko.Core.App/Localization/ApplicationExtensions.cs index 30aeb0c5d..f9b14debd 100644 --- a/src/Sitko.Core.App/Localization/ApplicationExtensions.cs +++ b/src/Sitko.Core.App/Localization/ApplicationExtensions.cs @@ -1,17 +1,32 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; namespace Sitko.Core.App.Localization; [PublicAPI] public static class ApplicationExtensions { - public static Application AddJsonLocalization(this Application application, + public static IHostApplicationBuilder AddJsonLocalization(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddJsonLocalization(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddJsonLocalization(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddJsonLocalization(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddJsonLocalization(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddJsonLocalization(this Application application, + public static SitkoCoreApplicationBuilder AddJsonLocalization(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.App/SitkoCoreApplicationBuilder.cs b/src/Sitko.Core.App/SitkoCoreApplicationBuilder.cs index 250a2c2cb..1921e7753 100644 --- a/src/Sitko.Core.App/SitkoCoreApplicationBuilder.cs +++ b/src/Sitko.Core.App/SitkoCoreApplicationBuilder.cs @@ -15,17 +15,16 @@ namespace Sitko.Core.App; public class SitkoCoreApplicationBuilder { + public static string OptionsKey => "Application"; protected IApplicationContext BootApplicationContext { get; } - protected IHostApplicationBuilder builder { get; } + protected IHostApplicationBuilder Builder { get; } private readonly List moduleRegistrations = new(); - private bool isBuilt; - public SitkoCoreApplicationBuilder(IHostApplicationBuilder builder, string[] args) { - this.builder = builder; + this.Builder = builder; var bootConfig = builder.Configuration.Build(); var argsProvider = new ApplicationArgsProvider(args); BootApplicationContext = new BuilderApplicationContext(bootConfig, builder.Environment, argsProvider); @@ -37,7 +36,6 @@ public SitkoCoreApplicationBuilder(IHostApplicationBuilder builder, string[] arg builder.Services.AddTransient(); builder.Services.AddFluentValidationExtensions(); builder.Services.AddTransient(typeof(ILocalizationProvider<>), typeof(LocalizationProvider<>)); - builder.Services.AddHostedService(); // только Hosted? Проверить для Wasm builder.Services.AddHostedService(); // только Hosted? Проверить для Wasm Console.OutputEncoding = Encoding.UTF8; @@ -46,21 +44,23 @@ public SitkoCoreApplicationBuilder(IHostApplicationBuilder builder, string[] arg .WriteTo.Console(outputTemplate: ApplicationOptions.BaseConsoleLogFormat, formatProvider: CultureInfo.InvariantCulture, restrictedToMinimumLevel: LogEventLevel.Debug); - InternalLogger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()).CreateLogger(); + InternalLogger = new SerilogLoggerFactory(loggerConfiguration.CreateLogger()) + .CreateLogger(); AddModule(); } - protected ILogger InternalLogger { get; } + protected ILogger InternalLogger { get; } protected Dictionary LogEventLevels { get; } = new(); protected List> LoggerConfigurationActions { get; } = new(); + // TODO: WHEN? private void ConfigureLogging() { LogInternal("Configure logging"); - LoggingExtensions.ConfigureSerilog(BootApplicationContext, builder.Logging, + LoggingExtensions.ConfigureSerilog(BootApplicationContext, Builder.Logging, configuration => { configuration = configuration.Enrich.WithMachineName(); @@ -129,7 +129,7 @@ public SitkoCoreApplicationBuilder AddModule( public bool HasModule() where TModule : IApplicationModule => moduleRegistrations.Any(r => r.Type == typeof(TModule)); - private bool CanAddModule() => !isBuilt; + private bool CanAddModule() => moduleRegistrations.Count < 100500; // TODO: still needed? private void RegisterModule( Action? configureOptions = null, @@ -155,22 +155,22 @@ private void RegisterModule( ConfigureHostBuilder(registration); } - registration.ConfigureAppConfiguration(BootApplicationContext, builder.Configuration); - registration.ConfigureOptions(BootApplicationContext, builder.Services); - registration.ConfigureServices(BootApplicationContext, builder.Services); + registration.ConfigureAppConfiguration(BootApplicationContext, Builder.Configuration); + registration.ConfigureOptions(BootApplicationContext, Builder.Services); + registration.ConfigureServices(BootApplicationContext, Builder.Services); if (typeof(TModule).IsAssignableTo(typeof(IHostBuilderModule))) { - registration.PostConfigureHostBuilder(BootApplicationContext, builder); + registration.PostConfigureHostBuilder(BootApplicationContext, Builder); } moduleRegistrations.Add(registration); - builder.Services.AddSingleton(registration); + Builder.Services.AddSingleton(registration); } protected virtual void ConfigureHostBuilder(ApplicationModuleRegistration registration) where TModule : IApplicationModule, new() where TModuleOptions : BaseModuleOptions, new() => - registration.ConfigureHostBuilder(BootApplicationContext, builder); + registration.ConfigureHostBuilder(BootApplicationContext, Builder); public SitkoCoreApplicationBuilder ConfigureLogLevel(string source, LogEventLevel level) { @@ -184,4 +184,10 @@ public SitkoCoreApplicationBuilder ConfigureLogging( LoggerConfigurationActions.Add(configure); return this; } + + public SitkoCoreApplicationBuilder ConfigureServices(Action configure) + { + configure(Builder.Services); + return this; + } } diff --git a/src/Sitko.Core.Auth.Basic/ApplicationExtensions.cs b/src/Sitko.Core.Auth.Basic/ApplicationExtensions.cs index 2660d94d1..53a676c03 100644 --- a/src/Sitko.Core.Auth.Basic/ApplicationExtensions.cs +++ b/src/Sitko.Core.Auth.Basic/ApplicationExtensions.cs @@ -1,15 +1,31 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Auth.Basic; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddBasicAuth(this Application application, + public static IHostApplicationBuilder AddBasicAuth(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddBasicAuth(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddBasicAuth(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddBasicAuth(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddBasicAuth(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddBasicAuth(this Application application, + public static SitkoCoreApplicationBuilder AddBasicAuth(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Auth.Google/ApplicationExtensions.cs b/src/Sitko.Core.Auth.Google/ApplicationExtensions.cs index e5c2ab6f8..e047e4ed7 100644 --- a/src/Sitko.Core.Auth.Google/ApplicationExtensions.cs +++ b/src/Sitko.Core.Auth.Google/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Auth.Google; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddGoogleAuth(this Application application, + public static IHostApplicationBuilder AddGoogleAuth(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGoogleAuth(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddGoogleAuth(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGoogleAuth(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddGoogleAuth(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddGoogleAuth(this Application application, + public static SitkoCoreApplicationBuilder AddGoogleAuth(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Auth.IdentityServer/ApplicationExtensions.cs b/src/Sitko.Core.Auth.IdentityServer/ApplicationExtensions.cs index 5d8d8158b..cd91bc83f 100644 --- a/src/Sitko.Core.Auth.IdentityServer/ApplicationExtensions.cs +++ b/src/Sitko.Core.Auth.IdentityServer/ApplicationExtensions.cs @@ -1,29 +1,61 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Auth.IdentityServer; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddJwtIdentityServer(this Application application, + public static IHostApplicationBuilder AddJwtIdentityServer(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddJwtIdentityServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddJwtIdentityServer(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddJwtIdentityServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddOidcIdentityServer(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddOidcIdentityServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddOidcIdentityServer(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddOidcIdentityServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddJwtIdentityServer(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application + applicationBuilder .AddModule(configure, optionsKey); - public static Application AddJwtIdentityServer(this Application application, + public static SitkoCoreApplicationBuilder AddJwtIdentityServer(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application + applicationBuilder .AddModule(configure, optionsKey); - public static Application AddOidcIdentityServer(this Application application, + public static SitkoCoreApplicationBuilder AddOidcIdentityServer(this SitkoCoreApplicationBuilder application, Action configure, string? optionsKey = null) => application.AddModule(configure, optionsKey); - public static Application AddOidcIdentityServer(this Application application, + public static SitkoCoreApplicationBuilder AddOidcIdentityServer(this SitkoCoreApplicationBuilder application, Action? configure = null, string? optionsKey = null) => application.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Automapper/ApplicationExtensions.cs b/src/Sitko.Core.Automapper/ApplicationExtensions.cs index 57a6d0853..8e14b53ac 100644 --- a/src/Sitko.Core.Automapper/ApplicationExtensions.cs +++ b/src/Sitko.Core.Automapper/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Automapper; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddAutoMapper(this Application application, + public static IHostApplicationBuilder AddAutoMapper(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddAutoMapper(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddAutoMapper(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddAutoMapper(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddAutoMapper(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddAutoMapper(this Application application, + public static SitkoCoreApplicationBuilder AddAutoMapper(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Blazor.AntDesign.Server/AntBlazorApplication.cs b/src/Sitko.Core.Blazor.AntDesign.Server/AntBlazorApplication.cs deleted file mode 100644 index 26705c290..000000000 --- a/src/Sitko.Core.Blazor.AntDesign.Server/AntBlazorApplication.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Sitko.Core.Blazor.FileUpload; -using Sitko.Core.Blazor.Server; - -namespace Sitko.Core.Blazor.AntDesign.Server; - -public class AntBlazorApplication : BlazorApplication where TStartup : AntBlazorStartup -{ - public AntBlazorApplication(string[] args) : base(args) => this.AddBlazorFileUpload(); -} diff --git a/src/Sitko.Core.Blazor.AntDesign.Server/ApplicationExtensions.cs b/src/Sitko.Core.Blazor.AntDesign.Server/ApplicationExtensions.cs new file mode 100644 index 000000000..682bc9095 --- /dev/null +++ b/src/Sitko.Core.Blazor.AntDesign.Server/ApplicationExtensions.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Microsoft.AspNetCore.Builder; +using Sitko.Core.App; +using Sitko.Core.Blazor.FileUpload; +using Sitko.Core.Blazor.Server; + +namespace Sitko.Core.Blazor.AntDesign.Server; + +[PublicAPI] +public static class ApplicationExtensions +{ + public static WebApplicationBuilder AddAntBlazorServer(this WebApplicationBuilder webApplicationBuilder) + { + webApplicationBuilder.AddSitkoCore().AddAntBlazorServer(); + return webApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder + AddAntBlazorServer(this SitkoCoreApplicationBuilder webApplicationBuilder) => + webApplicationBuilder.AddBlazorServer().AddBlazorFileUpload(); +} diff --git a/src/Sitko.Core.Blazor.FileUpload/ApplicationExtensions.cs b/src/Sitko.Core.Blazor.FileUpload/ApplicationExtensions.cs index 9cc06cd13..aa2cb34a3 100644 --- a/src/Sitko.Core.Blazor.FileUpload/ApplicationExtensions.cs +++ b/src/Sitko.Core.Blazor.FileUpload/ApplicationExtensions.cs @@ -1,10 +1,19 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Blazor.FileUpload; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddBlazorFileUpload(this Application application) => - application.AddModule(); + public static IHostApplicationBuilder AddBlazorFileUpload(this IHostApplicationBuilder hostApplicationBuilder) + { + hostApplicationBuilder.AddSitkoCore().AddBlazorFileUpload(); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddBlazorFileUpload(this SitkoCoreApplicationBuilder applicationBuilder) => + applicationBuilder.AddModule(); } diff --git a/src/Sitko.Core.Blazor.MudBlazor.Server/ApplicationExtensions.cs b/src/Sitko.Core.Blazor.MudBlazor.Server/ApplicationExtensions.cs new file mode 100644 index 000000000..e56b4c078 --- /dev/null +++ b/src/Sitko.Core.Blazor.MudBlazor.Server/ApplicationExtensions.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Microsoft.AspNetCore.Builder; +using Sitko.Core.App; +using Sitko.Core.Blazor.MudBlazorComponents; +using Sitko.Core.Blazor.Server; + +namespace Sitko.Core.Blazor.MudBlazor.Server; + +[PublicAPI] +public static class ApplicationExtensions +{ + public static WebApplicationBuilder AddMudBlazorServer(this WebApplicationBuilder webApplicationBuilder) + { + webApplicationBuilder.AddSitkoCore().AddMudBlazorServer(); + return webApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder + AddMudBlazorServer(this SitkoCoreApplicationBuilder webApplicationBuilder) => + webApplicationBuilder.AddBlazorServer().AddMudBlazor(); +} diff --git a/src/Sitko.Core.Blazor.MudBlazor.Server/MudBlazorApplication.cs b/src/Sitko.Core.Blazor.MudBlazor.Server/MudBlazorApplication.cs deleted file mode 100644 index a8d1b8a35..000000000 --- a/src/Sitko.Core.Blazor.MudBlazor.Server/MudBlazorApplication.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Sitko.Core.Blazor.MudBlazorComponents; -using Sitko.Core.Blazor.Server; - -namespace Sitko.Core.Blazor.MudBlazor.Server; - -public class MudBlazorApplication : BlazorApplication where TStartup : MudBlazorStartup -{ - public MudBlazorApplication(string[] args) : base(args) => this.AddMudBlazor(); -} diff --git a/src/Sitko.Core.Blazor.MudBlazor/ApplicationExtensions.cs b/src/Sitko.Core.Blazor.MudBlazor/ApplicationExtensions.cs index 3bee91e29..a5694728d 100644 --- a/src/Sitko.Core.Blazor.MudBlazor/ApplicationExtensions.cs +++ b/src/Sitko.Core.Blazor.MudBlazor/ApplicationExtensions.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; +using JetBrains.Annotations; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using MudBlazor.Services; using Sitko.Core.App; using Sitko.Core.App.Localization; @@ -6,10 +8,17 @@ namespace Sitko.Core.Blazor.MudBlazorComponents; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddMudBlazor(this Application application) => - application.ConfigureServices(services => + public static IHostApplicationBuilder AddMudBlazor(this IHostApplicationBuilder hostApplicationBuilder) + { + hostApplicationBuilder.AddSitkoCore().AddMudBlazor(); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddMudBlazor(this SitkoCoreApplicationBuilder applicationBuilder) => + applicationBuilder.ConfigureServices(services => { services.AddMudServices(); services.AddScoped, MudLayoutManager>(); diff --git a/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BaseLayoutComponent.cs b/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BaseLayoutComponent.cs index 2661300c6..20554d254 100644 --- a/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BaseLayoutComponent.cs +++ b/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BaseLayoutComponent.cs @@ -24,7 +24,7 @@ protected virtual MudTheme Theme case AppTheme.Dark: return new MudTheme { - Palette = new Palette + Palette = new PaletteDark { Primary = "#527cfa", Secondary = "#b20942", diff --git a/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BasicMudLayout.razor b/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BasicMudLayout.razor index b01c4c7af..3cbd37eb5 100644 --- a/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BasicMudLayout.razor +++ b/src/Sitko.Core.Blazor.MudBlazor/Components/Layout/BasicMudLayout.razor @@ -14,10 +14,10 @@ - @Application.Name + @ApplicationContext.Name - @Application.Name + @ApplicationContext.Name diff --git a/src/Sitko.Core.Blazor.Server/BlazorApplication.cs b/src/Sitko.Core.Blazor.Server/BlazorApplication.cs index daed60518..a760d5ddf 100644 --- a/src/Sitko.Core.Blazor.Server/BlazorApplication.cs +++ b/src/Sitko.Core.Blazor.Server/BlazorApplication.cs @@ -1,16 +1,27 @@ -using Sitko.Blazor.ScriptInjector; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Builder; +using Sitko.Blazor.ScriptInjector; +using Sitko.Core.App; using Sitko.Core.App.Web; namespace Sitko.Core.Blazor.Server; -public abstract class BlazorApplication : WebApplication where TStartup : BlazorStartup +[PublicAPI] +public static class ApplicationExtensions { - protected BlazorApplication(string[] args) : base(args) + public static WebApplicationBuilder AddBlazorServer(this WebApplicationBuilder webApplicationBuilder) { - this.AddPersistentState(); - ConfigureServices(collection => + webApplicationBuilder.AddSitkoCore().AddBlazorServer(); + return webApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddBlazorServer(this SitkoCoreApplicationBuilder webApplicationBuilder) + { + webApplicationBuilder.AddPersistentState(); + webApplicationBuilder.ConfigureServices(collection => { collection.AddScriptInjector(); }); + return webApplicationBuilder; } } diff --git a/src/Sitko.Core.Blazor.Wasm/WasmApplication.cs b/src/Sitko.Core.Blazor.Wasm/WasmApplication.cs index 0ca09c30d..e033113f1 100644 --- a/src/Sitko.Core.Blazor.Wasm/WasmApplication.cs +++ b/src/Sitko.Core.Blazor.Wasm/WasmApplication.cs @@ -1,149 +1,150 @@ -using System.Globalization; -using JetBrains.Annotations; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.JSInterop; -using Serilog; -using Sitko.Blazor.ScriptInjector; -using Sitko.Core.App; -using Sitko.Core.App.Localization; -using Sitko.Core.App.Logging; -using Sitko.Core.Blazor.Components; -using Sitko.Core.Blazor.Forms; - -namespace Sitko.Core.Blazor.Wasm; - -public abstract class WasmApplication : Application -{ - private WebAssemblyHost? appHost; - - protected WasmApplication(string[] args) : base(args) => this.AddPersistentState(); - - protected WebAssemblyHost CreateAppHost(Action? configure = null) - { - LogInternal("Create app host start"); - - if (appHost is not null) - { - LogInternal("App host is already built"); - - return appHost; - } - - LogInternal("Configure host builder"); - - var hostBuilder = ConfigureHostBuilder(configure); - - LogInternal("Build host"); - var newHost = hostBuilder.Build(); - - appHost = newHost; - LogInternal("Create app host done"); - return appHost; - } - - private WebAssemblyHostBuilder CreateHostBuilder(string[] hostBuilderArgs) - { - var builder = WebAssemblyHostBuilder.CreateDefault(hostBuilderArgs); - ConfigureHostBuilder(builder); - return builder; - } - - protected abstract void ConfigureHostBuilder(WebAssemblyHostBuilder builder); - - private WebAssemblyHostBuilder ConfigureHostBuilder(Action? configure = null) - { - LogInternal("Configure host builder start"); - LogInternal("Init application"); - InitApplication(); - - LogInternal("Create host builder"); - var hostBuilder = CreateHostBuilder(Args); - var tmpHost = hostBuilder.Build(); - var applicationContext = GetContext(hostBuilder.HostEnvironment, hostBuilder.Configuration); - var enabledModuleRegistrations = GetEnabledModuleRegistrations(applicationContext); - // App configuration - ConfigureConfiguration(applicationContext, hostBuilder.Configuration); - // App services - RegisterApplicationServices(applicationContext, hostBuilder.Services); - hostBuilder.Services.AddScriptInjector(); - hostBuilder.Services.AddScoped(); - hostBuilder.Services.Configure(options => - { - options.AddDefaultResource(typeof(BaseForm)); - }); - // Logging - LogInternal("Configure logging"); - LoggingExtensions.ConfigureSerilog(applicationContext, hostBuilder.Logging, - configuration => - { - configuration = configuration.WriteTo.BrowserConsole( - outputTemplate: applicationContext.Options.ConsoleLogFormat, - formatProvider: CultureInfo.InvariantCulture, - jsRuntime: tmpHost.Services.GetRequiredService()); - - return ConfigureLogging(applicationContext, configuration); - }); - - // Host builder via modules - LogInternal("Configure host builder in modules"); - foreach (var configurationModule in enabledModuleRegistrations - .Select(module => module.GetInstance()) - // ReSharper disable once SuspiciousTypeConversion.Global - .OfType()) - { - configurationModule.ConfigureHostBuilder(applicationContext, hostBuilder); - } - - // Host builder via action - LogInternal("Configure host builder"); - configure?.Invoke(hostBuilder); - LogInternal("Create host builder done"); - return hostBuilder; - } - - protected override void LogInternal(string message) => Log.Logger.Debug("Internal: {Message}", message); - - private async Task GetOrCreateHostAsync(Action? configure = null) - { - if (appHost is not null) - { - return appHost; - } - - appHost = CreateAppHost(configure); - - await InitAsync(appHost.Services); - - return appHost; - } - - protected override async Task DoRunAsync() - { - var currentHost = await GetOrCreateHostAsync(); - await currentHost.RunAsync(); - } - - protected override async Task BuildAppContextAsync() - { - var currentHost = await GetOrCreateHostAsync(); - return GetContext(currentHost.Services); - } - - public override Task StopAsync() => throw new NotImplementedException(); - protected override bool CanAddModule() => true; - - protected override IApplicationContext GetContext() => appHost is not null - ? GetContext(appHost.Services) - : throw new InvalidOperationException("App host is not built yet"); - - [PublicAPI] - protected IApplicationContext GetContext(IWebAssemblyHostEnvironment environment, - IConfiguration configuration) => - new WasmApplicationContext(this, configuration, environment); - - protected override IApplicationContext GetContext(IServiceProvider serviceProvider) => GetContext( - serviceProvider.GetRequiredService(), - serviceProvider.GetRequiredService()); -} +// TODO: DELETE +// using System.Globalization; +// using JetBrains.Annotations; +// using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +// using Microsoft.Extensions.Configuration; +// using Microsoft.Extensions.DependencyInjection; +// using Microsoft.JSInterop; +// using Serilog; +// using Sitko.Blazor.ScriptInjector; +// using Sitko.Core.App; +// using Sitko.Core.App.Localization; +// using Sitko.Core.App.Logging; +// using Sitko.Core.Blazor.Components; +// using Sitko.Core.Blazor.Forms; +// +// namespace Sitko.Core.Blazor.Wasm; +// +// public abstract class WasmApplication : Application +// { +// private WebAssemblyHost? appHost; +// +// protected WasmApplication(string[] args) : base(args) => this.AddPersistentState(); +// +// protected WebAssemblyHost CreateAppHost(Action? configure = null) +// { +// LogInternal("Create app host start"); +// +// if (appHost is not null) +// { +// LogInternal("App host is already built"); +// +// return appHost; +// } +// +// LogInternal("Configure host builder"); +// +// var hostBuilder = ConfigureHostBuilder(configure); +// +// LogInternal("Build host"); +// var newHost = hostBuilder.Build(); +// +// appHost = newHost; +// LogInternal("Create app host done"); +// return appHost; +// } +// +// private WebAssemblyHostBuilder CreateHostBuilder(string[] hostBuilderArgs) +// { +// var builder = WebAssemblyHostBuilder.CreateDefault(hostBuilderArgs); +// ConfigureHostBuilder(builder); +// return builder; +// } +// +// protected abstract void ConfigureHostBuilder(WebAssemblyHostBuilder builder); +// +// private WebAssemblyHostBuilder ConfigureHostBuilder(Action? configure = null) +// { +// LogInternal("Configure host builder start"); +// LogInternal("Init application"); +// InitApplication(); +// +// LogInternal("Create host builder"); +// var hostBuilder = CreateHostBuilder(Args); +// var tmpHost = hostBuilder.Build(); +// var applicationContext = GetContext(hostBuilder.HostEnvironment, hostBuilder.Configuration); +// var enabledModuleRegistrations = GetEnabledModuleRegistrations(applicationContext); +// // App configuration +// ConfigureConfiguration(applicationContext, hostBuilder.Configuration); +// // App services +// RegisterApplicationServices(applicationContext, hostBuilder.Services); +// hostBuilder.Services.AddScriptInjector(); +// hostBuilder.Services.AddScoped(); +// hostBuilder.Services.Configure(options => +// { +// options.AddDefaultResource(typeof(BaseForm)); +// }); +// // Logging +// LogInternal("Configure logging"); +// LoggingExtensions.ConfigureSerilog(applicationContext, hostBuilder.Logging, +// configuration => +// { +// configuration = configuration.WriteTo.BrowserConsole( +// outputTemplate: applicationContext.Options.ConsoleLogFormat, +// formatProvider: CultureInfo.InvariantCulture, +// jsRuntime: tmpHost.Services.GetRequiredService()); +// +// return ConfigureLogging(applicationContext, configuration); +// }); +// +// // Host builder via modules +// LogInternal("Configure host builder in modules"); +// foreach (var configurationModule in enabledModuleRegistrations +// .Select(module => module.GetInstance()) +// // ReSharper disable once SuspiciousTypeConversion.Global +// .OfType()) +// { +// configurationModule.ConfigureHostBuilder(applicationContext, hostBuilder); +// } +// +// // Host builder via action +// LogInternal("Configure host builder"); +// configure?.Invoke(hostBuilder); +// LogInternal("Create host builder done"); +// return hostBuilder; +// } +// +// protected override void LogInternal(string message) => Log.Logger.Debug("Internal: {Message}", message); +// +// private async Task GetOrCreateHostAsync(Action? configure = null) +// { +// if (appHost is not null) +// { +// return appHost; +// } +// +// appHost = CreateAppHost(configure); +// +// await InitAsync(appHost.Services); +// +// return appHost; +// } +// +// protected override async Task DoRunAsync() +// { +// var currentHost = await GetOrCreateHostAsync(); +// await currentHost.RunAsync(); +// } +// +// protected override async Task BuildAppContextAsync() +// { +// var currentHost = await GetOrCreateHostAsync(); +// return GetContext(currentHost.Services); +// } +// +// public override Task StopAsync() => throw new NotImplementedException(); +// protected override bool CanAddModule() => true; +// +// protected override IApplicationContext GetContext() => appHost is not null +// ? GetContext(appHost.Services) +// : throw new InvalidOperationException("App host is not built yet"); +// +// [PublicAPI] +// protected IApplicationContext GetContext(IWebAssemblyHostEnvironment environment, +// IConfiguration configuration) => +// new WasmApplicationContext(this, configuration, environment); +// +// protected override IApplicationContext GetContext(IServiceProvider serviceProvider) => GetContext( +// serviceProvider.GetRequiredService(), +// serviceProvider.GetRequiredService()); +// } diff --git a/src/Sitko.Core.Blazor.Wasm/WasmApplicationContext.cs b/src/Sitko.Core.Blazor.Wasm/WasmApplicationContext.cs index a0ff0e3f3..1b357e4b4 100644 --- a/src/Sitko.Core.Blazor.Wasm/WasmApplicationContext.cs +++ b/src/Sitko.Core.Blazor.Wasm/WasmApplicationContext.cs @@ -1,21 +1,22 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using Microsoft.Extensions.Configuration; -using Sitko.Core.App; - -namespace Sitko.Core.Blazor.Wasm; - -public class WasmApplicationContext : BaseApplicationContext -{ - private readonly IWebAssemblyHostEnvironment environment; - - public WasmApplicationContext(Application application, IConfiguration configuration, - IWebAssemblyHostEnvironment environment) - : base(application, configuration) => - this.environment = environment; - - public override string AspNetEnvironmentName => environment.Environment; - public override bool IsDevelopment() => environment.IsDevelopment(); - - public override bool IsProduction() => environment.IsProduction(); -} - +// TODO: DELETE +// using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +// using Microsoft.Extensions.Configuration; +// using Sitko.Core.App; +// +// namespace Sitko.Core.Blazor.Wasm; +// +// public class WasmApplicationContext : BaseApplicationContext +// { +// private readonly IWebAssemblyHostEnvironment environment; +// +// public WasmApplicationContext(Application application, IConfiguration configuration, +// IWebAssemblyHostEnvironment environment) +// : base(application, configuration) => +// this.environment = environment; +// +// public override string AspNetEnvironmentName => environment.Environment; +// public override bool IsDevelopment() => environment.IsDevelopment(); +// +// public override bool IsProduction() => environment.IsProduction(); +// } +// diff --git a/src/Sitko.Core.Blazor/ApplicationExtensions.cs b/src/Sitko.Core.Blazor/ApplicationExtensions.cs index f6a822c67..013578070 100644 --- a/src/Sitko.Core.Blazor/ApplicationExtensions.cs +++ b/src/Sitko.Core.Blazor/ApplicationExtensions.cs @@ -1,17 +1,33 @@ +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Blazor.Components; namespace Sitko.Core.Blazor; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddPersistentState(this Application application) + public static IHostApplicationBuilder AddPersistentState( + this IHostApplicationBuilder hostApplicationBuilder) + where TCompressor : class, IStateCompressor + where TComponentState : class, ICompressedPersistentComponentState + { + hostApplicationBuilder.AddSitkoCore().AddPersistentState(); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddPersistentState(this IHostApplicationBuilder hostApplicationBuilder) => + AddPersistentState(hostApplicationBuilder); + + public static SitkoCoreApplicationBuilder AddPersistentState( + this SitkoCoreApplicationBuilder applicationBuilder) where TCompressor : class, IStateCompressor where TComponentState : class, ICompressedPersistentComponentState => - application.ConfigureServices(collection => collection.AddScoped() + applicationBuilder.ConfigureServices(collection => collection.AddScoped() .AddScoped()); - public static Application AddPersistentState(this Application application) => - AddPersistentState(application); + public static SitkoCoreApplicationBuilder AddPersistentState(this SitkoCoreApplicationBuilder applicationBuilder) => + AddPersistentState(applicationBuilder); } diff --git a/src/Sitko.Core.Blazor/Layout/BaseLayoutComponent.cs b/src/Sitko.Core.Blazor/Layout/BaseLayoutComponent.cs index 868d54796..96a540264 100644 --- a/src/Sitko.Core.Blazor/Layout/BaseLayoutComponent.cs +++ b/src/Sitko.Core.Blazor/Layout/BaseLayoutComponent.cs @@ -12,7 +12,7 @@ public abstract class BaseLayoutComponent : BaseCom protected string Description { get; set; } = ""; protected virtual string PageTitleSeparator => "/"; [Inject] protected ILayoutManager LayoutManager { get; set; } = null!; - [Inject] protected IApplication Application { get; set; } = null!; + [Inject] protected IApplicationContext ApplicationContext { get; set; } = null!; [EditorRequired] [Parameter] public RenderFragment ChildContent { get; set; } = null!; @@ -27,7 +27,7 @@ private void LayoutDataChanged(TLayoutData layoutData) { Title = layoutData.Title; Description = layoutData.Description; - var prefix = $" {PageTitleSeparator} {Application.Name}"; + var prefix = $" {PageTitleSeparator} {ApplicationContext.Name}"; if (!string.IsNullOrEmpty(LayoutManager.LayoutOptions.PageTitlePostfix)) { prefix = LayoutManager.LayoutOptions.PageTitlePostfix; diff --git a/src/Sitko.Core.Configuration.Vault/ApplicationExtensions.cs b/src/Sitko.Core.Configuration.Vault/ApplicationExtensions.cs index 59c9e63b1..3143b0f26 100644 --- a/src/Sitko.Core.Configuration.Vault/ApplicationExtensions.cs +++ b/src/Sitko.Core.Configuration.Vault/ApplicationExtensions.cs @@ -1,18 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Configuration.Vault; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddVaultConfiguration(this Application application, + public static IHostApplicationBuilder AddVaultConfiguration(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddVaultConfiguration(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddVaultConfiguration(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddVaultConfiguration(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddVaultConfiguration(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddVaultConfiguration(this Application application, + public static SitkoCoreApplicationBuilder AddVaultConfiguration(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Consul.Web/ApplicationExtensions.cs b/src/Sitko.Core.Consul.Web/ApplicationExtensions.cs index 4a6f271b1..93b2adacd 100644 --- a/src/Sitko.Core.Consul.Web/ApplicationExtensions.cs +++ b/src/Sitko.Core.Consul.Web/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Consul.Web; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddConsulWeb(this Application application, + public static IHostApplicationBuilder AddConsulWeb(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsulWeb(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddConsulWeb(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsulWeb(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddConsulWeb(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddConsulWeb(this Application application, + public static SitkoCoreApplicationBuilder AddConsulWeb(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Consul/ApplicationExtensions.cs b/src/Sitko.Core.Consul/ApplicationExtensions.cs index 8fec6f42f..cf851a6a6 100644 --- a/src/Sitko.Core.Consul/ApplicationExtensions.cs +++ b/src/Sitko.Core.Consul/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Consul; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddConsul(this Application application, + public static IHostApplicationBuilder AddConsul(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsul(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddConsul(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsul(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddConsul(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddConsul(this Application application, + public static SitkoCoreApplicationBuilder AddConsul(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Db.InMemory/ApplicationExtensions.cs b/src/Sitko.Core.Db.InMemory/ApplicationExtensions.cs index 3fb636079..9ecf757b7 100644 --- a/src/Sitko.Core.Db.InMemory/ApplicationExtensions.cs +++ b/src/Sitko.Core.Db.InMemory/ApplicationExtensions.cs @@ -1,24 +1,48 @@ -using Microsoft.EntityFrameworkCore; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Db.InMemory; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddInMemoryDatabase(this Application application, + public static IHostApplicationBuilder AddInMemoryDatabase( + this IHostApplicationBuilder hostApplicationBuilder, + Action> configure, + string? optionsKey = null) + where TDbContext : DbContext + { + hostApplicationBuilder.AddSitkoCore().AddInMemoryDatabase(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddInMemoryDatabase( + this IHostApplicationBuilder hostApplicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TDbContext : DbContext + { + hostApplicationBuilder.AddSitkoCore().AddInMemoryDatabase(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddInMemoryDatabase( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TDbContext : DbContext => - application + applicationBuilder .AddModule, InMemoryDatabaseModuleOptions>(configure, optionsKey); - public static Application AddInMemoryDatabase(this Application application, + public static SitkoCoreApplicationBuilder AddInMemoryDatabase( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TDbContext : DbContext => - application + applicationBuilder .AddModule, InMemoryDatabaseModuleOptions>(configure, optionsKey); } - diff --git a/src/Sitko.Core.Db.Postgres/ApplicationExtensions.cs b/src/Sitko.Core.Db.Postgres/ApplicationExtensions.cs index 5bc5ea0ac..bc06dd40c 100644 --- a/src/Sitko.Core.Db.Postgres/ApplicationExtensions.cs +++ b/src/Sitko.Core.Db.Postgres/ApplicationExtensions.cs @@ -1,24 +1,48 @@ -using Microsoft.EntityFrameworkCore; +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Db.Postgres; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddPostgresDatabase(this Application application, + public static IHostApplicationBuilder AddPostgresDatabase( + this IHostApplicationBuilder applicationBuilder, + Action> configure, + string? optionsKey = null) + where TDbContext : DbContext + { + applicationBuilder.AddSitkoCore().AddPostgresDatabase(configure, optionsKey); + return applicationBuilder; + } + + public static IHostApplicationBuilder AddPostgresDatabase( + this IHostApplicationBuilder applicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TDbContext : DbContext + { + applicationBuilder.AddSitkoCore().AddPostgresDatabase(configure, optionsKey); + return applicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddPostgresDatabase( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TDbContext : DbContext => - application + applicationBuilder .AddModule, PostgresDatabaseModuleOptions>(configure, optionsKey); - public static Application AddPostgresDatabase(this Application application, + public static SitkoCoreApplicationBuilder AddPostgresDatabase( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TDbContext : DbContext => - application + applicationBuilder .AddModule, PostgresDatabaseModuleOptions>(configure, optionsKey); } - diff --git a/src/Sitko.Core.ElasticStack/ApplicationExtensions.cs b/src/Sitko.Core.ElasticStack/ApplicationExtensions.cs index 352fc7d98..2a7aa12ae 100644 --- a/src/Sitko.Core.ElasticStack/ApplicationExtensions.cs +++ b/src/Sitko.Core.ElasticStack/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.ElasticStack; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddElasticStack(this Application application, + public static IHostApplicationBuilder AddElasticStack(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddElasticStack(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddElasticStack(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddElasticStack(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddElasticStack(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddElasticStack(this Application application, + public static SitkoCoreApplicationBuilder AddElasticStack(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.ElasticStack/ElasticStackModule.cs b/src/Sitko.Core.ElasticStack/ElasticStackModule.cs index d82c0e577..24e155ca4 100644 --- a/src/Sitko.Core.ElasticStack/ElasticStackModule.cs +++ b/src/Sitko.Core.ElasticStack/ElasticStackModule.cs @@ -2,18 +2,24 @@ using Elastic.Apm.NetCoreAll; using Elastic.Apm.SerilogEnricher; using Elastic.CommonSchema.Serilog; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Hosting; using Serilog; using Serilog.Events; using Serilog.Sinks.Elasticsearch; using Sitko.Core.App; +using Sitko.Core.App.Web; namespace Sitko.Core.ElasticStack; public class ElasticStackModule : BaseApplicationModule, - IHostBuilderModule, ILoggingModule + IHostBuilderModule, ILoggingModule, + IWebApplicationModule { - public void ConfigureHostBuilder(IApplicationContext context, IHostBuilder hostBuilder, + public override string OptionsKey => "ElasticApm"; + + public void ConfigureHostBuilder(IApplicationContext context, IHostApplicationBuilder hostBuilder, ElasticStackModuleOptions startupOptions) { if (startupOptions.ApmEnabled) @@ -28,13 +34,13 @@ public void ConfigureHostBuilder(IApplicationContext context, IHostBuilder hostB startupOptions.ApmCentralConfig.ToString(CultureInfo.InvariantCulture)); Environment.SetEnvironmentVariable("ElasticApm:SanitizeFieldNames", startupOptions.ApmCentralConfig.ToString(CultureInfo.InvariantCulture)); - if (startupOptions.ApmSanitizeFieldNames != null && startupOptions.ApmSanitizeFieldNames.Any()) + if (startupOptions.ApmSanitizeFieldNames != null && startupOptions.ApmSanitizeFieldNames.Count != 0) { Environment.SetEnvironmentVariable("ElasticApm:SanitizeFieldNames", string.Join(", ", startupOptions.ApmSanitizeFieldNames)); } - if (startupOptions.ApmGlobalLabels.Any()) + if (startupOptions.ApmGlobalLabels.Count != 0) { Environment.SetEnvironmentVariable("ElasticApm:GlobalLabels", string.Join(",", startupOptions.ApmGlobalLabels.Select(kv => $"{kv.Key}={kv.Value}"))); @@ -55,7 +61,7 @@ public void ConfigureHostBuilder(IApplicationContext context, IHostBuilder hostB startupOptions.ApmMaxQueueEventCount.ToString(CultureInfo.InvariantCulture)); Environment.SetEnvironmentVariable("ElasticApm:MetricsInterval", $"{TimeSpan.FromSeconds(startupOptions.ApmMetricsIntervalInSeconds).TotalSeconds}s"); - if (startupOptions.ApmDisableMetrics != null && startupOptions.ApmDisableMetrics.Any()) + if (startupOptions.ApmDisableMetrics != null && startupOptions.ApmDisableMetrics.Count != 0) { Environment.SetEnvironmentVariable("ElasticApm:DisableMetrics", string.Join(",", startupOptions.ApmDisableMetrics)); @@ -63,7 +69,7 @@ public void ConfigureHostBuilder(IApplicationContext context, IHostBuilder hostB Environment.SetEnvironmentVariable("ElasticApm:CaptureBody", startupOptions.ApmCaptureBody); if (startupOptions.ApmCaptureBodyContentTypes != null && - startupOptions.ApmCaptureBodyContentTypes.Any()) + startupOptions.ApmCaptureBodyContentTypes.Count != 0) { Environment.SetEnvironmentVariable("ElasticApm:CaptureBodyContentTypes", string.Join(",", startupOptions.ApmCaptureBodyContentTypes)); @@ -78,12 +84,9 @@ public void ConfigureHostBuilder(IApplicationContext context, IHostBuilder hostB Environment.SetEnvironmentVariable("ElasticApm:SpanFramesMinDuration", $"{TimeSpan.FromSeconds(startupOptions.ApmSpanFramesMinDurationInSeconds).TotalMilliseconds}ms"); Environment.SetEnvironmentVariable("ElasticApm:ApmLogLevel", startupOptions.ApmLogLevel); - hostBuilder.UseAllElasticApm(); } } - public override string OptionsKey => "ElasticApm"; - public LoggerConfiguration ConfigureLogging(IApplicationContext context, ElasticStackModuleOptions options, LoggerConfiguration loggerConfiguration) { @@ -134,4 +137,14 @@ public LoggerConfiguration ConfigureLogging(IApplicationContext context, Elastic return loggerConfiguration; } + + public void ConfigureEndpoints(IApplicationContext applicationContext, + IApplicationBuilder appBuilder, IEndpointRouteBuilder endpoints) + { + var options = GetOptions(appBuilder.ApplicationServices); + if (options.ApmEnabled) + { + appBuilder.UseAllElasticApm(); + } + } } diff --git a/src/Sitko.Core.Email.MailGun/ApplicationExtensions.cs b/src/Sitko.Core.Email.MailGun/ApplicationExtensions.cs index b07613df7..56632e49c 100644 --- a/src/Sitko.Core.Email.MailGun/ApplicationExtensions.cs +++ b/src/Sitko.Core.Email.MailGun/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Email.MailGun; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddMailGunEmail(this Application application, + public static IHostApplicationBuilder AddMailGunEmail(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddMailGunEmail(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddMailGunEmail(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddMailGunEmail(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddMailGunEmail(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddMailGunEmail(this Application application, + public static SitkoCoreApplicationBuilder AddMailGunEmail(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Email.Smtp/ApplicationExtensions.cs b/src/Sitko.Core.Email.Smtp/ApplicationExtensions.cs index 4a2d2422e..20a24eabc 100644 --- a/src/Sitko.Core.Email.Smtp/ApplicationExtensions.cs +++ b/src/Sitko.Core.Email.Smtp/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Email.Smtp; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddSmtpEmail(this Application application, + public static IHostApplicationBuilder AddSmtpEmail(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSmtpEmail(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddSmtpEmail(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSmtpEmail(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddSmtpEmail(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddSmtpEmail(this Application application, + public static SitkoCoreApplicationBuilder AddSmtpEmail(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Graylog/ApplicationExtensions.cs b/src/Sitko.Core.Graylog/ApplicationExtensions.cs index 7b951d9aa..fb830a5d8 100644 --- a/src/Sitko.Core.Graylog/ApplicationExtensions.cs +++ b/src/Sitko.Core.Graylog/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Graylog; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddGraylog(this Application application, + public static IHostApplicationBuilder AddGraylog(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGraylog(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddGraylog(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGraylog(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddGraylog(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddGraylog(this Application application, + public static SitkoCoreApplicationBuilder AddGraylog(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Grpc.Client.Consul/ApplicationExtensions.cs b/src/Sitko.Core.Grpc.Client.Consul/ApplicationExtensions.cs index 2d040c57f..74d7aab46 100644 --- a/src/Sitko.Core.Grpc.Client.Consul/ApplicationExtensions.cs +++ b/src/Sitko.Core.Grpc.Client.Consul/ApplicationExtensions.cs @@ -1,5 +1,6 @@ using Grpc.Core; using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Grpc.Client.Consul; @@ -7,18 +8,37 @@ namespace Sitko.Core.Grpc.Client.Consul; [PublicAPI] public static class ApplicationExtensions { - public static Application AddConsulGrpcClient(this Application application, + public static IHostApplicationBuilder AddConsulGrpcClient(this IHostApplicationBuilder applicationBuilder, + Action> configure, + string? optionsKey = null) + where TClient : ClientBase + { + applicationBuilder.AddSitkoCore().AddConsulGrpcClient(configure, optionsKey); + return applicationBuilder; + } + + public static IHostApplicationBuilder AddConsulGrpcClient(this IHostApplicationBuilder applicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TClient : ClientBase + { + applicationBuilder.AddSitkoCore().AddConsulGrpcClient(configure, optionsKey); + return applicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddConsulGrpcClient( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TClient : ClientBase => - application.AddModule, ConsulGrpcClientModuleOptions>(configure, + applicationBuilder.AddModule, ConsulGrpcClientModuleOptions>(configure, optionsKey); - public static Application AddConsulGrpcClient(this Application application, + public static SitkoCoreApplicationBuilder AddConsulGrpcClient( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TClient : ClientBase => - application.AddModule, ConsulGrpcClientModuleOptions>(configure, + applicationBuilder.AddModule, ConsulGrpcClientModuleOptions>(configure, optionsKey); } - diff --git a/src/Sitko.Core.Grpc.Client.Web/ApplicationExtensions.cs b/src/Sitko.Core.Grpc.Client.Web/ApplicationExtensions.cs index 82b185b0d..dd2481dd8 100644 --- a/src/Sitko.Core.Grpc.Client.Web/ApplicationExtensions.cs +++ b/src/Sitko.Core.Grpc.Client.Web/ApplicationExtensions.cs @@ -1,6 +1,7 @@ using Grpc.Core; using Grpc.Net.Client.Web; using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Grpc.Client.External; @@ -9,11 +10,30 @@ namespace Sitko.Core.Grpc.Client.Web; [PublicAPI] public static class ApplicationExtensions { - public static Application AddGrpcWebClient(this Application application, + public static IHostApplicationBuilder AddGrpcWebClient(this IHostApplicationBuilder hostApplicationBuilder, + Action> configure, + string? optionsKey = null) + where TClient : ClientBase + { + hostApplicationBuilder.AddSitkoCore().AddGrpcWebClient(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddGrpcWebClient(this IHostApplicationBuilder hostApplicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TClient : ClientBase + { + hostApplicationBuilder.AddSitkoCore().AddGrpcWebClient(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddGrpcWebClient( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TClient : ClientBase => - application.AddModule, ExternalGrpcClientModuleOptions>( + applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>( (context, options) => { options.ConfigureHttpHandler = handler => new GrpcWebHandler(handler); @@ -21,15 +41,16 @@ public static Application AddGrpcWebClient(this Application application }, optionsKey); - public static Application AddGrpcWebClient(this Application application, + public static SitkoCoreApplicationBuilder AddGrpcWebClient( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TClient : ClientBase => - application.AddModule, ExternalGrpcClientModuleOptions>(options => + applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>( + options => { options.ConfigureHttpHandler = handler => new GrpcWebHandler(handler); configure?.Invoke(options); }, optionsKey); } - diff --git a/src/Sitko.Core.Grpc.Client/ApplicationExtensions.cs b/src/Sitko.Core.Grpc.Client/ApplicationExtensions.cs index a7ef473f7..4ee076ce8 100644 --- a/src/Sitko.Core.Grpc.Client/ApplicationExtensions.cs +++ b/src/Sitko.Core.Grpc.Client/ApplicationExtensions.cs @@ -1,5 +1,6 @@ using Grpc.Core; using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Grpc.Client.External; @@ -8,50 +9,24 @@ namespace Sitko.Core.Grpc.Client; [PublicAPI] public static class ApplicationExtensions { - public static Application AddExternalGrpcClient(this Application application, + public static IHostApplicationBuilder AddExternalGrpcClient( + this IHostApplicationBuilder hostApplicationBuilder, Action> configure, string? optionsKey = null) - where TClient : ClientBase => - application.AddModule, ExternalGrpcClientModuleOptions>(configure, - optionsKey); - - public static Application AddExternalGrpcClient(this Application application, - Action>? configure = null, - string? optionsKey = null) - where TClient : ClientBase => - application.AddModule, ExternalGrpcClientModuleOptions>(configure, - optionsKey); - - public static TApplication AddExternalGrpcClient(this TApplication application, - string address, - Action>? configure = null) - where TApplication : Application where TClient : ClientBase => - application.AddExternalGrpcClient(new Uri(address), configure); - - public static TApplication AddExternalGrpcClient(this TApplication application, - Uri address, - Action>? configure = null) - where TApplication : Application where TClient : ClientBase + where TClient : ClientBase { - application.AddExternalGrpcClient(moduleOptions => - { - moduleOptions.Address = address; - configure?.Invoke(moduleOptions); - }); - return application; + hostApplicationBuilder.AddSitkoCore().AddExternalGrpcClient(configure, optionsKey); + return hostApplicationBuilder; } - public static TApplication AddExternalGrpcClient(this TApplication application, - Func getAddress, - Action>? configure = null) - where TApplication : Application where TClient : ClientBase + public static IHostApplicationBuilder AddExternalGrpcClient( + this IHostApplicationBuilder hostApplicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TClient : ClientBase { - application.AddExternalGrpcClient((applicationContext, moduleOptions) => - { - moduleOptions.Address = getAddress(applicationContext); - configure?.Invoke(moduleOptions); - }); - return application; + hostApplicationBuilder.AddSitkoCore().AddExternalGrpcClient(configure, optionsKey); + return hostApplicationBuilder; } public static SitkoCoreApplicationBuilder AddExternalGrpcClient( @@ -59,7 +34,8 @@ public static SitkoCoreApplicationBuilder AddExternalGrpcClient( Action> configure, string? optionsKey = null) where TClient : ClientBase => - applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>(configure, + applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>( + configure, optionsKey); public static SitkoCoreApplicationBuilder AddExternalGrpcClient( @@ -67,6 +43,7 @@ public static SitkoCoreApplicationBuilder AddExternalGrpcClient( Action>? configure = null, string? optionsKey = null) where TClient : ClientBase => - applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>(configure, + applicationBuilder.AddModule, ExternalGrpcClientModuleOptions>( + configure, optionsKey); } diff --git a/src/Sitko.Core.Grpc.Server.Consul/ApplicationExtensions.cs b/src/Sitko.Core.Grpc.Server.Consul/ApplicationExtensions.cs index d015a7e13..614d2a0ca 100644 --- a/src/Sitko.Core.Grpc.Server.Consul/ApplicationExtensions.cs +++ b/src/Sitko.Core.Grpc.Server.Consul/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Grpc.Server.Consul; @@ -6,16 +7,31 @@ namespace Sitko.Core.Grpc.Server.Consul; [PublicAPI] public static class ApplicationExtensions { - public static Application AddConsulGrpcServer(this Application application, + public static IHostApplicationBuilder AddConsulGrpcServer(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsulGrpcServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddConsulGrpcServer(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddConsulGrpcServer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddConsulGrpcServer(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule( + applicationBuilder.AddModule( configure, optionsKey); - public static Application AddConsulGrpcServer(this Application application, + public static SitkoCoreApplicationBuilder AddConsulGrpcServer(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule( + applicationBuilder.AddModule( configure, optionsKey); } - diff --git a/src/Sitko.Core.Grpc.Server/ApplicationExtensions.cs b/src/Sitko.Core.Grpc.Server/ApplicationExtensions.cs index a6af36ca1..d519245c6 100644 --- a/src/Sitko.Core.Grpc.Server/ApplicationExtensions.cs +++ b/src/Sitko.Core.Grpc.Server/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Grpc.Server; @@ -6,15 +7,21 @@ namespace Sitko.Core.Grpc.Server; [PublicAPI] public static class ApplicationExtensions { - public static Application AddGrpcServer(this Application application, + public static IHostApplicationBuilder AddGrpcServer(this IHostApplicationBuilder hostApplicationBuilder, Action configure, - string? optionsKey = null) => - application.AddModule(configure, optionsKey); + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGrpcServer(configure, optionsKey); + return hostApplicationBuilder; + } - public static Application AddGrpcServer(this Application application, + public static IHostApplicationBuilder AddGrpcServer(this IHostApplicationBuilder hostApplicationBuilder, Action? configure = null, - string? optionsKey = null) => - application.AddModule(configure, optionsKey); + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddGrpcServer(configure, optionsKey); + return hostApplicationBuilder; + } public static SitkoCoreApplicationBuilder AddGrpcServer(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, @@ -26,4 +33,3 @@ public static SitkoCoreApplicationBuilder AddGrpcServer(this SitkoCoreApplicatio string? optionsKey = null) => applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Grpc.Server/BaseGrpcServerModule.cs b/src/Sitko.Core.Grpc.Server/BaseGrpcServerModule.cs index dcc557fdd..db71b020b 100644 --- a/src/Sitko.Core.Grpc.Server/BaseGrpcServerModule.cs +++ b/src/Sitko.Core.Grpc.Server/BaseGrpcServerModule.cs @@ -47,7 +47,7 @@ public override void ConfigureServices(IApplicationContext applicationContext, I } } - public void ConfigureWebHost(IApplicationContext context, ConfigureWebHostBuilder webHostBuilder, + public void ConfigureWebHost(IApplicationContext applicationContext, ConfigureWebHostBuilder webHostBuilder, TConfig options) => options.ConfigureWebHostDefaults?.Invoke(webHostBuilder); diff --git a/src/Sitko.Core.HangFire/ApplicationExtensions.cs b/src/Sitko.Core.HangFire/ApplicationExtensions.cs index e99890664..8ea9b995e 100644 --- a/src/Sitko.Core.HangFire/ApplicationExtensions.cs +++ b/src/Sitko.Core.HangFire/ApplicationExtensions.cs @@ -1,19 +1,37 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.HangFire; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddHangfirePostgres(this Application application, + public static IHostApplicationBuilder AddHangfirePostgres(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddHangfirePostgres(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddHangfirePostgres(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddHangfirePostgres(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddHangfirePostgres(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule, HangfirePostgresModuleOptions>( + applicationBuilder.AddModule, HangfirePostgresModuleOptions>( configure, optionsKey); - public static Application AddHangfirePostgres(this Application application, + public static SitkoCoreApplicationBuilder AddHangfirePostgres(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule, HangfirePostgresModuleOptions>( + applicationBuilder.AddModule, HangfirePostgresModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.HangFire/HangfireModule.cs b/src/Sitko.Core.HangFire/HangfireModule.cs index ba62df412..0875feaea 100644 --- a/src/Sitko.Core.HangFire/HangfireModule.cs +++ b/src/Sitko.Core.HangFire/HangfireModule.cs @@ -1,6 +1,7 @@ using System.Text.Json.Serialization; using Hangfire; using Hangfire.PostgreSql; +using Hangfire.PostgreSql.Factories; using HealthChecks.Hangfire; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -101,16 +102,18 @@ public class HangfirePostgresModuleOptions : HangfireModuleOptions public HangfirePostgresModuleOptions() => ConfigureHangfire = configuration => { - configuration.UsePostgreSqlStorage(ConnectionString, - new PostgreSqlStorageOptions - { - InvisibilityTimeout = TimeSpan.FromMinutes(InvisibilityTimeoutInMinutes), - DistributedLockTimeout = TimeSpan.FromMinutes(DistributedLockTimeoutInMinutes) - }); + configuration.UsePostgreSqlStorage(options => + { + options.UseConnectionFactory(new NpgsqlConnectionFactory(ConnectionString, + new PostgreSqlStorageOptions + { + InvisibilityTimeout = TimeSpan.FromMinutes(InvisibilityTimeoutInMinutes), + DistributedLockTimeout = TimeSpan.FromMinutes(DistributedLockTimeoutInMinutes) + })); + }); }; public string ConnectionString { get; set; } = string.Empty; public int InvisibilityTimeoutInMinutes { get; set; } = 300; public int DistributedLockTimeoutInMinutes { get; set; } = 300; } - diff --git a/src/Sitko.Core.Health.Teams/ApplicationExtensions.cs b/src/Sitko.Core.Health.Teams/ApplicationExtensions.cs index 2488b0f00..d51b106e0 100644 --- a/src/Sitko.Core.Health.Teams/ApplicationExtensions.cs +++ b/src/Sitko.Core.Health.Teams/ApplicationExtensions.cs @@ -1,18 +1,37 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Health.Teams; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddTeamsHealthReporter(this Application application, + public static IHostApplicationBuilder AddTeamsHealthReporter(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddTeamsHealthReporter(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddTeamsHealthReporter(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddTeamsHealthReporter(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddTeamsHealthReporter( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddTeamsHealthReporter(this Application application, + public static SitkoCoreApplicationBuilder AddTeamsHealthReporter( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Health.Telegram/ApplicationExtensions.cs b/src/Sitko.Core.Health.Telegram/ApplicationExtensions.cs index b9bfe6548..095aee66d 100644 --- a/src/Sitko.Core.Health.Telegram/ApplicationExtensions.cs +++ b/src/Sitko.Core.Health.Telegram/ApplicationExtensions.cs @@ -1,19 +1,39 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Health.Telegram; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddTelegramHealthReporter(this Application application, + public static IHostApplicationBuilder AddTelegramHealthReporter(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddTelegramHealthReporter(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddTelegramHealthReporter(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddTelegramHealthReporter(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddTelegramHealthReporter( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddTelegramHealthReporter(this Application application, + public static SitkoCoreApplicationBuilder AddTelegramHealthReporter( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.IdProvider.SonyFlake/ApplicationExtensions.cs b/src/Sitko.Core.IdProvider.SonyFlake/ApplicationExtensions.cs index 7c13b11ae..84a44b998 100644 --- a/src/Sitko.Core.IdProvider.SonyFlake/ApplicationExtensions.cs +++ b/src/Sitko.Core.IdProvider.SonyFlake/ApplicationExtensions.cs @@ -1,19 +1,39 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.IdProvider.SonyFlake; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddSonyFlakeIdProvider(this Application application, + public static IHostApplicationBuilder AddSonyFlakeIdProvider(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSonyFlakeIdProvider(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddSonyFlakeIdProvider(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSonyFlakeIdProvider(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddSonyFlakeIdProvider( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddSonyFlakeIdProvider(this Application application, + public static SitkoCoreApplicationBuilder AddSonyFlakeIdProvider( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Identity/ApplicationExtensions.cs b/src/Sitko.Core.Identity/ApplicationExtensions.cs index d997f74ff..bb3c809b5 100644 --- a/src/Sitko.Core.Identity/ApplicationExtensions.cs +++ b/src/Sitko.Core.Identity/ApplicationExtensions.cs @@ -1,27 +1,55 @@ -using Microsoft.AspNetCore.Identity; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Identity; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddIdentity(this Application application, + public static IHostApplicationBuilder AddIdentity( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + where TUser : IdentityUser + where TRole : IdentityRole + where TPk : IEquatable + where TDbContext : IdentityDbContext + { + hostApplicationBuilder.AddSitkoCore().AddIdentity(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddIdentity( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + where TUser : IdentityUser + where TRole : IdentityRole + where TPk : IEquatable + where TDbContext : IdentityDbContext + { + hostApplicationBuilder.AddSitkoCore().AddIdentity(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddIdentity( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) where TUser : IdentityUser where TRole : IdentityRole where TPk : IEquatable where TDbContext : IdentityDbContext => - application.AddModule, IdentityModuleOptions>( + applicationBuilder.AddModule, IdentityModuleOptions>( configure, optionsKey); - public static Application AddIdentity(this Application application, + public static SitkoCoreApplicationBuilder AddIdentity( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) where TUser : IdentityUser where TRole : IdentityRole where TPk : IEquatable where TDbContext : IdentityDbContext => - application.AddModule, IdentityModuleOptions>( + applicationBuilder.AddModule, IdentityModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.ImgProxy/ApplicationExtensions.cs b/src/Sitko.Core.ImgProxy/ApplicationExtensions.cs index 9a5f87950..139badfd3 100644 --- a/src/Sitko.Core.ImgProxy/ApplicationExtensions.cs +++ b/src/Sitko.Core.ImgProxy/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.ImgProxy; @@ -6,16 +7,31 @@ namespace Sitko.Core.ImgProxy; [PublicAPI] public static class ApplicationExtensions { - public static Application AddImgProxy(this Application application, + public static IHostApplicationBuilder AddImgProxy(this IHostApplicationBuilder hostApplicationBuilder, Action configure, - string? optionsKey = null) => application + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddImgProxy(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddImgProxy(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddImgProxy(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddImgProxy(this SitkoCoreApplicationBuilder applicationBuilder, + Action configure, + string? optionsKey = null) => applicationBuilder .AddModule( configure, optionsKey); - public static Application AddImgProxy(this Application application, + public static SitkoCoreApplicationBuilder AddImgProxy(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, - string? optionsKey = null) => application + string? optionsKey = null) => applicationBuilder .AddModule( configure, optionsKey); } - diff --git a/src/Sitko.Core.MediatR/ApplicationExtensions.cs b/src/Sitko.Core.MediatR/ApplicationExtensions.cs index fab0f4f0e..00fc6435d 100644 --- a/src/Sitko.Core.MediatR/ApplicationExtensions.cs +++ b/src/Sitko.Core.MediatR/ApplicationExtensions.cs @@ -1,19 +1,37 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.MediatR; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddMediatR(this Application application, + public static IHostApplicationBuilder AddMediatR(this IHostApplicationBuilder hostApplicationBuilder, + Action> configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddMediatR(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddMediatR(this IHostApplicationBuilder hostApplicationBuilder, + Action>? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddMediatR(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddMediatR(this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) => - application.AddModule, MediatRModuleOptions>(configure, + applicationBuilder.AddModule, MediatRModuleOptions>(configure, optionsKey); - public static Application AddMediatR(this Application application, + public static SitkoCoreApplicationBuilder AddMediatR(this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) => - application.AddModule, MediatRModuleOptions>(configure, + applicationBuilder.AddModule, MediatRModuleOptions>(configure, optionsKey); } - diff --git a/src/Sitko.Core.NewRelic.Logging/ApplicationExtensions.cs b/src/Sitko.Core.NewRelic.Logging/ApplicationExtensions.cs index 439f50893..0e5ca7cd5 100644 --- a/src/Sitko.Core.NewRelic.Logging/ApplicationExtensions.cs +++ b/src/Sitko.Core.NewRelic.Logging/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.NewRelic.Logging; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddNewRelicLogging(this Application application, + public static IHostApplicationBuilder AddNewRelicLogging(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddNewRelicLogging(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddNewRelicLogging(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddNewRelicLogging(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddNewRelicLogging(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddNewRelicLogging(this Application application, + public static SitkoCoreApplicationBuilder AddNewRelicLogging(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Pdf/ApplicationExtensions.cs b/src/Sitko.Core.Pdf/ApplicationExtensions.cs index 8bc3d0462..da29c9de6 100644 --- a/src/Sitko.Core.Pdf/ApplicationExtensions.cs +++ b/src/Sitko.Core.Pdf/ApplicationExtensions.cs @@ -1,9 +1,19 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Pdf; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddPdfRenderer(this Application application) => - application.AddModule(); + public static IHostApplicationBuilder AddPdfRenderer(this IHostApplicationBuilder hostApplicationBuilder + ) + { + hostApplicationBuilder.AddSitkoCore().AddPdfRenderer(); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddPdfRenderer(this SitkoCoreApplicationBuilder applicationBuilder) => + applicationBuilder.AddModule(); } diff --git a/src/Sitko.Core.Puppeteer/ApplicationExtensions.cs b/src/Sitko.Core.Puppeteer/ApplicationExtensions.cs index ca88c9929..bae3b2fe5 100644 --- a/src/Sitko.Core.Puppeteer/ApplicationExtensions.cs +++ b/src/Sitko.Core.Puppeteer/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Puppeteer; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddPuppeteer(this Application application, + public static IHostApplicationBuilder AddPuppeteer(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddPuppeteer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddPuppeteer(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddPuppeteer(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddPuppeteer(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddPuppeteer(this Application application, + public static SitkoCoreApplicationBuilder AddPuppeteer(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Queue.Apm/ApplicationExtensions.cs b/src/Sitko.Core.Queue.Apm/ApplicationExtensions.cs index d3b370091..add8339e3 100644 --- a/src/Sitko.Core.Queue.Apm/ApplicationExtensions.cs +++ b/src/Sitko.Core.Queue.Apm/ApplicationExtensions.cs @@ -1,10 +1,18 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Queue.Apm; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddQueueElasticApm(this Application application) => - application.AddModule(); -} + public static IHostApplicationBuilder AddQueueElasticApm(this IHostApplicationBuilder hostApplicationBuilder) + { + hostApplicationBuilder.AddSitkoCore().AddQueueElasticApm(); + return hostApplicationBuilder; + } + public static SitkoCoreApplicationBuilder AddQueueElasticApm(this SitkoCoreApplicationBuilder applicationBuilder) => + applicationBuilder.AddModule(); +} diff --git a/src/Sitko.Core.Queue.InMemory/ApplicationExtensions.cs b/src/Sitko.Core.Queue.InMemory/ApplicationExtensions.cs index 14200c5b4..ea900d3e9 100644 --- a/src/Sitko.Core.Queue.InMemory/ApplicationExtensions.cs +++ b/src/Sitko.Core.Queue.InMemory/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Queue.InMemory; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddInMemoryQueue(this Application application, + public static IHostApplicationBuilder AddInMemoryQueue(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddInMemoryQueue(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddInMemoryQueue(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddInMemoryQueue(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddInMemoryQueue(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddInMemoryQueue(this Application application, + public static SitkoCoreApplicationBuilder AddInMemoryQueue(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Queue.Nats/ApplicationExtensions.cs b/src/Sitko.Core.Queue.Nats/ApplicationExtensions.cs index 539ef30c5..34a7ab4a8 100644 --- a/src/Sitko.Core.Queue.Nats/ApplicationExtensions.cs +++ b/src/Sitko.Core.Queue.Nats/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Queue.Nats; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddNatsQueue(this Application application, + public static IHostApplicationBuilder AddNatsQueue(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddNatsQueue(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddNatsQueue(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddNatsQueue(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddNatsQueue(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddNatsQueue(this Application application, + public static SitkoCoreApplicationBuilder AddNatsQueue(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Repository.EntityFrameworkCore/ApplicationExtensions.cs b/src/Sitko.Core.Repository.EntityFrameworkCore/ApplicationExtensions.cs index 240b718ad..3b95e286e 100644 --- a/src/Sitko.Core.Repository.EntityFrameworkCore/ApplicationExtensions.cs +++ b/src/Sitko.Core.Repository.EntityFrameworkCore/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Repository.EntityFrameworkCore; @@ -6,20 +7,55 @@ namespace Sitko.Core.Repository.EntityFrameworkCore; [PublicAPI] public static class ApplicationExtensions { - public static Application AddEFRepositories(this Application application, + public static IHostApplicationBuilder AddEFRepositories(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddEFRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddEFRepositories(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddEFRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddEFRepositories( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddEFRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddEFRepositories( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddEFRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddEFRepositories(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddEFRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddEFRepositories(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddEFRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddEFRepositories( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule( + applicationBuilder.AddModule( (applicationContext, moduleOptions) => { moduleOptions.AddRepositoriesFromAssemblyOf(); @@ -27,14 +63,14 @@ public static Application AddEFRepositories(this Application applicat }, optionsKey); - public static Application AddEFRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddEFRepositories( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(moduleOptions => + applicationBuilder.AddModule(moduleOptions => { moduleOptions.AddRepositoriesFromAssemblyOf(); configure?.Invoke(moduleOptions); }, optionsKey); } - diff --git a/src/Sitko.Core.Repository.EntityFrameworkCore/EFRepository.cs b/src/Sitko.Core.Repository.EntityFrameworkCore/EFRepository.cs index eb6f424d1..5372e26c2 100644 --- a/src/Sitko.Core.Repository.EntityFrameworkCore/EFRepository.cs +++ b/src/Sitko.Core.Repository.EntityFrameworkCore/EFRepository.cs @@ -48,7 +48,9 @@ public Task DeleteAllRawAsync(string conditions, CancellationToken cancella { var tableName = dbContext.Model.FindEntityType(typeof(TEntity))?.GetSchemaQualifiedTableName() ?? throw new InvalidOperationException($"Can't find table name for entity {typeof(TEntity)}"); +#pragma warning disable EF1002 return ExecuteDbContextOperationAsync(context => context.Database.ExecuteSqlRawAsync( +#pragma warning restore EF1002 $"DELETE FROM \"{tableName.Replace(".", "\".\"")}\" WHERE {conditions}", cancellationToken), cancellationToken); } diff --git a/src/Sitko.Core.Repository.Remote.Wasm/ApplicationExtensions.cs b/src/Sitko.Core.Repository.Remote.Wasm/ApplicationExtensions.cs index 29af73aaa..40aa3a07e 100644 --- a/src/Sitko.Core.Repository.Remote.Wasm/ApplicationExtensions.cs +++ b/src/Sitko.Core.Repository.Remote.Wasm/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Repository.Remote.Wasm; @@ -6,13 +7,35 @@ namespace Sitko.Core.Repository.Remote.Wasm; [PublicAPI] public static class ApplicationExtensions { - public static Application AddWasmHttpRepositoryTransport(this Application application, + public static IHostApplicationBuilder AddWasmHttpRepositoryTransport( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddWasmHttpRepositoryTransport(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddWasmHttpRepositoryTransport( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddWasmHttpRepositoryTransport(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddWasmHttpRepositoryTransport( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, + optionsKey); - public static Application AddWasmHttpRepositoryTransport(this Application application, + public static SitkoCoreApplicationBuilder AddWasmHttpRepositoryTransport( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, + optionsKey); } diff --git a/src/Sitko.Core.Repository.Remote/ApplicationExtensions.cs b/src/Sitko.Core.Repository.Remote/ApplicationExtensions.cs index 4f12dfd70..d7ce5a1f8 100644 --- a/src/Sitko.Core.Repository.Remote/ApplicationExtensions.cs +++ b/src/Sitko.Core.Repository.Remote/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Repository.Remote; @@ -6,20 +7,73 @@ namespace Sitko.Core.Repository.Remote; [PublicAPI] public static class ApplicationExtensions { - public static Application AddRemoteRepositories(this Application application, + public static IHostApplicationBuilder AddRemoteRepositories(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddRemoteRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddRemoteRepositories(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddRemoteRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddRemoteRepositories( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddRemoteRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddRemoteRepositories( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddRemoteRepositories(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddHttpRepositoryTransport( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddHttpRepositoryTransport(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddHttpRepositoryTransport( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddHttpRepositoryTransport(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddRemoteRepositories(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddRemoteRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddRemoteRepositories(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddRemoteRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddRemoteRepositories( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule( + applicationBuilder.AddModule( (applicationContext, moduleOptions) => { moduleOptions.AddRepositoriesFromAssemblyOf(); @@ -27,23 +81,28 @@ public static Application AddRemoteRepositories(this Application appl }, optionsKey); - public static Application AddRemoteRepositories(this Application application, + public static SitkoCoreApplicationBuilder AddRemoteRepositories( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(moduleOptions => + applicationBuilder.AddModule(moduleOptions => { moduleOptions.AddRepositoriesFromAssemblyOf(); configure?.Invoke(moduleOptions); }, optionsKey); - public static Application AddHttpRepositoryTransport(this Application application, + public static SitkoCoreApplicationBuilder AddHttpRepositoryTransport( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, + optionsKey); - public static Application AddHttpRepositoryTransport(this Application application, + public static SitkoCoreApplicationBuilder AddHttpRepositoryTransport( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, + optionsKey); } diff --git a/src/Sitko.Core.Repository.Search/ApplicationExtensions.cs b/src/Sitko.Core.Repository.Search/ApplicationExtensions.cs index ebaab719d..7e7cd43d0 100644 --- a/src/Sitko.Core.Repository.Search/ApplicationExtensions.cs +++ b/src/Sitko.Core.Repository.Search/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Repository.Search; @@ -6,7 +7,13 @@ namespace Sitko.Core.Repository.Search; [PublicAPI] public static class ApplicationExtensions { - public static Application AddSearchRepository(this Application application) => - application.AddModule(); -} + public static IHostApplicationBuilder AddSearchRepository(this IHostApplicationBuilder hostApplicationBuilder) + { + hostApplicationBuilder.AddSitkoCore().AddSearchRepository(); + return hostApplicationBuilder; + } + public static SitkoCoreApplicationBuilder + AddSearchRepository(this SitkoCoreApplicationBuilder applicationBuilder) => + applicationBuilder.AddModule(); +} diff --git a/src/Sitko.Core.Search.ElasticSearch/ApplicationExtensions.cs b/src/Sitko.Core.Search.ElasticSearch/ApplicationExtensions.cs index ea366a30e..0c6e45fc0 100644 --- a/src/Sitko.Core.Search.ElasticSearch/ApplicationExtensions.cs +++ b/src/Sitko.Core.Search.ElasticSearch/ApplicationExtensions.cs @@ -1,17 +1,35 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Search.ElasticSearch; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddElasticSearch(this Application application, + public static IHostApplicationBuilder AddElasticSearch(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddElasticSearch(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddElasticSearch(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddElasticSearch(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddElasticSearch(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddElasticSearch(this Application application, + public static SitkoCoreApplicationBuilder AddElasticSearch(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Sentry/ApplicationExtensions.cs b/src/Sitko.Core.Sentry/ApplicationExtensions.cs index 5f7de8b50..f5cd09975 100644 --- a/src/Sitko.Core.Sentry/ApplicationExtensions.cs +++ b/src/Sitko.Core.Sentry/ApplicationExtensions.cs @@ -1,14 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Sentry; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddSentry(this Application application, + public static IHostApplicationBuilder AddSentry(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSentry(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddSentry(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSentry(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddSentry(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddSentry(this Application application, + public static SitkoCoreApplicationBuilder AddSentry(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } diff --git a/src/Sitko.Core.Sentry/SentryModule.cs b/src/Sitko.Core.Sentry/SentryModule.cs index 04fd2781b..65b247e61 100644 --- a/src/Sitko.Core.Sentry/SentryModule.cs +++ b/src/Sitko.Core.Sentry/SentryModule.cs @@ -1,32 +1,31 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Sentry.AspNetCore; using Sitko.Core.App; +using Sitko.Core.App.Web; namespace Sitko.Core.Sentry; public class SentryModule : BaseApplicationModule, - IHostBuilderModule + IWebApplicationModule { public override string OptionsKey => "Sentry"; - public void PostConfigureHostBuilder(IApplicationContext context, IHostApplicationBuilder hostBuilder, SentryModuleOptions startupOptions) => - hostBuilder.ConfigureWebHostDefaults(webHostBuilder => + public void ConfigureWebHost(IApplicationContext applicationContext, ConfigureWebHostBuilder webHostBuilder, + SentryModuleOptions options) => + webHostBuilder.UseSentry(builder => { - webHostBuilder.UseSentry(builder => + options.ConfigureSentry?.Invoke(applicationContext, builder, options); + builder.AddSentryOptions(o => { - startupOptions.ConfigureSentry?.Invoke(context, builder, startupOptions); - builder.AddSentryOptions(o => - { - o.Dsn = startupOptions.Dsn; - o.Debug = startupOptions.EnableDebug; - o.TracesSampleRate = startupOptions.TracesSampleRate; - o.DefaultTags.Add("ServiceId", context.Id.ToString()); - o.DefaultTags.Add("Service", context.Name); - o.DefaultTags.Add("Environment", context.Environment); - o.DefaultTags.Add("Version", context.Version); - startupOptions.ConfigureSentryOptions?.Invoke(context, o, startupOptions); - }); + o.Dsn = options.Dsn; + o.Debug = options.EnableDebug; + o.TracesSampleRate = options.TracesSampleRate; + o.DefaultTags.Add("ServiceId", applicationContext.Id.ToString()); + o.DefaultTags.Add("Service", applicationContext.Name); + o.DefaultTags.Add("Environment", applicationContext.Environment); + o.DefaultTags.Add("Version", applicationContext.Version); + options.ConfigureSentryOptions?.Invoke(applicationContext, o, options); }); }); } diff --git a/src/Sitko.Core.Storage.FileSystem/ApplicationExtensions.cs b/src/Sitko.Core.Storage.FileSystem/ApplicationExtensions.cs index a26a910c0..878eb8395 100644 --- a/src/Sitko.Core.Storage.FileSystem/ApplicationExtensions.cs +++ b/src/Sitko.Core.Storage.FileSystem/ApplicationExtensions.cs @@ -1,22 +1,66 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Storage.FileSystem; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddFileSystemStorage(this Application application, + public static IHostApplicationBuilder AddFileSystemStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddFileSystemStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddFileSystemStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddFileSystemStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddFileSystemStorageMetadata( + this IHostApplicationBuilder hostApplicationBuilder, + Action> + configure, string? optionsKey = null) + where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddFileSystemStorageMetadata(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddFileSystemStorageMetadata( + this IHostApplicationBuilder hostApplicationBuilder, + Action>? + configure = null, string? optionsKey = null) + where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddFileSystemStorageMetadata(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddFileSystemStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() => - application.AddModule, TStorageOptions>(configure, + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); - public static Application AddFileSystemStorage(this Application application, + public static SitkoCoreApplicationBuilder AddFileSystemStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() => - application.AddModule, TStorageOptions>(configure, + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); - public static Application AddFileSystemStorageMetadata(this Application application, + public static SitkoCoreApplicationBuilder AddFileSystemStorageMetadata( + this SitkoCoreApplicationBuilder application, Action> configure, string? optionsKey = null) where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() => @@ -25,7 +69,8 @@ public static Application AddFileSystemStorageMetadata(this App FileSystemStorageMetadataModuleOptions>( configure, optionsKey); - public static Application AddFileSystemStorageMetadata(this Application application, + public static SitkoCoreApplicationBuilder AddFileSystemStorageMetadata( + this SitkoCoreApplicationBuilder application, Action>? configure = null, string? optionsKey = null) where TStorageOptions : StorageOptions, IFileSystemStorageOptions, new() => @@ -34,4 +79,3 @@ public static Application AddFileSystemStorageMetadata(this App FileSystemStorageMetadataModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.Storage.ImgProxy/ApplicationExtensions.cs b/src/Sitko.Core.Storage.ImgProxy/ApplicationExtensions.cs index e0ce43f88..35a448fa0 100644 --- a/src/Sitko.Core.Storage.ImgProxy/ApplicationExtensions.cs +++ b/src/Sitko.Core.Storage.ImgProxy/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Storage.ImgProxy; @@ -6,20 +7,41 @@ namespace Sitko.Core.Storage.ImgProxy; [PublicAPI] public static class ApplicationExtensions { - public static Application AddImgProxyStorage(this Application application, + public static IHostApplicationBuilder AddImgProxyStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, + string? optionsKey = null) + where TStorageOptions : StorageOptions + { + hostApplicationBuilder.AddSitkoCore().AddImgProxyStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddImgProxyStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, + string? optionsKey = null) + where TStorageOptions : StorageOptions + { + hostApplicationBuilder.AddSitkoCore().AddImgProxyStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddImgProxyStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) where TStorageOptions : StorageOptions => - application + applicationBuilder .AddModule, BaseApplicationModuleOptions>( configure, optionsKey); - public static Application AddImgProxyStorage(this Application application, + public static SitkoCoreApplicationBuilder AddImgProxyStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) where TStorageOptions : StorageOptions => - application + applicationBuilder .AddModule, BaseApplicationModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.Storage.Metadata.Postgres/ApplicationExtensions.cs b/src/Sitko.Core.Storage.Metadata.Postgres/ApplicationExtensions.cs index 3ef5cd8a8..073ed0e4d 100644 --- a/src/Sitko.Core.Storage.Metadata.Postgres/ApplicationExtensions.cs +++ b/src/Sitko.Core.Storage.Metadata.Postgres/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Storage.Metadata.Postgres; @@ -6,21 +7,41 @@ namespace Sitko.Core.Storage.Metadata.Postgres; [PublicAPI] public static class ApplicationExtensions { - public static Application AddPostgresStorageMetadata(this Application application, + public static IHostApplicationBuilder AddPostgresStorageMetadata( + this IHostApplicationBuilder applicationBuilder, + Action> configure, + string? optionsKey = null) + where TStorageOptions : StorageOptions + { + applicationBuilder.AddSitkoCore().AddPostgresStorageMetadata(configure, optionsKey); + return applicationBuilder; + } + + public static IHostApplicationBuilder AddPostgresStorageMetadata( + this IHostApplicationBuilder applicationBuilder, + Action>? configure = null, string? optionsKey = null) + where TStorageOptions : StorageOptions + { + applicationBuilder.AddSitkoCore().AddPostgresStorageMetadata(configure, optionsKey); + return applicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddPostgresStorageMetadata( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TStorageOptions : StorageOptions => - application + applicationBuilder .AddModule, PostgresStorageMetadataModuleOptions>( configure, optionsKey); - public static Application AddPostgresStorageMetadata(this Application application, + public static SitkoCoreApplicationBuilder AddPostgresStorageMetadata( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TStorageOptions : StorageOptions => - application + applicationBuilder .AddModule, PostgresStorageMetadataModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.Storage.Metadata.Postgres/PostgresStorageMetadataProvider.cs b/src/Sitko.Core.Storage.Metadata.Postgres/PostgresStorageMetadataProvider.cs index f3bcfee61..0ef57f184 100644 --- a/src/Sitko.Core.Storage.Metadata.Postgres/PostgresStorageMetadataProvider.cs +++ b/src/Sitko.Core.Storage.Metadata.Postgres/PostgresStorageMetadataProvider.cs @@ -44,20 +44,20 @@ protected override async Task DoDeleteMetadataAsync(string filePath, protected override async Task DoDeleteAllMetadataAsync(CancellationToken cancellationToken = default) { await using var dbContext = GetDbContext(); - await dbContext.Database.ExecuteSqlRawAsync( - $"DELETE FROM \"{StorageDbContext.Schema}\".\"{StorageDbContext.Table}\" WHERE \"{nameof(StorageItemRecord.Storage)}\" = '{StorageOptions.CurrentValue.Name}'", - cancellationToken); + await dbContext.Set().Where(record => record.Storage == StorageOptions.CurrentValue.Name) + .ExecuteDeleteAsync(cancellationToken); } protected override async Task> DoGetDirectoryContentsAsync(string path, CancellationToken cancellationToken = default) { await using var dbContext = GetDbContext(); - if (path.StartsWith("/", StringComparison.Ordinal)) + if (path.StartsWith('/')) { path = path.Substring(1); } + // ReSharper disable once EntityFramework.NPlusOne.IncompleteDataQuery var records = await dbContext.Records .Where(r => r.Storage == StorageOptions.CurrentValue.Name && r.Path.StartsWith(path)) .ToListAsync(cancellationToken); @@ -65,6 +65,7 @@ protected override async Task> DoGetDirectoryContentsAs var root = StorageNode.CreateDirectory("/", "/"); foreach (var itemRecord in records) { + // ReSharper disable once EntityFramework.NPlusOne.IncompleteDataUsage root.AddItem(itemRecord.StorageItem); } diff --git a/src/Sitko.Core.Storage.Remote/ApplicationExtensions.cs b/src/Sitko.Core.Storage.Remote/ApplicationExtensions.cs index 57efd90fc..cc0d02c6f 100644 --- a/src/Sitko.Core.Storage.Remote/ApplicationExtensions.cs +++ b/src/Sitko.Core.Storage.Remote/ApplicationExtensions.cs @@ -1,19 +1,41 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Storage.Remote; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddRemoteStorage(this Application application, + public static IHostApplicationBuilder AddRemoteStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + where TStorageOptions : StorageOptions, IRemoteStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddRemoteStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddRemoteStorage( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + where TStorageOptions : StorageOptions, IRemoteStorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddRemoteStorage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddRemoteStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) where TStorageOptions : StorageOptions, IRemoteStorageOptions, new() => - application.AddModule, TStorageOptions>(configure, + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); - public static Application AddRemoteStorage(this Application application, + public static SitkoCoreApplicationBuilder AddRemoteStorage( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) where TStorageOptions : StorageOptions, IRemoteStorageOptions, new() => - application.AddModule, TStorageOptions>(configure, + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); } - diff --git a/src/Sitko.Core.Storage.Remote/RemoteStorage.cs b/src/Sitko.Core.Storage.Remote/RemoteStorage.cs index 9184380a2..3416d8ca1 100644 --- a/src/Sitko.Core.Storage.Remote/RemoteStorage.cs +++ b/src/Sitko.Core.Storage.Remote/RemoteStorage.cs @@ -41,15 +41,12 @@ protected override async Task DoSaveAsync(UploadRequest uploadReque CancellationToken cancellationToken = default) { using var request = new HttpRequestMessage(HttpMethod.Post, ""); - using var content = new MultipartFormDataContent - { - // file - { new StreamContent(uploadRequest.Stream), "file", Path.GetFileName(uploadRequest.FileName) }, - - // payload - { new StringContent(string.IsNullOrEmpty(uploadRequest.Path) ? "" : uploadRequest.Path), "path" }, - { new StringContent(uploadRequest.FileName), "fileName" } - }; + using var content = new MultipartFormDataContent(); + // file + content.Add(new StreamContent(uploadRequest.Stream), "file", Path.GetFileName(uploadRequest.FileName)); + // payload + content.Add(new StringContent(string.IsNullOrEmpty(uploadRequest.Path) ? "" : uploadRequest.Path), "path"); + content.Add(new StringContent(uploadRequest.FileName), "fileName"); if (uploadRequest.Metadata?.Data is not null) { diff --git a/src/Sitko.Core.Storage.S3/ApplicationExtensions.cs b/src/Sitko.Core.Storage.S3/ApplicationExtensions.cs index a07d82600..84bb9296e 100644 --- a/src/Sitko.Core.Storage.S3/ApplicationExtensions.cs +++ b/src/Sitko.Core.Storage.S3/ApplicationExtensions.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; namespace Sitko.Core.Storage.S3; @@ -6,30 +7,71 @@ namespace Sitko.Core.Storage.S3; [PublicAPI] public static class ApplicationExtensions { - public static Application AddS3Storage(this Application application, + public static IHostApplicationBuilder AddS3Storage( + this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + where TStorageOptions : S3StorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddS3Storage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddS3Storage( + this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + where TStorageOptions : S3StorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddS3Storage(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddS3StorageMetadata( + this IHostApplicationBuilder hostApplicationBuilder, + Action> configure, + string? optionsKey = null) + where TStorageOptions : S3StorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddS3StorageMetadata(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddS3StorageMetadata( + this IHostApplicationBuilder hostApplicationBuilder, + Action>? configure = null, + string? optionsKey = null) + where TStorageOptions : S3StorageOptions, new() + { + hostApplicationBuilder.AddSitkoCore().AddS3StorageMetadata(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddS3Storage( + this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) where TStorageOptions : S3StorageOptions, new() => - application.AddModule, TStorageOptions>(configure, optionsKey); + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); - public static Application AddS3Storage(this Application application, + public static SitkoCoreApplicationBuilder AddS3Storage( + this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) where TStorageOptions : S3StorageOptions, new() => - application.AddModule, TStorageOptions>(configure, optionsKey); + applicationBuilder.AddModule, TStorageOptions>(configure, optionsKey); - public static Application AddS3StorageMetadata(this Application application, + public static SitkoCoreApplicationBuilder AddS3StorageMetadata( + this SitkoCoreApplicationBuilder applicationBuilder, Action> configure, string? optionsKey = null) where TStorageOptions : S3StorageOptions, new() => - application + applicationBuilder .AddModule, S3StorageMetadataModuleOptions>( configure, optionsKey); - public static Application AddS3StorageMetadata(this Application application, + public static SitkoCoreApplicationBuilder AddS3StorageMetadata( + this SitkoCoreApplicationBuilder applicationBuilder, Action>? configure = null, string? optionsKey = null) where TStorageOptions : S3StorageOptions, new() => - application + applicationBuilder .AddModule, S3StorageMetadataModuleOptions>( configure, optionsKey); } - diff --git a/src/Sitko.Core.Storage.S3/S3StorageModule.cs b/src/Sitko.Core.Storage.S3/S3StorageModule.cs index fa2f6c774..655ab25fb 100644 --- a/src/Sitko.Core.Storage.S3/S3StorageModule.cs +++ b/src/Sitko.Core.Storage.S3/S3StorageModule.cs @@ -1,5 +1,6 @@ using Amazon; using Amazon.Auth.AccessControlPolicy; +using Amazon.Runtime; using Amazon.S3; using FluentValidation; using HealthChecks.Aws.S3; @@ -27,15 +28,14 @@ public override void ConfigureServices(IApplicationContext applicationContext, I var config = GetOptions(serviceProvider); var options = new S3BucketOptions { - AccessKey = config.AccessKey, BucketName = config.Bucket, - SecretKey = config.SecretKey, S3Config = new AmazonS3Config { RegionEndpoint = config.Region, ServiceURL = config.Server?.ToString(), ForcePathStyle = true - } + }, + Credentials = new BasicAWSCredentials(config.AccessKey, config.SecretKey) }; return new S3HealthCheck(options); }, null, null, null)); @@ -82,4 +82,3 @@ public S3StorageOptionsValidator() RuleFor(o => o.SecretKey).NotEmpty().WithMessage("S3 secret key is empty"); } } - diff --git a/src/Sitko.Core.Swagger/ApplicationExtensions.cs b/src/Sitko.Core.Swagger/ApplicationExtensions.cs index 0462a0233..2f49d4ed8 100644 --- a/src/Sitko.Core.Swagger/ApplicationExtensions.cs +++ b/src/Sitko.Core.Swagger/ApplicationExtensions.cs @@ -1,15 +1,31 @@ -using Sitko.Core.App; +using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; namespace Sitko.Core.Swagger; +[PublicAPI] public static class ApplicationExtensions { - public static Application AddSwagger(this Application application, + public static IHostApplicationBuilder AddSwagger(this IHostApplicationBuilder hostApplicationBuilder, + Action configure, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSwagger(configure, optionsKey); + return hostApplicationBuilder; + } + + public static IHostApplicationBuilder AddSwagger(this IHostApplicationBuilder hostApplicationBuilder, + Action? configure = null, string? optionsKey = null) + { + hostApplicationBuilder.AddSitkoCore().AddSwagger(configure, optionsKey); + return hostApplicationBuilder; + } + + public static SitkoCoreApplicationBuilder AddSwagger(this SitkoCoreApplicationBuilder applicationBuilder, Action configure, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); - public static Application AddSwagger(this Application application, + public static SitkoCoreApplicationBuilder AddSwagger(this SitkoCoreApplicationBuilder applicationBuilder, Action? configure = null, string? optionsKey = null) => - application.AddModule(configure, optionsKey); + applicationBuilder.AddModule(configure, optionsKey); } - diff --git a/src/Sitko.Core.Xunit.Web/WebTestApplication.cs b/src/Sitko.Core.Xunit.Web/WebTestApplication.cs deleted file mode 100644 index ee8a2dcd7..000000000 --- a/src/Sitko.Core.Xunit.Web/WebTestApplication.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.TestHost; -using Sitko.Core.App; -using Sitko.Core.App.Web; - -namespace Sitko.Core.Xunit.Web; - -public abstract class WebTestApplication : WebApplication where TStartup : TestStartup -{ - protected WebTestApplication(string[] args) : base(args) - { - } - - protected override void ConfigureWebHostDefaults(IApplicationContext applicationContext, - IWebHostBuilder webHostBuilder) - { - base.ConfigureWebHostDefaults(applicationContext, webHostBuilder); - webHostBuilder.UseTestServer(); - } -} - -public class WebTestApplication : WebTestApplication -{ - public WebTestApplication(string[] args) : base(args) - { - } -} diff --git a/src/Sitko.Core.Xunit.Web/WebTestScope.cs b/src/Sitko.Core.Xunit.Web/WebTestScope.cs index b9fbbfaa4..169bdd2bd 100644 --- a/src/Sitko.Core.Xunit.Web/WebTestScope.cs +++ b/src/Sitko.Core.Xunit.Web/WebTestScope.cs @@ -1,48 +1,44 @@ -using Microsoft.AspNetCore.TestHost; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Sitko.Core.App; +using Sitko.Core.App.Web; namespace Sitko.Core.Xunit.Web; -public class WebTestScope : WebTestScope +public class WebTestScope : WebTestScope { -} + protected override HostApplicationBuilder CreateHostBuilder() => + Microsoft.Extensions.Hosting.Host.CreateApplicationBuilder(); -public class WebTestScope : WebTestScope where TWebApplication : WebTestApplication - where TWebStartup : TestStartup -{ + protected override IHost BuildApplication(HostApplicationBuilder builder) => builder.Build(); } -public class WebTestScope : BaseTestScope - where TWebApplication : WebTestApplication - where TWebStartup : TestStartup - where TApplication : HostedApplication +public abstract class WebTestScope : BaseTestScope where TConfig : BaseTestConfig, new() + where TApplicationBuilder : IHostApplicationBuilder { protected IHost? Host { get; private set; } protected TestServer? Server { get; private set; } - protected virtual TWebApplication ConfigureWebApplication(TWebApplication application, string name) => application; + + protected virtual WebApplicationBuilder ConfigureWebApplication(WebApplicationBuilder webApplicationBuilder, + string name) => webApplicationBuilder; public override async Task BeforeConfiguredAsync(string name) { - if (Activator.CreateInstance(typeof(TWebApplication), new object[] { Array.Empty() }) is TWebApplication - application) - { - ConfigureWebApplication(application, name); - application.ConfigureServices(services => - { - services.AddMvc().AddApplicationPart(GetType().Assembly).AddControllersAsServices(); - }); - Host = await application.StartAsync(); - Server = Host.GetTestServer(); - await InitWebApplicationAsync(Host.Services); - } - else - { - throw new InvalidOperationException($"Can't create {typeof(TWebApplication)}"); - } + var builder = WebApplication.CreateBuilder(); + + ConfigureWebApplication(builder, name); + builder.Services.AddMvc(options => options.EnableEndpointRouting = false).AddApplicationPart(GetType().Assembly) + .AddControllersAsServices(); + builder.WebHost.UseTestServer(); + var host = builder.Build(); + host.UseMvc(); + host.MapSitkoCore(); + await host.StartAsync(); + Server = host.GetTestServer(); + Host = host; + await InitWebApplicationAsync(host.Services); } protected virtual Task InitWebApplicationAsync(IServiceProvider hostServices) => Task.CompletedTask; @@ -57,4 +53,3 @@ protected override async Task OnDisposeAsync() } } } - diff --git a/src/Sitko.Core.Xunit/BaseTestScope.cs b/src/Sitko.Core.Xunit/BaseTestScope.cs index 1f9da8f86..3d09df58b 100644 --- a/src/Sitko.Core.Xunit/BaseTestScope.cs +++ b/src/Sitko.Core.Xunit/BaseTestScope.cs @@ -2,6 +2,7 @@ using JetBrains.Annotations; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Serilog; @@ -21,13 +22,14 @@ public interface IBaseTestScope : IAsyncDisposable Task StartApplicationAsync(); } -public abstract class BaseTestScope : IBaseTestScope - where TApplication : HostedApplication where TConfig : BaseTestConfig, new() +public abstract class BaseTestScope : IBaseTestScope + where TConfig : BaseTestConfig, new() where THostApplicationBuilder : IHostApplicationBuilder { + private IHost? app; + private THostApplicationBuilder? hostApplicationBuilder; private bool isApplicationStarted; private bool isDisposed; - private TApplication? scopeApplication; protected IServiceProvider? ServiceProvider { get; set; } protected Guid Id { get; } = Guid.NewGuid(); [PublicAPI] protected IApplicationContext? ApplicationContext { get; set; } @@ -35,38 +37,34 @@ public abstract class BaseTestScope : IBaseTestScope public TConfig Config => GetService>().Value; - public async Task ConfigureAsync(string name, ITestOutputHelper testOutputHelper) + public Task ConfigureAsync(string name, ITestOutputHelper testOutputHelper) { Name = name; - scopeApplication = CreateApplication(); + hostApplicationBuilder = CreateHostBuilder(); + hostApplicationBuilder.Configuration.AddJsonFile("appsettings.json", true); + hostApplicationBuilder.Configuration.AddJsonFile( + $"appsettings.{hostApplicationBuilder.Environment.EnvironmentName}.json", true); - scopeApplication.ConfigureAppConfiguration((applicationContext, builder) => - { - builder.AddJsonFile("appsettings.json", true); - builder.AddJsonFile($"appsettings.{applicationContext.AspNetEnvironmentName}.json", true); - }); - - scopeApplication.ConfigureServices((context, services) => - { - ConfigureServices(context, services, name); - services.Configure(context.Configuration.GetSection("Tests")); - }); + hostApplicationBuilder.Services.Configure(hostApplicationBuilder.Configuration.GetSection("Tests")); + ConfigureServices(hostApplicationBuilder, name); - scopeApplication.ConfigureLogging((_, loggerConfiguration) => - { - loggerConfiguration = loggerConfiguration.WriteTo.TestOutput(testOutputHelper, - outputTemplate: - "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}{NewLine}---------{NewLine}{Properties:j}{NewLine}---------", - formatProvider: CultureInfo.InvariantCulture); - return loggerConfiguration; - }); - - scopeApplication = ConfigureApplication(scopeApplication, name); - ServiceProvider = (await scopeApplication.GetServiceProviderAsync()).CreateScope().ServiceProvider; + hostApplicationBuilder.AddSitkoCore(Array.Empty()) + .ConfigureLogging((_, loggerConfiguration) => + { + loggerConfiguration = loggerConfiguration.WriteTo.TestOutput(testOutputHelper, + outputTemplate: + "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}{NewLine}---------{NewLine}{Properties:j}{NewLine}---------", + formatProvider: CultureInfo.InvariantCulture); + return loggerConfiguration; + }); + + ConfigureApplication(hostApplicationBuilder, name); + app = BuildApplication(hostApplicationBuilder); + ServiceProvider = app.Services.CreateAsyncScope().ServiceProvider; ApplicationContext = ServiceProvider.GetService(); + return Task.CompletedTask; } - public T GetService() { #pragma warning disable 8714 @@ -86,14 +84,14 @@ public async ValueTask DisposeAsync() if (!isDisposed) { await OnDisposeAsync(); - if (scopeApplication != null) + if (app != null) { if (isApplicationStarted) { - await scopeApplication.StopAsync(); + await app.StopAsync(); } - await scopeApplication.DisposeAsync(); + app.Dispose(); } GC.SuppressFinalize(this); @@ -103,9 +101,9 @@ public async ValueTask DisposeAsync() public async Task StartApplicationAsync() { - if (scopeApplication != null && !isApplicationStarted) + if (app != null && !isApplicationStarted) { - await scopeApplication.StartAsync(); + await app.StartAsync(); isApplicationStarted = true; } } @@ -119,46 +117,29 @@ public TConfig GetConfig(IConfiguration configuration) return config; } - protected virtual TApplication CreateApplication() - { - var app = Activator.CreateInstance(typeof(TApplication), new object[] { Array.Empty() }); - if (app is TApplication typedApplication) - { - return typedApplication; - } - - throw new InvalidOperationException($"Can't create application {typeof(TApplication)}"); - } + protected abstract THostApplicationBuilder CreateHostBuilder(); + protected abstract IHost BuildApplication(THostApplicationBuilder builder); - protected virtual TApplication ConfigureApplication(TApplication application, string name) => application; + protected virtual IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) + { + hostBuilder.Configuration.AddEnvironmentVariables(); + return hostBuilder; + } - protected virtual IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => - services; + protected virtual IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) => + builder; public IServiceScope CreateScope() => ServiceProvider!.CreateScope(); } -public abstract class BaseTestScope : BaseTestScope - where TApplication : HostedApplication +public abstract class BaseTestScope : BaseTestScope + where TConfig : BaseTestConfig, new() { + protected override HostApplicationBuilder CreateHostBuilder() => Host.CreateApplicationBuilder(); + protected override IHost BuildApplication(HostApplicationBuilder builder) => builder.Build(); } -public abstract class BaseTestScope : BaseTestScope +public abstract class BaseTestScope : BaseTestScope { } - -public class TestApplication : HostedApplication -{ - public TestApplication(string[] args) : base(args) - { - } - - protected override void ConfigureHostConfiguration(IConfigurationBuilder configurationBuilder) - { - base.ConfigureHostConfiguration(configurationBuilder); - configurationBuilder.AddEnvironmentVariables(); - } -} - diff --git a/src/Sitko.Core.Xunit/DbBaseTestScope.cs b/src/Sitko.Core.Xunit/DbBaseTestScope.cs index e45dcb22e..54c02166c 100644 --- a/src/Sitko.Core.Xunit/DbBaseTestScope.cs +++ b/src/Sitko.Core.Xunit/DbBaseTestScope.cs @@ -1,6 +1,7 @@ using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Db.InMemory; using Sitko.Core.Db.Postgres; @@ -8,49 +9,51 @@ namespace Sitko.Core.Xunit; [PublicAPI] -public abstract class DbBaseTestScope : BaseTestScope - where TApplication : HostedApplication where TConfig : BaseDbTestConfig, new() +public abstract class DbBaseTestScope : BaseTestScope + where TConfig : BaseDbTestConfig, new() where TApplicationBuilder : IHostApplicationBuilder { private readonly List dbContexts = new(); private readonly List> dbInitActions = new(); - protected void AddDbContext(TApplication application, string name, Action(IHostApplicationBuilder applicationBuilder, string name, + Action? configureInMemory = null, Action, Guid, string>? configurePostgres = null, Func? initDbContext = null) where TDbContext : DbContext { var dbName = $"{typeof(TDbContext).Name}_{name}"; - application.AddInMemoryDatabase((applicationContext, moduleOptions) => - { - if (GetConfig(applicationContext.Configuration).UsePostgres) - { - moduleOptions.Enabled = false; - } - else + applicationBuilder + .AddInMemoryDatabase((applicationContext, moduleOptions) => { - moduleOptions.Database = dbName; - moduleOptions.ConfigureDbContextOptions = (builder, _, currentApplicationContext) => + if (GetConfig(applicationContext.Configuration).UsePostgres) { - configureInMemory?.Invoke(builder, currentApplicationContext); - }; - } - }); - application.AddPostgresDatabase((applicationContext, moduleOptions) => - { - if (GetConfig(applicationContext.Configuration).UsePostgres) - { - moduleOptions.Database = $"{Id}_{dbName}"; - moduleOptions.EnableSensitiveLogging = true; - moduleOptions.IncludeErrorDetails = true; - configurePostgres?.Invoke(applicationContext, moduleOptions, Id, dbName); - } - else + moduleOptions.Enabled = false; + } + else + { + moduleOptions.Database = dbName; + moduleOptions.ConfigureDbContextOptions = (builder, _, currentApplicationContext) => + { + configureInMemory?.Invoke(builder, currentApplicationContext); + }; + } + }) + .AddPostgresDatabase((applicationContext, moduleOptions) => { - moduleOptions.Enabled = false; - } - }); + if (GetConfig(applicationContext.Configuration).UsePostgres) + { + moduleOptions.Database = $"{Id}_{dbName}"; + moduleOptions.EnableSensitiveLogging = true; + moduleOptions.IncludeErrorDetails = true; + configurePostgres?.Invoke(applicationContext, moduleOptions, Id, dbName); + } + else + { + moduleOptions.Enabled = false; + } + }); dbInitActions.Add(async () => { @@ -95,18 +98,20 @@ protected override async Task OnDisposeAsync() } [PublicAPI] -public abstract class DbBaseTestScope : DbBaseTestScope - where TDbContext : DbContext where TApplication : HostedApplication where TConfig : BaseDbTestConfig, new() +public abstract class + DbBaseTestScope : DbBaseTestScope + where TDbContext : DbContext + where TConfig : BaseDbTestConfig, new() + where TApplicationBuilder : IHostApplicationBuilder { - protected override TApplication ConfigureApplication(TApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - AddDbContext(application, name, ConfigureInMemoryDatabaseModule, ConfigurePostgresDatabaseModule, + base.ConfigureApplication(hostBuilder, name); + AddDbContext(hostBuilder, name, ConfigureInMemoryDatabaseModule, ConfigurePostgresDatabaseModule, InitDbContextAsync); - return application; + return hostBuilder; } - protected virtual void ConfigureInMemoryDatabaseModule(DbContextOptionsBuilder builder, IApplicationContext applicationContext) { @@ -123,8 +128,10 @@ protected virtual void ConfigurePostgresDatabaseModule(IApplicat } } -public abstract class DbBaseTestScope : DbBaseTestScope +public abstract class + DbBaseTestScope : DbBaseTestScope where TDbContext : DbContext { + protected override IHost BuildApplication(HostApplicationBuilder builder) => builder.Build(); + protected override HostApplicationBuilder CreateHostBuilder() => Host.CreateApplicationBuilder(); } - diff --git a/tests/Sitko.Core.App.Blazor.Tests/StateTestScope.cs b/tests/Sitko.Core.App.Blazor.Tests/StateTestScope.cs index 9f202ccf7..4460ac5d2 100644 --- a/tests/Sitko.Core.App.Blazor.Tests/StateTestScope.cs +++ b/tests/Sitko.Core.App.Blazor.Tests/StateTestScope.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.Blazor.Components; using Sitko.Core.Xunit; @@ -6,7 +7,9 @@ namespace Sitko.Core.App.Blazor.Tests; public class StateTestScope : BaseTestScope { - protected override IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => base.ConfigureServices(applicationContext, services, name) - .AddScoped(); + protected override IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) + { + base.ConfigureServices(builder, name).Services.AddScoped(); + return builder; + } } diff --git a/tests/Sitko.Core.App.Tests/ConfigurationTests.cs b/tests/Sitko.Core.App.Tests/ConfigurationTests.cs index ee6817ba5..23d11b95e 100644 --- a/tests/Sitko.Core.App.Tests/ConfigurationTests.cs +++ b/tests/Sitko.Core.App.Tests/ConfigurationTests.cs @@ -1,6 +1,7 @@ using FluentAssertions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Sitko.Core.Xunit; using Xunit; @@ -14,39 +15,51 @@ public ConfigurationTests(ITestOutputHelper testOutputHelper) : base(testOutputH { } - [Fact] - public async Task NestedModules() - { - var app = new TestApplication(Array.Empty()); - app.AddModule(); - app.AddModule(); - await app.GetServiceProviderAsync(); - var options = app.GetModulesOptions(); - options.Should().HaveCount(3); - } + // TODO: REWRITE + // [Fact] + // public async Task NestedModules() + // { + // var app = Host.CreateApplicationBuilder(); + // app + // .AddSitkoCore() + // .AddModule() + // .AddModule(); + // await app.GetServiceProviderAsync(); + // var options = app.GetModulesOptions(); + // options.Should().HaveCount(3); + // } public static IEnumerable BaseOptionsData => new List { - new object[] { "Baz:Foo", Guid.NewGuid().ToString(), "Baz:Bar", Guid.NewGuid().ToString() }, // all from base options - new object[] { "Baz:Inner:Foo", Guid.NewGuid().ToString(), "Baz:Bar", Guid.NewGuid().ToString() }, // first from module, second from base - new object[] { "Baz:Foo", Guid.NewGuid().ToString(), "Baz:Inner:Bar", Guid.NewGuid().ToString() }, // first from base, second from module - new object[] { "Baz:Inner:Foo", Guid.NewGuid().ToString(), "Baz:Inner:Bar", Guid.NewGuid().ToString() }, // all from module options + new object[] + { + "Baz:Foo", Guid.NewGuid().ToString(), "Baz:Bar", Guid.NewGuid().ToString() + }, // all from base options + new object[] + { + "Baz:Inner:Foo", Guid.NewGuid().ToString(), "Baz:Bar", Guid.NewGuid().ToString() + }, // first from module, second from base + new object[] + { + "Baz:Foo", Guid.NewGuid().ToString(), "Baz:Inner:Bar", Guid.NewGuid().ToString() + }, // first from base, second from module + new object[] + { + "Baz:Inner:Foo", Guid.NewGuid().ToString(), "Baz:Inner:Bar", Guid.NewGuid().ToString() + }, // all from module options }; [Theory] [MemberData(nameof(BaseOptionsData))] - public async Task BaseOptions(string fooKey, string fooValue, string barKey, string barValue) + public void BaseOptions(string fooKey, string fooValue, string barKey, string barValue) { var dict = new Dictionary { { fooKey, fooValue }, { barKey, barValue } }; - var app = new TestApplication(Array.Empty()); - app.ConfigureAppConfiguration((_, builder) => - { - builder.AddInMemoryCollection(dict); - }); - app.AddModule(); - var sp = await app.GetServiceProviderAsync(); + var app = Host.CreateApplicationBuilder(); + app.Configuration.AddInMemoryCollection(dict); + app.AddSitkoCore().AddModule(); + var sp = app.Build().Services; var options = sp.GetRequiredService>(); options.Value.Foo.Should().Be(fooValue); options.Value.Bar.Should().Be(barValue); diff --git a/tests/Sitko.Core.App.Tests/ILocalizationTests.cs b/tests/Sitko.Core.App.Tests/ILocalizationTests.cs index 99338b7a7..19743b4eb 100644 --- a/tests/Sitko.Core.App.Tests/ILocalizationTests.cs +++ b/tests/Sitko.Core.App.Tests/ILocalizationTests.cs @@ -1,4 +1,5 @@ using System.Globalization; +using Microsoft.Extensions.Hosting; using Sitko.Core.App.Localization; using Sitko.Core.Xunit; using Xunit; @@ -162,20 +163,13 @@ public class Default { } -public class LocalizationTestApplication : TestApplication -{ - public LocalizationTestApplication(string[] args) : base(args) => - this.AddJsonLocalization(moduleOptions => - { - moduleOptions.AddDefaultResource(); - }); -} - -public class LocalizationTestScope : BaseTestScope +public class LocalizationTestScope : BaseTestScope { + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddJsonLocalization(options => options.AddDefaultResource()); } public class NoLocalizationTestScope : BaseTestScope { } - diff --git a/tests/Sitko.Core.Configuration.Vault.Tests/BaseVaultTest.cs b/tests/Sitko.Core.Configuration.Vault.Tests/BaseVaultTest.cs index aa8db1b28..4bc28fc23 100644 --- a/tests/Sitko.Core.Configuration.Vault.Tests/BaseVaultTest.cs +++ b/tests/Sitko.Core.Configuration.Vault.Tests/BaseVaultTest.cs @@ -1,5 +1,6 @@ using FluentValidation; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Xunit; using VaultSharp; @@ -28,21 +29,16 @@ public VaultTestScope() => public TestConfig FirstConfig { get; } = new() { Bar = Guid.NewGuid(), Foo = Guid.NewGuid().ToString() }; public TestConfig2 SecondConfig { get; } = new() { Bar = Guid.NewGuid(), Foo = Guid.NewGuid().ToString() }; - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - - application.AddVaultConfiguration(options => - { - options.Secrets = new List { firstSecretId.ToString(), secondSecretId.ToString() }; - }); - application.ConfigureServices((context, collection) => - { - collection.Configure(context.Configuration.GetSection("test")); - collection.Configure(context.Configuration.GetSection("test2")); - }); - application.AddModule(); - return application; + base.ConfigureApplication(hostBuilder, name) + .AddVaultConfiguration(options => + { + options.Secrets = new List { firstSecretId.ToString(), secondSecretId.ToString() }; + }); + hostBuilder.Services.Configure(hostBuilder.Configuration.GetSection("test")); + hostBuilder.Services.Configure(hostBuilder.Configuration.GetSection("test2")); + return hostBuilder; } public override async Task BeforeConfiguredAsync(string name) @@ -71,24 +67,21 @@ await vaultClient.V1.Secrets.KeyValue.V2.DeleteMetadataAsync(secondSecretId.ToSt public class FailingVaultTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddVaultConfiguration(options => - { - options.Secrets = new List { "NonExistingSecret" }; - }); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddVaultConfiguration(options => + { + options.Secrets = new List { "NonExistingSecret" }; + }); } public class VaultTestScopeWithValidationFailure : VaultTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - application.AddModule(); - return application; + base.ConfigureApplication(hostBuilder, name); + hostBuilder.AddSitkoCore().AddModule(); + return hostBuilder; } } @@ -131,4 +124,3 @@ public class TestModuleWithValidationConfigValidator : AbstractValidator RuleFor(o => o.Bar).Empty().WithMessage("Bar must be empty!"); } - diff --git a/tests/Sitko.Core.Configuration.Vault.Tests/ConfigurationTest.cs b/tests/Sitko.Core.Configuration.Vault.Tests/ConfigurationTest.cs index 548df4676..81757f3b4 100644 --- a/tests/Sitko.Core.Configuration.Vault.Tests/ConfigurationTest.cs +++ b/tests/Sitko.Core.Configuration.Vault.Tests/ConfigurationTest.cs @@ -15,7 +15,7 @@ public ConfigurationTest(ITestOutputHelper testOutputHelper) : base(testOutputHe [Fact] public async Task Get() { - var scope = await GetScopeAsync().ConfigureAwait(false); + var scope = await GetScopeAsync(); var config = scope.GetService>(); config.CurrentValue.Foo.Should().Be(scope.FirstConfig.Foo); config.CurrentValue.Bar.Should().Be(scope.FirstConfig.Bar); @@ -24,7 +24,7 @@ public async Task Get() [Fact] public async Task GetSecond() { - var scope = await GetScopeAsync().ConfigureAwait(false); + var scope = await GetScopeAsync(); var config = scope.GetService>(); config.CurrentValue.Foo.Should().Be(scope.SecondConfig.Foo); config.CurrentValue.Bar.Should().Be(scope.SecondConfig.Bar); @@ -33,7 +33,7 @@ public async Task GetSecond() [Fact] public async Task Module() { - var scope = await GetScopeAsync().ConfigureAwait(false); + var scope = await GetScopeAsync(); var config = scope.GetService>(); config.CurrentValue.Foo.Should().Be(scope.FirstConfig.Foo); config.CurrentValue.Bar.Should().Be(scope.FirstConfig.Bar); @@ -44,8 +44,8 @@ public async Task ModuleConfigValidationFailure() { var result = await Assert.ThrowsAsync(async () => { - await GetScopeAsync().ConfigureAwait(false); - }).ConfigureAwait(false); + await GetScopeAsync(); + }); result.Message.Should().Contain("Bar must be empty!"); } @@ -54,8 +54,8 @@ public async Task AppConfigurationCheckFailure() { var result = await Assert.ThrowsAsync(async () => { - await GetScopeAsync().ConfigureAwait(false); - }).ConfigureAwait(false); + await GetScopeAsync(); + }); result.Message.Should().Contain("No data loaded from Vault secrets NonExistingSecret"); } } diff --git a/tests/Sitko.Core.ElasticStack.Tests/ElasticStackScope.cs b/tests/Sitko.Core.ElasticStack.Tests/ElasticStackScope.cs index ca47c1191..db052b6ea 100644 --- a/tests/Sitko.Core.ElasticStack.Tests/ElasticStackScope.cs +++ b/tests/Sitko.Core.ElasticStack.Tests/ElasticStackScope.cs @@ -1,31 +1,18 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Hosting; using Serilog.Sinks.Elasticsearch; -using Sitko.Core.App.Web; using Sitko.Core.Xunit; namespace Sitko.Core.ElasticStack.Tests; -public class ElasticStackScope : BaseTestScope +public class ElasticStackScope : BaseTestScope { -} - -public class ElasticStartup : BaseStartup -{ - public ElasticStartup(IConfiguration configuration, IHostEnvironment environment) : base(configuration, - environment) - { - } -} - -public class ElasticApplication : WebApplication -{ - public ElasticApplication(string[] args) : base(args) => this.AddElasticStack(options => - { - options.ElasticSearchUrls = new List { new("http://localhost:9200") }; - options.LoggingTemplateVersion = AutoRegisterTemplateVersion.ESv8; - options.LoggingIndexFormat = "logs-test"; - options.EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog | EmitEventFailureHandling.RaiseCallback; - options.FailureCallback = e => Console.WriteLine("Unable to submit event to elastic: " + e.MessageTemplate); - }); + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddElasticStack(options => + { + options.ElasticSearchUrls = new List { new("http://localhost:9200") }; + options.LoggingTemplateVersion = AutoRegisterTemplateVersion.ESv8; + options.LoggingIndexFormat = "logs-test"; + options.EmitEventFailure = EmitEventFailureHandling.WriteToSelfLog | EmitEventFailureHandling.RaiseCallback; + options.FailureCallback = e => Console.WriteLine("Unable to submit event to elastic: " + e.MessageTemplate); + }); } diff --git a/tests/Sitko.Core.Email.Smtp.Tests/BasicTests.cs b/tests/Sitko.Core.Email.Smtp.Tests/BasicTests.cs index a5892bfc3..3ec58d8ce 100644 --- a/tests/Sitko.Core.Email.Smtp.Tests/BasicTests.cs +++ b/tests/Sitko.Core.Email.Smtp.Tests/BasicTests.cs @@ -1,6 +1,4 @@ -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; -using Sitko.Core.App.Web; using Sitko.Core.Email.Tests; using Sitko.Core.Xunit; using Xunit.Abstractions; @@ -14,29 +12,8 @@ public BasicTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper) } } -public class SmtpTestsScope : BaseTestScope +public class SmtpTestsScope : BaseTestScope { - protected override TestApplication CreateApplication() - { - var app = new TestApplication(Array.Empty()); - app.ConfigureAppConfiguration((_, builder) => - { - builder.AddJsonFile("appsettings.json"); - }); - return app; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddSmtpEmail(); } - -public class TestStartup : BaseStartup -{ - public TestStartup(IConfiguration configuration, IHostEnvironment environment) : base( - configuration, environment) - { - } -} - -public class TestApplication : WebApplication -{ - public TestApplication(string[] args) : base(args) => this.AddSmtpEmail(); -} - diff --git a/tests/Sitko.Core.Grpc.Client.Tests/ProviderTests.cs b/tests/Sitko.Core.Grpc.Client.Tests/ProviderTests.cs index 994ce4df3..2b624fa3d 100644 --- a/tests/Sitko.Core.Grpc.Client.Tests/ProviderTests.cs +++ b/tests/Sitko.Core.Grpc.Client.Tests/ProviderTests.cs @@ -1,5 +1,7 @@ using Grpc.Core; using Grpc.Core.Interceptors; +using Microsoft.Extensions.Hosting; +using Sitko.Core.App; using Sitko.Core.Grpc.Client.Discovery; using Sitko.Core.Xunit; using Xunit; @@ -41,19 +43,19 @@ public class TestInterceptor : Interceptor public class GrpcClientScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name) + base.ConfigureApplication(hostBuilder, name); + hostBuilder.AddSitkoCore() .AddModule, - TestGrpcClientModuleOptions - >( + TestGrpcClientModuleOptions>( moduleOptions => { moduleOptions.EnableHttp2UnencryptedSupport = true; moduleOptions.DisableCertificatesValidation = true; moduleOptions.AddInterceptor(); }); - return application; + return hostBuilder; } } diff --git a/tests/Sitko.Core.Grpc.Server.Tests/GrpcServerTest.cs b/tests/Sitko.Core.Grpc.Server.Tests/GrpcServerTest.cs index e67cb690e..f7ed43f9c 100644 --- a/tests/Sitko.Core.Grpc.Server.Tests/GrpcServerTest.cs +++ b/tests/Sitko.Core.Grpc.Server.Tests/GrpcServerTest.cs @@ -1,5 +1,7 @@ using Grpc.Net.Client; +using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.TestHost; +using Sitko.Core.App.Web; using Sitko.Core.Xunit; using Xunit; using Xunit.Abstractions; @@ -15,8 +17,12 @@ public GrpcServerTest(ITestOutputHelper testOutputHelper) : base(testOutputHelpe [Fact] public async Task TestResponse() { - var application = new TestApplication(Array.Empty()); - using var host = await application.StartAsync(); + var hostBuilder = WebApplication.CreateBuilder(); + hostBuilder.AddGrpcServer(options => options.RegisterService()); + hostBuilder.WebHost.UseTestServer(); + await using var host = hostBuilder.Build(); + host.MapSitkoCore(); + await host.StartAsync(); var service = host.GetTestServer(); var responseVersionHandler = new ResponseVersionHandler { InnerHandler = service.CreateHandler() }; var client = new HttpClient(responseVersionHandler) { BaseAddress = new Uri("http://localhost") }; @@ -40,4 +46,3 @@ protected override async Task SendAsync(HttpRequestMessage } } } - diff --git a/tests/Sitko.Core.Grpc.Server.Tests/TestApplication.cs b/tests/Sitko.Core.Grpc.Server.Tests/TestApplication.cs deleted file mode 100644 index 48206a2f1..000000000 --- a/tests/Sitko.Core.Grpc.Server.Tests/TestApplication.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.TestHost; -using Sitko.Core.App; -using Sitko.Core.App.Web; - -namespace Sitko.Core.Grpc.Server.Tests; - -public class TestApplication : WebApplication -{ - public TestApplication(string[] args) : base(args) => - this.AddGrpcServer(moduleOptions => - { - moduleOptions.RegisterService(); - }); - - protected override void ConfigureWebHostDefaults(IApplicationContext applicationContext, - IWebHostBuilder webHostBuilder) - { - base.ConfigureWebHostDefaults(applicationContext, webHostBuilder); - webHostBuilder.UseTestServer(); - } -} diff --git a/tests/Sitko.Core.Health.Teams.Tests/PublisherTest.cs b/tests/Sitko.Core.Health.Teams.Tests/PublisherTest.cs index 4ccf7a707..656e6d5c4 100644 --- a/tests/Sitko.Core.Health.Teams.Tests/PublisherTest.cs +++ b/tests/Sitko.Core.Health.Teams.Tests/PublisherTest.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; using Xunit; using Xunit.Abstractions; @@ -94,11 +95,6 @@ public async Task Degraded() public class TeamsPublisherTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddTeamsHealthReporter(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddTeamsHealthReporter(); } - diff --git a/tests/Sitko.Core.Health.Telegram.Tests/PublisherTest.cs b/tests/Sitko.Core.Health.Telegram.Tests/PublisherTest.cs index c57b0cc2b..304a7d9fd 100644 --- a/tests/Sitko.Core.Health.Telegram.Tests/PublisherTest.cs +++ b/tests/Sitko.Core.Health.Telegram.Tests/PublisherTest.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; using Xunit; using Xunit.Abstractions; @@ -94,11 +95,6 @@ public async Task Degraded() public class TelegramPublisherTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddTelegramHealthReporter(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddTelegramHealthReporter(); } - diff --git a/tests/Sitko.Core.ImgProxy.Tests/ImgProxyStorageTestsScope.cs b/tests/Sitko.Core.ImgProxy.Tests/ImgProxyStorageTestsScope.cs index 874954f7a..e72a170c6 100644 --- a/tests/Sitko.Core.ImgProxy.Tests/ImgProxyStorageTestsScope.cs +++ b/tests/Sitko.Core.ImgProxy.Tests/ImgProxyStorageTestsScope.cs @@ -1,20 +1,17 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Storage.FileSystem; using Sitko.Core.Storage.ImgProxy; -using Sitko.Core.Xunit; namespace Sitko.Core.ImgProxy.Tests; public class ImgProxyStorageTestsScope : ImgProxyTestsScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddFileSystemStorage(settings => - { - settings.PublicUri = new Uri("https://img.test.com"); - }); - application.AddImgProxyStorage(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddFileSystemStorage( + settings => + { + settings.PublicUri = new Uri("https://img.test.com"); + }) + .AddImgProxyStorage(); } - diff --git a/tests/Sitko.Core.ImgProxy.Tests/ImgProxyTestsScope.cs b/tests/Sitko.Core.ImgProxy.Tests/ImgProxyTestsScope.cs index 9f52346ba..6fb0db2be 100644 --- a/tests/Sitko.Core.ImgProxy.Tests/ImgProxyTestsScope.cs +++ b/tests/Sitko.Core.ImgProxy.Tests/ImgProxyTestsScope.cs @@ -1,20 +1,16 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; namespace Sitko.Core.ImgProxy.Tests; public class ImgProxyTestsScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddImgProxy(options => + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddImgProxy(options => { options.Host = "https://imgproxy.test.com"; options.Key = "1234"; options.Salt = "4567"; options.EncodeUrls = true; }); - return application; - } } - diff --git a/tests/Sitko.Core.Pdf.Tests/PdfTestScope.cs b/tests/Sitko.Core.Pdf.Tests/PdfTestScope.cs index f6b049850..bd4d88676 100644 --- a/tests/Sitko.Core.Pdf.Tests/PdfTestScope.cs +++ b/tests/Sitko.Core.Pdf.Tests/PdfTestScope.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Puppeteer; using Sitko.Core.Xunit; @@ -5,11 +6,8 @@ namespace Sitko.Core.Pdf.Tests; public class PdfTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddPuppeteer(); - application.AddPdfRenderer(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddPuppeteer() + .AddPuppeteer(); } diff --git a/tests/Sitko.Core.Queue.InMemory.Tests/MessageBusTests.cs b/tests/Sitko.Core.Queue.InMemory.Tests/MessageBusTests.cs index 33bcbd35a..0c9aaca4d 100644 --- a/tests/Sitko.Core.Queue.InMemory.Tests/MessageBusTests.cs +++ b/tests/Sitko.Core.Queue.InMemory.Tests/MessageBusTests.cs @@ -1,4 +1,5 @@ using MediatR; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.MediatR; using Sitko.Core.Queue.Tests; @@ -50,15 +51,10 @@ protected override void Configure(IApplicationContext applicationContext, options.TranslateMediatRNotification(); } - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddMediatR(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddMediatR(); } public class TestRequest : TestMessage, INotification { } - diff --git a/tests/Sitko.Core.Queue.Nats.Tests/MessageBusTests.cs b/tests/Sitko.Core.Queue.Nats.Tests/MessageBusTests.cs index 181d5f6a5..9007e40c4 100644 --- a/tests/Sitko.Core.Queue.Nats.Tests/MessageBusTests.cs +++ b/tests/Sitko.Core.Queue.Nats.Tests/MessageBusTests.cs @@ -1,4 +1,5 @@ using MediatR; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.MediatR; using Sitko.Core.Queue.Tests; @@ -48,15 +49,10 @@ protected override void ConfigureQueue(NatsQueueModuleOptions options, IApplicat options.TranslateMediatRNotification(); } - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddMediatR(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddMediatR(); } public class TestRequest : TestMessage, INotification { } - diff --git a/tests/Sitko.Core.Queue.Test/BaseQueueTest.cs b/tests/Sitko.Core.Queue.Test/BaseQueueTest.cs index 104b426e4..96b9045ab 100644 --- a/tests/Sitko.Core.Queue.Test/BaseQueueTest.cs +++ b/tests/Sitko.Core.Queue.Test/BaseQueueTest.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Xunit; using Xunit.Abstractions; @@ -20,13 +21,12 @@ public abstract class BaseQueueTestScope(( + base.ConfigureApplication(hostBuilder, name); + hostBuilder.AddSitkoCore().AddModule(( applicationContext, moduleOptions) => Configure(applicationContext, moduleOptions, name)); - - return application; + return hostBuilder; } protected abstract void Configure(IApplicationContext applicationContext, TQueueModuleOptions options, diff --git a/tests/Sitko.Core.Queue.Test/MessageBusTests.cs b/tests/Sitko.Core.Queue.Test/MessageBusTests.cs index a1ddaea5a..ec9c0b231 100644 --- a/tests/Sitko.Core.Queue.Test/MessageBusTests.cs +++ b/tests/Sitko.Core.Queue.Test/MessageBusTests.cs @@ -1,7 +1,7 @@ using MediatR; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.MediatR; -using Sitko.Core.Xunit; using Xunit; using Xunit.Abstractions; @@ -41,12 +41,8 @@ public async Task TranslateNotification() public class MessageBusTestScope : BaseTestQueueTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddMediatR(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddMediatR(); protected override void Configure(IApplicationContext applicationContext, TestQueueOptions options, string name) => @@ -56,4 +52,3 @@ protected override void Configure(IApplicationContext applicationContext, public class TestRequest : TestMessage, INotification { } - diff --git a/tests/Sitko.Core.Queue.Test/MiddlewareTests.cs b/tests/Sitko.Core.Queue.Test/MiddlewareTests.cs index e910eeac7..2f8214c94 100644 --- a/tests/Sitko.Core.Queue.Test/MiddlewareTests.cs +++ b/tests/Sitko.Core.Queue.Test/MiddlewareTests.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Xunit; using Xunit; @@ -94,9 +95,12 @@ protected override void Configure(IApplicationContext applicationContext, public class MultipleMiddlewareQueueTestScope : BaseTestQueueTestScope { - protected override IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => - base.ConfigureServices(applicationContext, services, name).AddSingleton(); + protected override IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) + { + base.ConfigureServices(builder, name); + builder.Services.AddSingleton(); + return builder; + } protected override void Configure(IApplicationContext applicationContext, TestQueueOptions options, string name) => @@ -105,9 +109,12 @@ protected override void Configure(IApplicationContext applicationContext, public class ChainMiddlewareQueueTestScope : BaseTestQueueTestScope { - protected override IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => - base.ConfigureServices(applicationContext, services, name).AddSingleton(); + protected override IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) + { + base.ConfigureServices(builder, name); + builder.Services.AddSingleton(); + return builder; + } protected override void Configure(IApplicationContext applicationContext, TestQueueOptions options, string name) @@ -176,4 +183,3 @@ public override async Task ReceiveAsync(T message, QueueMessageContext return result; } } - diff --git a/tests/Sitko.Core.Queue.Test/ProcessorTests.cs b/tests/Sitko.Core.Queue.Test/ProcessorTests.cs index 358b61d8f..da1562485 100644 --- a/tests/Sitko.Core.Queue.Test/ProcessorTests.cs +++ b/tests/Sitko.Core.Queue.Test/ProcessorTests.cs @@ -1,4 +1,5 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Sitko.Core.App; using Sitko.Core.Xunit; using Xunit; @@ -94,10 +95,12 @@ public class TestQueueProcessorCounter public class ProcessorQueueTestScope : BaseTestQueueTestScope { - protected override IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => - base.ConfigureServices(applicationContext, services, name) - .AddSingleton(); + protected override IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) + { + base.ConfigureServices(builder, name); + builder.Services.AddSingleton(); + return builder; + } protected override void Configure(IApplicationContext applicationContext, TestQueueOptions options, string name) => @@ -106,13 +109,14 @@ protected override void Configure(IApplicationContext applicationContext, public class MultipleProcessorQueueTestScope : BaseTestQueueTestScope { - protected override IServiceCollection ConfigureServices(IApplicationContext applicationContext, - IServiceCollection services, string name) => - base.ConfigureServices(applicationContext, services, name) - .AddSingleton(); + protected override IHostApplicationBuilder ConfigureServices(IHostApplicationBuilder builder, string name) + { + base.ConfigureServices(builder, name); + builder.Services.AddSingleton(); + return builder; + } protected override void Configure(IApplicationContext applicationContext, TestQueueOptions options, string name) => options.RegisterProcessors(); } - diff --git a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/EFTestScope.cs b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/EFTestScope.cs index 16370f631..0af3edcfd 100644 --- a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/EFTestScope.cs +++ b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/EFTestScope.cs @@ -1,17 +1,19 @@ using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.Hosting; using Serilog.Events; using Sitko.Core.App; using Sitko.Core.Db.Postgres; using Sitko.Core.Repository.Tests.Data; -using Sitko.Core.Xunit; namespace Sitko.Core.Repository.EntityFrameworkCore.Tests.Data; public class EFTestScope : BaseEFTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - application.AddEFRepositories(options => + hostBuilder.AddSitkoCore().ConfigureLogging((_, configuration) => + configuration.MinimumLevel.Override("Sitko.Core.Repository", LogEventLevel.Debug)); + return base.ConfigureApplication(hostBuilder, name).AddEFRepositories(options => { options.AddRepository(); options.AddRepository(); @@ -19,9 +21,6 @@ protected override TestApplication ConfigureApplication(TestApplication applicat options.AddRepository(); options.AddRepositoriesFromAssemblyOf(); }); - application.ConfigureLogging((_, configuration) => - configuration.MinimumLevel.Override("Sitko.Core.Repository", LogEventLevel.Debug)); - return base.ConfigureApplication(application, name); } protected override void ConfigurePostgresDatabaseModule(IApplicationContext applicationContext, diff --git a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/MultipleDbContextsTestScope.cs b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/MultipleDbContextsTestScope.cs index a39b02acf..623a2ebb7 100644 --- a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/MultipleDbContextsTestScope.cs +++ b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/MultipleDbContextsTestScope.cs @@ -1,15 +1,15 @@ -using Sitko.Core.Repository.Tests.Data; -using Sitko.Core.Xunit; +using Microsoft.Extensions.Hosting; +using Sitko.Core.Repository.Tests.Data; namespace Sitko.Core.Repository.EntityFrameworkCore.Tests.Data; public class MultipleDbContextsTestScope : EFTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - AddDbContext(application, name); - application.AddEFRepositories(); - return application; + base.ConfigureApplication(hostBuilder, name); + AddDbContext(hostBuilder, name); + hostBuilder.AddEFRepositories(); + return hostBuilder; } } diff --git a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/TPH/TPHDbContextsTestScope.cs b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/TPH/TPHDbContextsTestScope.cs index d8eb9eee2..86cffe9ba 100644 --- a/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/TPH/TPHDbContextsTestScope.cs +++ b/tests/Sitko.Core.Repository.EntityFrameworkCore.Tests/Data/TPH/TPHDbContextsTestScope.cs @@ -1,8 +1,9 @@ -using Sitko.Core.Xunit; +using Microsoft.Extensions.Hosting; +using Sitko.Core.Xunit; namespace Sitko.Core.Repository.EntityFrameworkCore.Tests.Data.TPH; -public class TPHDbContextsTestScope : DbBaseTestScope +public class TPHDbContextsTestScope : DbBaseTestScope { protected override async Task InitDbContextAsync(TPHDbContext dbContext) { @@ -13,6 +14,10 @@ await dbContext.AddAsync( new SecondTPHClass { Baz = "213", Config = new SecondTPHClassConfig { Second = "456" }, Foo = "789" }); await dbContext.SaveChangesAsync(); } + + protected override HostApplicationBuilder CreateHostBuilder() => Host.CreateApplicationBuilder(); + + protected override IHost BuildApplication(HostApplicationBuilder builder) => builder.Build(); } public class TPHDbContextsTestScopeConfig : BaseDbTestConfig diff --git a/tests/Sitko.Core.Repository.Remote.Tests/Data/RemoteRepositoryTestScope.cs b/tests/Sitko.Core.Repository.Remote.Tests/Data/RemoteRepositoryTestScope.cs index e48ebfee5..f7f3ce925 100644 --- a/tests/Sitko.Core.Repository.Remote.Tests/Data/RemoteRepositoryTestScope.cs +++ b/tests/Sitko.Core.Repository.Remote.Tests/Data/RemoteRepositoryTestScope.cs @@ -1,31 +1,33 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Serilog.Events; +using Sitko.Core.App; using Sitko.Core.Db.Postgres; using Sitko.Core.Repository.EntityFrameworkCore; using Sitko.Core.Repository.Remote.Tests.Server; using Sitko.Core.Repository.Tests.Data; -using Sitko.Core.Xunit; using Sitko.Core.Xunit.Web; namespace Sitko.Core.Repository.Remote.Tests.Data; public class RemoteRepositoryTestScope : WebTestScope { - protected override WebTestApplication ConfigureWebApplication(WebTestApplication application, string name) + protected override WebApplicationBuilder ConfigureWebApplication(WebApplicationBuilder webApplicationBuilder, + string name) { - base.ConfigureWebApplication(application, name); - application.AddPostgresDatabase(options => - { - options.Database = name; - options.EnableSensitiveLogging = true; - }); - application.AddEFRepositories(options => - { - options.AddRepository(); - options.AddRepository(); - options.AddRepository(); - }); - return application; + base.ConfigureWebApplication(webApplicationBuilder, name).AddPostgresDatabase(options => + { + options.Database = name; + options.EnableSensitiveLogging = true; + }) + .AddEFRepositories(options => + { + options.AddRepository(); + options.AddRepository(); + options.AddRepository(); + }); + return webApplicationBuilder; } protected override async Task InitWebApplicationAsync(IServiceProvider hostServices) @@ -97,33 +99,31 @@ protected override async Task InitWebApplicationAsync(IServiceProvider hostServi await dbContext.SaveChangesAsync(); } - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - application.AddRemoteRepositories(options => - { - options.AddRepository(); - options.AddRepository(); - options.AddRepository(); - options.AddRepositoriesFromAssemblyOf(); - }); - application.AddHttpRepositoryTransport(options => - { - options.RepositoryControllerApiRoute = new Uri(Server!.BaseAddress, "http://localhost"); - if (Server is not null) + base.ConfigureApplication(hostBuilder, name); + hostBuilder.AddSitkoCore().ConfigureLogging((_, configuration) => + configuration.MinimumLevel.Override("Sitko.Core.Repository", LogEventLevel.Debug)) + .AddRemoteRepositories(options => + { + options.AddRepository(); + options.AddRepository(); + options.AddRepository(); + options.AddRepositoriesFromAssemblyOf(); + }) + .AddHttpRepositoryTransport(options => { - options.HttpClientFactory = _ => + options.RepositoryControllerApiRoute = new Uri(Server!.BaseAddress, "http://localhost"); + if (Server is not null) { - var client = Server.CreateClient(); - client.BaseAddress = new Uri(client.BaseAddress!, "/api"); - return client; - }; - } - }); - application.ConfigureLogging((_, configuration) => - configuration.MinimumLevel.Override("Sitko.Core.Repository", LogEventLevel.Debug)); - - return application; + options.HttpClientFactory = _ => + { + var client = Server.CreateClient(); + client.BaseAddress = new Uri(client.BaseAddress!, "/api"); + return client; + }; + } + }); + return hostBuilder; } } - diff --git a/tests/Sitko.Core.Repository.Remote.Tests/RemoteRepositoryTests.cs b/tests/Sitko.Core.Repository.Remote.Tests/RemoteRepositoryTests.cs index 94b6a9523..b04bca644 100644 --- a/tests/Sitko.Core.Repository.Remote.Tests/RemoteRepositoryTests.cs +++ b/tests/Sitko.Core.Repository.Remote.Tests/RemoteRepositoryTests.cs @@ -20,7 +20,7 @@ public async Task GetAll() var repo = scope.GetService(); var result = await repo.GetAllAsync(); - Assert.NotNull(result.items); + result.items.Should().NotBeEmpty(); } [Fact] diff --git a/tests/Sitko.Core.Search.ElasticSearch.Tests/ElasticSearchTests.cs b/tests/Sitko.Core.Search.ElasticSearch.Tests/ElasticSearchTests.cs index 369fa53cb..4e865ca0a 100644 --- a/tests/Sitko.Core.Search.ElasticSearch.Tests/ElasticSearchTests.cs +++ b/tests/Sitko.Core.Search.ElasticSearch.Tests/ElasticSearchTests.cs @@ -1,5 +1,6 @@ using System.Globalization; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Sitko.Core.Xunit; using Xunit; @@ -50,21 +51,18 @@ public async Task Search() public class ElasticSearchTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) { - base.ConfigureApplication(application, name); - application.AddElasticSearch(moduleOptions => + base.ConfigureApplication(hostBuilder, name); + hostBuilder.AddElasticSearch(moduleOptions => { moduleOptions.Prefix = name.ToLower(CultureInfo.InvariantCulture); moduleOptions.EnableClientLogging = true; }); - application.ConfigureServices(services => - { - services.AddSingleton(); - services.RegisterSearchProvider(); - }); - return application; + hostBuilder.Services.AddSingleton(); + hostBuilder.Services.RegisterSearchProvider(); + return hostBuilder; } } @@ -117,4 +115,3 @@ public TestModelProvider AddModel(TestModel model) return this; } } - diff --git a/tests/Sitko.Core.SonyFlake.Tests/SonyFlakeTest.cs b/tests/Sitko.Core.SonyFlake.Tests/SonyFlakeTest.cs index 4f3056d45..c4ca99349 100644 --- a/tests/Sitko.Core.SonyFlake.Tests/SonyFlakeTest.cs +++ b/tests/Sitko.Core.SonyFlake.Tests/SonyFlakeTest.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.IdProvider; using Sitko.Core.IdProvider.SonyFlake; using Sitko.Core.Xunit; @@ -27,10 +28,6 @@ public async Task Generate() public class SonyFlakeTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - application.AddSonyFlakeIdProvider(); - return base.ConfigureApplication(application, name); - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddSonyFlakeIdProvider(); } - diff --git a/tests/Sitko.Core.Storage.FileSystem.Tests/BaseFileSystemStorageTestScope.cs b/tests/Sitko.Core.Storage.FileSystem.Tests/BaseFileSystemStorageTestScope.cs index c4d401c7b..d9589a55f 100644 --- a/tests/Sitko.Core.Storage.FileSystem.Tests/BaseFileSystemStorageTestScope.cs +++ b/tests/Sitko.Core.Storage.FileSystem.Tests/BaseFileSystemStorageTestScope.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; namespace Sitko.Core.Storage.FileSystem.Tests; @@ -6,18 +7,15 @@ public class BaseFileSystemStorageTestScope : BaseTestScope { private readonly string folder = Path.GetTempPath() + "/" + Guid.NewGuid(); - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddFileSystemStorage( - moduleOptions => - { - moduleOptions.PublicUri = new Uri(folder); - moduleOptions.StoragePath = folder; - }); - application.AddFileSystemStorageMetadata(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddFileSystemStorage( + moduleOptions => + { + moduleOptions.PublicUri = new Uri(folder); + moduleOptions.StoragePath = folder; + }) + .AddFileSystemStorageMetadata(); protected override async Task OnDisposeAsync() { @@ -26,4 +24,3 @@ protected override async Task OnDisposeAsync() await storage.DeleteAllAsync(); } } - diff --git a/tests/Sitko.Core.Storage.FileSystem.Tests/MultipleStorageTests.cs b/tests/Sitko.Core.Storage.FileSystem.Tests/MultipleStorageTests.cs index db09d7f84..8da40903b 100644 --- a/tests/Sitko.Core.Storage.FileSystem.Tests/MultipleStorageTests.cs +++ b/tests/Sitko.Core.Storage.FileSystem.Tests/MultipleStorageTests.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; using Xunit; using Xunit.Abstractions; @@ -41,28 +42,25 @@ public async Task Specific() [UsedImplicitly] public class MultipleStorageTestsScope : BaseFileSystemStorageTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddFileSystemStorage( - moduleOptions => - { - var folder = Path.GetTempPath() + "/" + Guid.NewGuid(); - moduleOptions.PublicUri = new Uri(folder); - moduleOptions.StoragePath = folder; - moduleOptions.IsDefault = true; - }); - application.AddFileSystemStorageMetadata(); - application.AddFileSystemStorage( - moduleOptions => - { - var folder = Path.GetTempPath() + "/" + Guid.NewGuid(); - moduleOptions.PublicUri = new Uri(folder); - moduleOptions.StoragePath = folder; - }); - application.AddFileSystemStorageMetadata(); - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddFileSystemStorage( + moduleOptions => + { + var folder = Path.GetTempPath() + "/" + Guid.NewGuid(); + moduleOptions.PublicUri = new Uri(folder); + moduleOptions.StoragePath = folder; + moduleOptions.IsDefault = true; + }) + .AddFileSystemStorageMetadata() + .AddFileSystemStorage( + moduleOptions => + { + var folder = Path.GetTempPath() + "/" + Guid.NewGuid(); + moduleOptions.PublicUri = new Uri(folder); + moduleOptions.StoragePath = folder; + }) + .AddFileSystemStorageMetadata(); } public class MultipleStorageTestsOptionsSecond : StorageOptions, IFileSystemStorageOptions @@ -74,4 +72,3 @@ public class MultipleStorageTestsOptionsThird : StorageOptions, IFileSystemStora { public string StoragePath { get; set; } = "/tmp/storage/third"; } - diff --git a/tests/Sitko.Core.Storage.Metadata.Postgres.Tests/BasePostgresStorageTestScope.cs b/tests/Sitko.Core.Storage.Metadata.Postgres.Tests/BasePostgresStorageTestScope.cs index b926908a3..0d7270215 100644 --- a/tests/Sitko.Core.Storage.Metadata.Postgres.Tests/BasePostgresStorageTestScope.cs +++ b/tests/Sitko.Core.Storage.Metadata.Postgres.Tests/BasePostgresStorageTestScope.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Storage.S3; using Sitko.Core.Xunit; @@ -5,21 +6,17 @@ namespace Sitko.Core.Storage.Metadata.Postgres.Tests; public class BasePostgresStorageTestScope : BaseTestScope { - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddS3Storage(moduleOptions => - { - moduleOptions.Bucket = name.ToLowerInvariant(); - moduleOptions.Prefix = "test"; - }); - application.AddPostgresStorageMetadata( - moduleOptions => + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddS3Storage(moduleOptions => + { + moduleOptions.Bucket = name.ToLowerInvariant(); + moduleOptions.Prefix = "test"; + }) + .AddPostgresStorageMetadata(moduleOptions => { moduleOptions.Database = name; }); - return application; - } protected override async Task OnDisposeAsync() { @@ -28,4 +25,3 @@ protected override async Task OnDisposeAsync() await storage.DeleteAllAsync(); } } - diff --git a/tests/Sitko.Core.Storage.Remote.Tests/BaseRemoteStorageTestScope.cs b/tests/Sitko.Core.Storage.Remote.Tests/BaseRemoteStorageTestScope.cs index 9ca7323c4..7f7121fb7 100644 --- a/tests/Sitko.Core.Storage.Remote.Tests/BaseRemoteStorageTestScope.cs +++ b/tests/Sitko.Core.Storage.Remote.Tests/BaseRemoteStorageTestScope.cs @@ -1,6 +1,5 @@ using Sitko.Core.Storage.Remote.Tests.Server; using Sitko.Core.Storage.S3; -using Sitko.Core.Xunit; using Sitko.Core.Xunit.Web; namespace Sitko.Core.Storage.Remote.Tests; @@ -9,26 +8,25 @@ public class BaseRemoteStorageTestScope : WebTestScope { private readonly Guid bucketName = Guid.NewGuid(); - protected override WebTestApplication ConfigureWebApplication(WebTestApplication application, string name) + protected override WebApplicationBuilder ConfigureWebApplication(WebApplicationBuilder webApplicationBuilder, + string name) { - base.ConfigureWebApplication(application, name); - application.AddS3Storage(moduleOptions => - { - moduleOptions.Bucket = bucketName.ToString().ToLowerInvariant(); - moduleOptions.Prefix = "test"; - var baseUrl = moduleOptions.Server!; - var path = moduleOptions.Bucket; - moduleOptions.PublicUri = new Uri(baseUrl, path + "/"); - moduleOptions.BucketPolicy = moduleOptions.AnonymousReadPolicy; - }) + base.ConfigureWebApplication(webApplicationBuilder, name).AddS3Storage( + moduleOptions => + { + moduleOptions.Bucket = bucketName.ToString().ToLowerInvariant(); + moduleOptions.Prefix = "test"; + var baseUrl = moduleOptions.Server!; + var path = moduleOptions.Bucket; + moduleOptions.PublicUri = new Uri(baseUrl, path + "/"); + moduleOptions.BucketPolicy = moduleOptions.AnonymousReadPolicy; + }) .AddS3StorageMetadata(); - return application; + return webApplicationBuilder; } - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddRemoteStorage(moduleOptions => + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name).AddRemoteStorage(moduleOptions => { moduleOptions.PublicUri = new Uri("https://localhost"); if (Server is not null) @@ -42,8 +40,4 @@ protected override TestApplication ConfigureApplication(TestApplication applicat }; } }); - - return application; - } } - diff --git a/tests/Sitko.Core.Storage.S3.Tests/BaseS3StorageTestScope.cs b/tests/Sitko.Core.Storage.S3.Tests/BaseS3StorageTestScope.cs index 906693e3f..77851ca70 100644 --- a/tests/Sitko.Core.Storage.S3.Tests/BaseS3StorageTestScope.cs +++ b/tests/Sitko.Core.Storage.S3.Tests/BaseS3StorageTestScope.cs @@ -1,3 +1,4 @@ +using Microsoft.Extensions.Hosting; using Sitko.Core.Xunit; namespace Sitko.Core.Storage.S3.Tests; @@ -6,18 +7,14 @@ public class BaseS3StorageTestScope : BaseTestScope { private readonly Guid bucketName = Guid.NewGuid(); - protected override TestApplication ConfigureApplication(TestApplication application, string name) - { - base.ConfigureApplication(application, name); - application.AddS3Storage(moduleOptions => - { - moduleOptions.Bucket = bucketName.ToString().ToLowerInvariant(); - moduleOptions.Prefix = "test"; - }); - application.AddS3StorageMetadata(); - - return application; - } + protected override IHostApplicationBuilder ConfigureApplication(IHostApplicationBuilder hostBuilder, string name) => + base.ConfigureApplication(hostBuilder, name) + .AddS3Storage(moduleOptions => + { + moduleOptions.Bucket = bucketName.ToString().ToLowerInvariant(); + moduleOptions.Prefix = "test"; + }) + .AddS3StorageMetadata(); protected override async Task OnDisposeAsync() { @@ -26,4 +23,3 @@ protected override async Task OnDisposeAsync() await storage.DeleteAllAsync(); } } -