// --------------------------------------------------------------------------------------------------------------------
//
// 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
}
}