You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Host/TomPIT.Connected/Program.cs

67 lines
2.0 KiB

2 years ago
using System.Reflection;
using TomPIT.Connected.Configuration;
namespace TomPIT.Connected
{
public static class Program
{
public static void Main(params string[] args)
{
SysConfiguration.Build();
Start(ParseArguments(args));
}
private static void Start(Dictionary<string, string> args)
{
foreach (var microService in SysConfiguration.MicroServices)
LoadMicroServiceAssembly(microService);
if (Type.GetType(SysConfiguration.Start) is not Type startupType)
throw new Exception($"Cannot resolve startup type. ({SysConfiguration.Start}).");
if (startupType.GetMethod("ConfigureAsync", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) is not MethodInfo configureMethod)
throw new Exception($"ConfigureAsync does not exists in the startup type {startupType}. Startup must have static 'async Task ConfigureAsync(params string[] args)' method.");
if (configureMethod.Invoke(null, new object[] { args }) is not Task task)
throw new Exception($"ConfigureAsync of type {startupType} must return Task.");
task.ConfigureAwait(false);
task.GetType().GetProperty("Result")?.GetValue(task);
}
private static Assembly? LoadMicroServiceAssembly(MicroServiceDescriptor descriptor)
{
var assemblyFile = descriptor.Name.EndsWith(".dll") ? descriptor.Name : $"{descriptor.Name}.dll";
foreach (var location in SysConfiguration.Locations)
{
var assemblyPath = Path.Combine(location, assemblyFile);
if (File.Exists(assemblyPath))
return Assembly.LoadFrom(assemblyPath);
}
return Assembly.Load(AssemblyName.GetAssemblyName(assemblyFile));
}
private static Dictionary<string, string> ParseArguments(params string[] args)
{
var result = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
foreach (var i in args)
{
var tokens = i.Split('=', 2);
if (tokens.Length == 1)
result.Add(tokens[0].Trim(), string.Empty);
else
result.Add(tokens[0].Trim(), tokens[1].Trim());
}
return result;
}
}
}