diff --git a/Hosts/Moonlight.Api.Host/Moonlight.Api.Host.csproj b/Hosts/Moonlight.Api.Host/Moonlight.Api.Host.csproj index 052019ff..8a17de03 100644 --- a/Hosts/Moonlight.Api.Host/Moonlight.Api.Host.csproj +++ b/Hosts/Moonlight.Api.Host/Moonlight.Api.Host.csproj @@ -7,9 +7,6 @@ - - - all runtime; build; native; analyzers; buildtransitive diff --git a/Hosts/Moonlight.Api.Host/Program.cs b/Hosts/Moonlight.Api.Host/Program.cs index dc76f08c..6a748360 100644 --- a/Hosts/Moonlight.Api.Host/Program.cs +++ b/Hosts/Moonlight.Api.Host/Program.cs @@ -1,27 +1,9 @@ -using Moonlight.Api.Startup; +using Moonlight.Api; using SimplePlugin.Generated; -var modules = PluginRegistry.Modules - .OfType() +var plugins = PluginRegistry + .Modules + .OfType() .ToArray(); -var builder = WebApplication.CreateBuilder(args); - -foreach (var startup in modules) - startup.PreBuild(builder); - -var app = builder.Build(); - -foreach (var startup in modules) - startup.PostBuild(app); - -foreach (var startup in modules) - startup.PostMiddleware(app); - -if (app.Environment.IsDevelopment()) - app.UseWebAssemblyDebugging(); - -app.UseBlazorFrameworkFiles(); -app.UseStaticFiles(); - -await app.RunAsync(); \ No newline at end of file +await StartupHandler.RunAsync(args, plugins); \ No newline at end of file diff --git a/Hosts/Moonlight.Frontend.Host/Program.cs b/Hosts/Moonlight.Frontend.Host/Program.cs index de4aecc0..eff3e47c 100644 --- a/Hosts/Moonlight.Frontend.Host/Program.cs +++ b/Hosts/Moonlight.Frontend.Host/Program.cs @@ -1,20 +1,9 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; -using Moonlight.Frontend.Startup; +using Moonlight.Frontend; using SimplePlugin.Generated; -var modules = PluginRegistry +var plugins = PluginRegistry .Modules - .OfType() + .OfType() .ToArray(); -var builder = WebAssemblyHostBuilder.CreateDefault(args); - -foreach (var startup in modules) - startup.PreBuild(builder); - -var app = builder.Build(); - -foreach(var startup in modules) - startup.PostBuild(app); - -await app.RunAsync(); \ No newline at end of file +await StartupHandler.RunAsync(args, plugins); \ No newline at end of file diff --git a/Moonlight.Api/Moonlight.Api.csproj b/Moonlight.Api/Moonlight.Api.csproj index d1125b26..6befadc4 100644 --- a/Moonlight.Api/Moonlight.Api.csproj +++ b/Moonlight.Api/Moonlight.Api.csproj @@ -25,6 +25,7 @@ + diff --git a/Moonlight.Api/MoonlightPlugin.cs b/Moonlight.Api/MoonlightPlugin.cs new file mode 100644 index 00000000..2b5441fd --- /dev/null +++ b/Moonlight.Api/MoonlightPlugin.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Builder; +using SimplePlugin.Abstractions; + +namespace Moonlight.Api; + +public abstract class MoonlightPlugin : IPluginModule +{ + protected MoonlightPlugin[] Plugins { get; private set; } + + public void Initialize(MoonlightPlugin[] plugins) + { + Plugins = plugins; + } + + public virtual void PreBuild(WebApplicationBuilder builder) + { + } + + public virtual void PostBuild(WebApplication application) + { + } + + public virtual void PostMiddleware(WebApplication application) + { + } +} \ No newline at end of file diff --git a/Moonlight.Api/Startup/IAppStartup.cs b/Moonlight.Api/Startup/IAppStartup.cs deleted file mode 100644 index 20fcaf3f..00000000 --- a/Moonlight.Api/Startup/IAppStartup.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using SimplePlugin.Abstractions; - -namespace Moonlight.Api.Startup; - -public interface IAppStartup : IPluginModule -{ - public void PreBuild(WebApplicationBuilder builder); - public void PostBuild(WebApplication application); - public void PostMiddleware(WebApplication application); -} \ No newline at end of file diff --git a/Moonlight.Api/Startup/Startup.Base.cs b/Moonlight.Api/Startup/Startup.Base.cs index 1c4d1e91..daa0c912 100644 --- a/Moonlight.Api/Startup/Startup.Base.cs +++ b/Moonlight.Api/Startup/Startup.Base.cs @@ -16,16 +16,19 @@ namespace Moonlight.Api.Startup; public partial class Startup { - private static void AddBase(WebApplicationBuilder builder) + private void AddBase(WebApplicationBuilder builder) { // Create the base directory Directory.CreateDirectory("storage"); - // Hook up source-generated serialization - builder.Services.AddControllers().AddJsonOptions(options => - { - options.JsonSerializerOptions.TypeInfoResolverChain.Add(SerializationContext.Default); - }); + // Hook up source-generated serialization and add controllers + builder.Services + .AddControllers() + .AddApplicationPart(typeof(Startup).Assembly) + .AddJsonOptions(options => + { + options.JsonSerializerOptions.TypeInfoResolverChain.Add(SerializationContext.Default); + }); // Configure logging builder.Logging.ClearProviders(); @@ -53,10 +56,10 @@ public partial class Startup // Container Helper Options builder.Configuration.GetSection("Moonlight:ContainerHelper").Bind(builder.Configuration); - + builder.Services.AddOptions().BindConfiguration("Moonlight:ContainerHelper"); builder.Services.AddSingleton(); - + builder.Services.AddHttpClient("ContainerHelper", (provider, client) => { var options = provider.GetRequiredService>(); diff --git a/Moonlight.Api/Startup/Startup.cs b/Moonlight.Api/Startup/Startup.cs index b785d7df..6844ebcb 100644 --- a/Moonlight.Api/Startup/Startup.cs +++ b/Moonlight.Api/Startup/Startup.cs @@ -1,12 +1,15 @@ -using Microsoft.AspNetCore.Builder; +using System.Reflection; +using System.Text.Json.Serialization; +using Microsoft.AspNetCore.Builder; +using Moonlight.Shared.Http; using SimplePlugin.Abstractions; namespace Moonlight.Api.Startup; [PluginModule] -public partial class Startup : IAppStartup +public partial class Startup : MoonlightPlugin { - public void PreBuild(WebApplicationBuilder builder) + public override void PreBuild(WebApplicationBuilder builder) { AddBase(builder); AddAuth(builder); @@ -14,13 +17,13 @@ public partial class Startup : IAppStartup AddCache(builder); } - public void PostBuild(WebApplication application) + public override void PostBuild(WebApplication application) { UseBase(application); UseAuth(application); } - public void PostMiddleware(WebApplication application) + public override void PostMiddleware(WebApplication application) { MapBase(application); } diff --git a/Moonlight.Api/StartupHandler.cs b/Moonlight.Api/StartupHandler.cs new file mode 100644 index 00000000..3495e373 --- /dev/null +++ b/Moonlight.Api/StartupHandler.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Hosting; + +namespace Moonlight.Api; + +public static class StartupHandler +{ + public static async Task RunAsync(string[] args, MoonlightPlugin[] plugins) + { + Console.WriteLine($"Starting with: {string.Join(", ", plugins.Select(x => x.GetType().FullName))}"); + + var builder = WebApplication.CreateBuilder(args); + + // Setting up context + foreach (var plugin in plugins) + plugin.Initialize(plugins); + + // Stage 1: Pre Build + foreach (var startup in plugins) + startup.PreBuild(builder); + + var app = builder.Build(); + + // Stage 2: Post Build + foreach (var startup in plugins) + startup.PostBuild(app); + + // Stage 3: Post Middleware + foreach (var startup in plugins) + startup.PostMiddleware(app); + + // Frontend debugging + if (app.Environment.IsDevelopment()) + app.UseWebAssemblyDebugging(); + + // Frontend hosting + app.UseBlazorFrameworkFiles(); + app.UseStaticFiles(); + + await app.RunAsync(); + } +} \ No newline at end of file diff --git a/Moonlight.Frontend/MoonlightPlugin.cs b/Moonlight.Frontend/MoonlightPlugin.cs new file mode 100644 index 00000000..c5ca0592 --- /dev/null +++ b/Moonlight.Frontend/MoonlightPlugin.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using SimplePlugin.Abstractions; + +namespace Moonlight.Frontend; + +public abstract class MoonlightPlugin : IPluginModule +{ + public virtual void PreBuild(WebAssemblyHostBuilder builder){} + public virtual void PostBuild(WebAssemblyHost application){} +} \ No newline at end of file diff --git a/Moonlight.Frontend/Startup/Startup.cs b/Moonlight.Frontend/Startup/Startup.cs index 3a03308a..8c461ca6 100644 --- a/Moonlight.Frontend/Startup/Startup.cs +++ b/Moonlight.Frontend/Startup/Startup.cs @@ -4,15 +4,15 @@ using SimplePlugin.Abstractions; namespace Moonlight.Frontend.Startup; [PluginModule] -public partial class Startup : IAppStartup +public partial class Startup : MoonlightPlugin { - public void PreBuild(WebAssemblyHostBuilder builder) + public override void PreBuild(WebAssemblyHostBuilder builder) { AddBase(builder); AddAuth(builder); } - public void PostBuild(WebAssemblyHost application) + public override void PostBuild(WebAssemblyHost application) { } diff --git a/Moonlight.Frontend/StartupHandler.cs b/Moonlight.Frontend/StartupHandler.cs new file mode 100644 index 00000000..f8522516 --- /dev/null +++ b/Moonlight.Frontend/StartupHandler.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; + +namespace Moonlight.Frontend; + +public static class StartupHandler +{ + public static async Task RunAsync(string[] args, MoonlightPlugin[] plugins) + { + Console.WriteLine($"Starting with: {string.Join(", ", plugins.Select(x => x.GetType().FullName))}"); + + var builder = WebAssemblyHostBuilder.CreateDefault(args); + + foreach (var plugin in plugins) + plugin.PreBuild(builder); + + var app = builder.Build(); + + foreach(var plugin in plugins) + plugin.PostBuild(app); + + await app.RunAsync(); + } +} \ No newline at end of file