parent
c5c6ac4a72
commit
c67b11eec3
@ -1,67 +1,42 @@
|
|||||||
using System.Reflection;
|
|
||||||
using Connected.Host.Configuration;
|
using Connected.Host.Configuration;
|
||||||
|
|
||||||
namespace Connected.Host
|
namespace Connected.Host
|
||||||
{
|
{
|
||||||
public static class Program
|
public static partial class Program
|
||||||
{
|
{
|
||||||
public static void Main(params string[] args)
|
public static async Task Main(params string[] args)
|
||||||
{
|
{
|
||||||
SysConfiguration.Build();
|
using IHost host = Microsoft.Extensions.Hosting.Host
|
||||||
|
.CreateDefaultBuilder(args)
|
||||||
Start(ParseArguments(args));
|
.ConfigureAppConfiguration((_, cfg) =>
|
||||||
}
|
{
|
||||||
|
var appPath = AppContext.BaseDirectory;
|
||||||
private static void Start(Dictionary<string, string> args)
|
var segments = new Uri(appPath).Segments;
|
||||||
{
|
|
||||||
foreach (var microService in SysConfiguration.MicroServices)
|
segments = segments.Select(e => e.Replace("%20", " ")).ToArray();
|
||||||
LoadMicroServiceAssembly(microService);
|
|
||||||
|
for (var i = 1; i <= segments.Length; i++)
|
||||||
if (Type.GetType(SysConfiguration.Start) is not Type startupType)
|
{
|
||||||
throw new Exception($"Cannot resolve startup type. ({SysConfiguration.Start}).");
|
var pathBase = Path.Combine(segments[0..i]);
|
||||||
|
var filePath = Path.Combine(pathBase, "sys.json");
|
||||||
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 (File.Exists(filePath))
|
||||||
|
{
|
||||||
if (configureMethod.Invoke(null, new object[] { args }) is not Task task)
|
cfg.AddJsonFile(filePath, true, false);
|
||||||
throw new Exception($"ConfigureAsync of type {startupType} must return Task.");
|
break;
|
||||||
|
}
|
||||||
task.ConfigureAwait(false);
|
}
|
||||||
|
|
||||||
task.GetType().GetProperty("Result")?.GetValue(task);
|
cfg.AddEnvironmentVariables();
|
||||||
}
|
})
|
||||||
|
.ConfigureServices((context, services) =>
|
||||||
private static Assembly? LoadMicroServiceAssembly(MicroServiceDescriptor descriptor)
|
{
|
||||||
{
|
services.Configure<SysConfiguration>(context.Configuration);
|
||||||
var assemblyFile = descriptor.Name.EndsWith(".dll") ? descriptor.Name : $"{descriptor.Name}.dll";
|
services.AddHostedService<ConnectedPlatformService>();
|
||||||
|
})
|
||||||
foreach (var location in SysConfiguration.Locations)
|
.Build();
|
||||||
{
|
|
||||||
var assemblyPath = Path.Combine(location, assemblyFile);
|
await host.RunAsync();
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in new issue