Rewrite host to use standard hosting patterns
This commit is contained in:
		
							parent
							
								
									c5c6ac4a72
								
							
						
					
					
						commit
						c67b11eec3
					
				@ -1,67 +1,42 @@
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using Connected.Host.Configuration;
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
				.ConfigureAppConfiguration((_, cfg) =>
 | 
			
		||||
				{
 | 
			
		||||
					var appPath = AppContext.BaseDirectory;
 | 
			
		||||
					var segments = new Uri(appPath).Segments;
 | 
			
		||||
 | 
			
		||||
			Start(ParseArguments(args));
 | 
			
		||||
					segments = segments.Select(e => e.Replace("%20", " ")).ToArray();
 | 
			
		||||
 | 
			
		||||
					for (var i = 1; i <= segments.Length; i++)
 | 
			
		||||
					{
 | 
			
		||||
						var pathBase = Path.Combine(segments[0..i]);
 | 
			
		||||
						var filePath = Path.Combine(pathBase, "sys.json");
 | 
			
		||||
 | 
			
		||||
						if (File.Exists(filePath))
 | 
			
		||||
						{
 | 
			
		||||
							cfg.AddJsonFile(filePath, true, false);
 | 
			
		||||
							break;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					cfg.AddEnvironmentVariables();
 | 
			
		||||
				})
 | 
			
		||||
				.ConfigureServices((context, services) =>
 | 
			
		||||
				{
 | 
			
		||||
					services.Configure<SysConfiguration>(context.Configuration);
 | 
			
		||||
					services.AddHostedService<ConnectedPlatformService>();
 | 
			
		||||
				})
 | 
			
		||||
				.Build();
 | 
			
		||||
 | 
			
		||||
			await host.RunAsync();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		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;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user