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 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 ParseArguments(params string[] args) { var result = new Dictionary(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; } } }