From 6b6325eeaf81ba4001d92fe16023ad0518810633 Mon Sep 17 00:00:00 2001 From: Eveldee Date: Fri, 4 Jun 2021 20:41:04 +0200 Subject: [PATCH] Add DI support to CliFx --- Akari.Prototype.Server/Program.cs | 52 ++++++++++++++++++++++++++----- Akari.Prototype.Server/Startup.cs | 15 ++++++--- 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/Akari.Prototype.Server/Program.cs b/Akari.Prototype.Server/Program.cs index 071759c..b3fd407 100644 --- a/Akari.Prototype.Server/Program.cs +++ b/Akari.Prototype.Server/Program.cs @@ -1,3 +1,4 @@ +using Akari.Prototype.Server.Cli.Commands; using Akari.Prototype.Server.Options; using CliFx; using Microsoft.AspNetCore.Hosting; @@ -16,16 +17,43 @@ namespace Akari.Prototype.Server { public class Program { - public static async Task Main() => - await new CliApplicationBuilder() + public static async Task Main(string[] args) + { + if (args?.Length > 0) + { + return await CliMain(); + + } + + await AspMain(null); + + return 0; + } + + private static async Task CliMain() + { + var host = CreateCliHostBuilder(null).Build(); + + CheckHostOptions(host); + + return await new CliApplicationBuilder() .AddCommandsFromThisAssembly() + .UseTypeActivator(host.Services.GetService) .Build() .RunAsync(); + } public static async Task AspMain(string[] args) { - var host = CreateHostBuilder(args).Build(); + var host = CreateWebHostBuilder(args).Build(); + CheckHostOptions(host); + + await host.RunAsync(); + } + + private static void CheckHostOptions(IHost host) + { var services = host.Services; var akariOptions = services.GetRequiredService>().Value; @@ -33,13 +61,21 @@ namespace Akari.Prototype.Server { Directory.CreateDirectory(akariOptions.DataPath); } - - await host.RunAsync(); } - // Additional configuration is required to successfully run gRPC on macOS. - // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 - public static IHostBuilder CreateHostBuilder(string[] args) => + public static IHostBuilder CreateCliHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureHostConfiguration(configuration => + { + configuration.AddJsonFile(TcpProviderOptions.FilePath, true); + configuration.AddJsonFile(AkariOptions.FilePath, false); + }) + .ConfigureServices((hostContext, services) => + { + Startup.ConfigureStandardServices(hostContext.Configuration, services); + }); + + public static IHostBuilder CreateWebHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureHostConfiguration(configuration => { diff --git a/Akari.Prototype.Server/Startup.cs b/Akari.Prototype.Server/Startup.cs index f204021..e433b65 100644 --- a/Akari.Prototype.Server/Startup.cs +++ b/Akari.Prototype.Server/Startup.cs @@ -28,21 +28,26 @@ namespace Akari.Prototype.Server { services.AddGrpc(); + ConfigureStandardServices(Configuration, services); + + services.AddHostedService(); + services.AddHostedService(); + } + + public static void ConfigureStandardServices(IConfiguration configuration, IServiceCollection services) + { services.AddOptions() - .Bind(Configuration.GetSection(TcpProviderOptions.SectionPath)) + .Bind(configuration.GetSection(TcpProviderOptions.SectionPath)) .ValidateDataAnnotations(); services.AddOptions() - .Bind(Configuration.GetSection(AkariOptions.SectionPath)) + .Bind(configuration.GetSection(AkariOptions.SectionPath)) .ValidateDataAnnotations(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - - services.AddHostedService(); - services.AddHostedService(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.