/// <summary> /// Call to begin bootstrapping. Can only be run once. /// </summary> public IBootstrapper Bootstrap() { if (Bootstrapped) { return(this); } lock (Padlock) { if (Bootstrapped) { return(this); } LogPortal.SetLogger(_logger); var stopwatch = new Stopwatch(); _logger.Info("Bootstrapping"); _logger.Debug("Running DependencyTask"); stopwatch.Start(); _dependencyRegistrar.ConfigureDependencies(); stopwatch.Stop(); _logger.DebugFormat("Completed DependencyTask in {0}ms", stopwatch.ElapsedMilliseconds); stopwatch.Reset(); var startupTasks = _dependencyRegistrar.ResolveStartupTasks().OrderBy(task => task.Order).ToList(); foreach (var bootstrapTask in startupTasks) { var type = bootstrapTask.GetType(); if (type.IsDefined(typeof(SkipTaskAttribute), false)) { continue; } _logger.Debug("Running " + type.Name); stopwatch.Start(); try { bootstrapTask.Bootstrap(); } catch (Exception e) { _logger.Error("Bootstrapping Failed", e); throw; } stopwatch.Stop(); _logger.DebugFormat("Completed {0} in {1}ms", type.Name, stopwatch.ElapsedMilliseconds); stopwatch.Reset(); if (typeof(IDisposable).IsAssignableFrom(type)) { DisposableTasks.Add((IDisposable)bootstrapTask); } } _logger.Debug("Bootstrapping Completed"); Bootstrapped = true; } return(this); }