/// <summary> /// Starup process, by default it scans assemblies, sorts modules, configures container, and runs startup for each module /// </summary> /// <param name="config"></param> /// <returns></returns> public virtual IStartupContext ConfigureLocator(IStartupConfiguration config) { IStartupTask startupTaskWithStartModules = null; var startupTaskContext = new StartupTaskContext(_enableImport, _locatorRegistryFactory, config, _locatorDefaultRegistrations, _finalizeRegistry); foreach (var task in CreateStartupTasks()) { task.Prepare(startupTaskContext); if (task is IStartupTaskWithStartupModules withStartupModules && withStartupModules.ExecuteStartupModules) { startupTaskWithStartModules = withStartupModules; continue; } task.Execute(config.TimedTaskManager); } if (startupTaskWithStartModules is null) { throw new Exception("No IStartupTaskWithStartupModules was used in startup tasks!"); } // optionally allows delaying startup until later, must be implemented on IStartupConfiguration instances _delayedStart = () => startupTaskWithStartModules.Execute(config.TimedTaskManager); if (!_enableDelayedStartupModules) { TryExecuteStartupModules(); } return(startupTaskContext.Get <IStartupContext>()); }