public void Setup() { // Logging: // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1 var loggerFactory = LoggerFactory.Create(builder => { builder.AddFilter("Default", LogLevel.Debug).AddConsole(); }); var logger = loggerFactory.CreateLogger <CustomConfigProvider>(); _customConfigProvider = new CustomConfigProvider(logger, CONFIG_FILE_PATH); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // Added Dependency-Injection: Here a Singleton-Instane of ScriptRunner // is created. It will be created upn the first API-Reuest and then // passed to the constructor of the webapi-Controller, that serves the request. services.AddSingleton <ILocalScriptRunner>((s) => { // For debugging purposes: Show current working directory, since // script-paths are relative Console.WriteLine($"Current working-directory is: '{System.IO.Directory.GetCurrentDirectory()}'"); var logger = s.GetRequiredService <ILogger <LocalScriptRunner> >(); var loggerForCustomConfig = s.GetRequiredService <ILogger <CustomConfigProvider> >(); CustomConfigProvider myConfig = new CustomConfigProvider(loggerForCustomConfig, MagicStrings.CONFIG_FILE); bool letShellWindowsPopUpWhenStartScript; bool success = bool.TryParse(myConfig[MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT], out letShellWindowsPopUpWhenStartScript); if (!success) { throw new WDFatalException($"Value '{myConfig[MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT]}' for key '{MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT}' in configuration-file '{MagicStrings.CONFIG_FILE}' is not 'true' or 'false'."); } DirectoryInfo scriptDir = new DirectoryInfo(myConfig[MagicStrings.SCRIPT_DIRECTORY]); if (!scriptDir.Exists) { string msg = $"FATAL: Cannot find Script-directory '{scriptDir.FullName}'"; Console.WriteLine(msg); throw new WDFatalException(msg); } return(new LocalScriptRunner(logger, myConfig[MagicStrings.SHELL], myConfig[MagicStrings.SHELL_ARGS_TEMPLATE], scriptDir, myConfig[MagicStrings.SCRIPT_FILE_EXTENSION], letShellWindowsPopUpWhenStartScript)); }); }
//############ Original code from template - end ############################ /// <summary> /// Creates all objects that need to be injected into the constructor /// of MainViewModel (prepare Dependency-injection). These created /// object themselves need other things injected in their constructors. /// This funciton glues all the needed objects together using /// dependecy-injection. /// </summary> private void realizeDependencyInjection( out ILogger <MainWindowViewModel> loggerforMainWindowModel, out IWDClientServices wdClientServices, out string[] streamingTypes, out UInt16 preferredServerPort, out UInt16 preferredStreamingPort, out int preferredLocalScreenWidth, out int preferredRemoteScreenWidth) { // Create typed loggers. // See https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#non-host-console-app var loggerFactory = LoggerFactory.Create(builder => { builder .AddFilter("Microsoft", LogLevel.Warning) .AddFilter("System", LogLevel.Warning) .AddFilter("Default", LogLevel.Information) .AddConsole(); }); // Assign out-object logger loggerforMainWindowModel = loggerFactory.CreateLogger <MainWindowViewModel>(); // Create reader for config.json var customConfigProviderLogger = loggerFactory.CreateLogger <CustomConfigProvider>(); var customConfigProvider = new CustomConfigProvider(customConfigProviderLogger, MagicStrings.CONFIG_FILE); // Assign out-objects read from config.json string streamtypeList = customConfigProvider[MagicStrings.STREAMING_TYPES]; streamingTypes = streamtypeList.Split(',', StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < streamingTypes.Length; i++) { streamingTypes[i] = streamingTypes[i].Trim(); } preferredServerPort = Convert.ToUInt16( customConfigProvider[MagicStrings.PREFERRED_SERVER_PORT]); preferredStreamingPort = Convert.ToUInt16( customConfigProvider[MagicStrings.PREFERRED_STREAMING_PORT]); preferredLocalScreenWidth = Convert.ToInt32( customConfigProvider[MagicStrings.PREFERRED_LOCAL_SCREEN_WIDTH]); preferredRemoteScreenWidth = Convert.ToInt32( customConfigProvider[MagicStrings.PREFERRED_REMOTE_SCREEN_WIDTH]); bool letShellWindowsPopUpWhenStartScript; bool success = bool.TryParse(customConfigProvider[MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT], out letShellWindowsPopUpWhenStartScript); if (!success) { throw new WDFatalException($"Value '{customConfigProvider[MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT]}' for key '{MagicStrings.LET_SHELL_WINDOW_POP_UP_WHEN_START_SCRIPT}' in configuration-file '{MagicStrings.CONFIG_FILE}' is not 'true' or 'false'."); } var loggerForLocalScriptRunner = loggerFactory.CreateLogger <LocalScriptRunner>(); var scriptDir = new DirectoryInfo( customConfigProvider[MagicStrings.SCRIPT_DIRECTORY]); var localScriptRunner = new LocalScriptRunner( logger: loggerForLocalScriptRunner, shell: customConfigProvider[MagicStrings.SHELL], shellArgsTemplate: customConfigProvider[MagicStrings.SHELL_ARGS_TEMPLATE], scriptDirectory: scriptDir, scriptExtension: customConfigProvider[MagicStrings.SCRIPT_FILE_EXTENSION], letShellWindowsPopUpWhenStartScript: letShellWindowsPopUpWhenStartScript ); var loggerForRemoteScriptRunner = loggerFactory.CreateLogger <RemoteScriptRunner>(); var remoteScriptRunner = new RemoteScriptRunner(loggerForRemoteScriptRunner); string localIpAddress = HostAddressProvider.IPv4Address; var loggerForWdClientServices = loggerFactory.CreateLogger <WDClientServices>(); wdClientServices = new WDClientServices( logger: loggerForWdClientServices, localScriptRunner: localScriptRunner, localIpAddress: localIpAddress, remoteScriptRunner: remoteScriptRunner, scriptNameManageScreenResolutions: customConfigProvider[MagicStrings.SCRIPTNAME_MANAGE_SCREEN_RESOLUTION], scriptArgsManageScreenResolutions: customConfigProvider[MagicStrings.SCRIPTARGS_MANAGE_SCREEN_RESOLUTION], scriptNameStartStreamingSink: customConfigProvider[MagicStrings.SCRIPTNAME_START_STREAMING_SINK], scriptArgsStartStreamingSink: customConfigProvider[MagicStrings.SCRIPTARGS_START_STREAMING_SINK], scriptNameStartStreamingSource: customConfigProvider[MagicStrings.SCRIPTNAME_START_STREAMING_SOURCE], scriptArgsStartStreamingSource: customConfigProvider[MagicStrings.SCRIPTARGS_START_STREAMING_SOURCE], scriptNamePreventDisplayBlanking: customConfigProvider[MagicStrings.SCRIPTNAME_PREVENT_DISPLAY_BLANKING], scriptArgsPreventDisplayBlanking: customConfigProvider[MagicStrings.SCRIPTARGS_PREVENT_DISPLAY_BLANKING] ); }
//############ Original code from template - end ############################## /// <summary> /// Creates all objects that need to be injected into the constructor /// of MainViewModel (prepare Dependency-injection). These created /// object themselves need other things injected in their constructors. /// This funciton glues all the needed objects together using /// dependecy-injection. /// </summary> private void realizeDependencyInjection( out ILogger <MainWindowViewModel> loggerforMainWindowModel, out IServerController serverController, out string hostName, out string iPAddress, out List <UInt16> portNumbers) { // Create LoggerFactory for typed loggers. // See https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1#non-host-console-app var loggerFactory = LoggerFactory.Create(builder => { builder .AddFilter("Microsoft", LogLevel.Warning) .AddFilter("System", LogLevel.Warning) .AddFilter("Default", LogLevel.Information) .AddConsole((opts) => { opts.DisableColors = true; }); }); // Assign out-object logger loggerforMainWindowModel = loggerFactory.CreateLogger <MainWindowViewModel>(); // Create reader for config.json var customConfigProviderLogger = loggerFactory.CreateLogger <CustomConfigProvider>(); var customConfigProvider = new CustomConfigProvider(customConfigProviderLogger, MagicStrings.CONFIG_FILE); // Read Port-Numbers from config.json List <UInt16> portNumberList = new List <UInt16>(); string portsAsString = customConfigProvider[MagicStrings.PORT_NUMBERS]; string[] ports = portsAsString.Split(',', StringSplitOptions.RemoveEmptyEntries); foreach (string port in ports) { UInt16 portNumber; bool success = UInt16.TryParse(port, out portNumber); if (!success) { throw new WDFatalException($"In config-file '{MagicStrings.CONFIG_FILE}' the port-numbers cannot be parsed: '{MagicStrings.PORT_NUMBERS} : {portsAsString}'"); } portNumberList.Add(portNumber); } // Assign out-object portNumbers portNumbers = portNumberList; // Create instance implementing IServerController var serverControllerLogger = loggerFactory.CreateLogger <ServerController>(); string serverPath = customConfigProvider[MagicStrings.PATH_TO_SCRIPTING_REST_API_SERVER]; string argsTemplate = customConfigProvider[MagicStrings.ARGS_TEMPLATE_FOR_SCRIPTING_REST_API_SERVER]; // Assign out-object serverController serverController = new ServerController(serverControllerLogger, serverPath, argsTemplate); // Assign out-object hostName hostName = HostAddressProvider.HostName; // Assign out-object iPAddress iPAddress = HostAddressProvider.IPv4Address; }