[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/dtv42/HomeControl/master/BaseClass/BaseClassLib/BaseProgram.cs [Back]  [Original]

// --------------------------------------------------------------------------------------------------------------------
// 
//   Copyright(c) 2019 Dr. Peter Trimmel. All rights reserved.
// 
// 
// Licensed under the MIT license. See the LICENSE file in the project root for more information.
// 
// --------------------------------------------------------------------------------------------------------------------
namespace BaseClassLib
{
    #region Using Directives

    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.Reflection;
    using System.Threading.Tasks;

    using Microsoft.Extensions.Configuration;

    using Serilog;
    using CommandLine.Core.Hosting;
    using CommandLine.Core.Hosting.Abstractions;
    using McMaster.Extensions.CommandLineUtils;

    #endregion Using Directives

    /// 
    /// Standardized main routine setting up a logger instance.
    /// 
    /// The application program class.
    /// The application startup class.
    public class BaseProgram where TStartup : class, IStartup
    {
        #region Public Methods

        public async Task RunAsync(string[] args)
        {
            // Read the application settings file containing the Serilog configuration.
            var configuration = new ConfigurationBuilder()
                .SetBasePath(AppContext.BaseDirectory)
                .AddJsonFile("appsettings.json", false, false)
                .AddUserSecrets(true)
                .AddEnvironmentVariables()
                .Build();

            // Setting up the static Serilog logger.
            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .Enrich.FromLogContext()
                .CreateLogger();

            // Set the default culture.
            CultureInfo.CurrentCulture = new CultureInfo("en-US");

            try
            {
                // Create the application host.
                var app = CommandLineHost.CreateBuilder(args)
                    .ConfigureAppConfiguration((config) =>
                    {
                        config.SetBasePath(AppContext.BaseDirectory);
                        config.AddJsonFile("appsettings.json", false, false);
                        config.AddUserSecrets(true);
                        config.AddEnvironmentVariables();
                        config.Build();
                    })
                    .ConfigureLogging((logger) =>
                    {
                        logger.AddSerilog();
                    })
                    .UseStartup()
                    .Build();

                int code = 0;

                // Start the execution.
                Log.ForContext().Debug($"Executing '{Assembly.GetEntryAssembly().GetName().Name}{(args?.Length > 0 ? " " : "")}{string.Join(" ", args)}'.");
                Stopwatch stopWatch = new Stopwatch();

                // Start the timer.
                stopWatch.Start();
                code = await app.RunAsync();

                // Display the timing info.
                stopWatch.Stop();
                Log.ForContext().Debug($"Done.");
                Log.ForContext().Verbose($"Time elapsed {stopWatch.Elapsed}");
                Console.WriteLine($"Time elapsed {stopWatch.Elapsed}");

                return code;
            }
            catch (CommandParsingException cpx)
            {
                Console.WriteLine($"{cpx.Message}.");
                return -1;
            }
            catch (Exception ex)
            {
                Log.ForContext().Fatal(ex, "Application terminated unexpectedly");
                return -1;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }

        #endregion Public Methods
    }
}

Web Proxy Viewer  |  New URL  |  Original Page