/// <summary> /// Resolves a list of assemblies using the <see cref="Sources"/>, <see cref="Includes"/>, and <see cref="Excludes"/> rules. /// </summary> /// <returns>An enumberable list of assemblies.</returns> public IEnumerable <Assembly> Resolve() { // default to loaded assemblies if (_sources.Count == 0) { IncludeLoadedAssemblies(); } _logWriter?.Invoke($"Assembly Resolver Start; Sources: ({Sources.Count}), Includes: ({Includes.Count}), Excludes: ({Excludes.Count})"); var watch = Stopwatch.StartNew(); var assemblies = _sources .SelectMany(source => source()) .Where(assembly => _includes.Count == 0 || _includes.Any(include => include(assembly))) .Where(assembly => _excludes.Count == 0 || !_excludes.Any(exclude => exclude(assembly))) .Distinct() .ToList(); watch.Stop(); _logWriter?.Invoke($"Assembly Resolver Complete; Assemblies: ({assemblies.Count}), Time: {watch.ElapsedMilliseconds} ms"); return(assemblies); }
private Task RunTaskAsync(Context context, IStartupTask startupTask) { var watch = Stopwatch.StartNew(); context.WriteLog("Execute Startup Task; Type: '{0}'", startupTask); return(startupTask.RunAsync(context.Data) .ContinueWith(t => { watch.Stop(); context.WriteLog("Complete Startup Task; Type: '{0}', Time: {1} ms", startupTask, watch.ElapsedMilliseconds); })); }
private void RunActions(Context context) { var watch = Stopwatch.StartNew(); foreach (var startupTask in _options.Actions) { context.WriteLog("Execute Startup Action"); watch.Restart(); startupTask.Invoke(context.ServiceProvider, context.Data); watch.Stop(); context.WriteLog("Complete Startup Action; Time: {0} ms", watch.ElapsedMilliseconds); } watch.Stop(); }
/// <summary> /// Configure and run the KickStart extensions. /// </summary> /// <param name="configurator">The <see langword="delegate"/> to configure KickStart before execution of the extensions.</param> /// <example>Configure KickStart to use startup tasks using Autofac container to resolve <see cref="T:KickStart.StartupTask.IStartupTask" /> instances. /// <code><![CDATA[ /// Kick.Start(config => config /// .IncludeAssemblyFor<TestStartup>() /// .UseAutofac() /// .UseStartupTask(c => c.UseContainer()) /// .LogLevel(TraceLevel.Verbose) /// );]]></code> /// </example> public static void Start(Action <IConfigurationBuilder> configurator) { if (configurator == null) { throw new ArgumentNullException(nameof(configurator)); } var config = new Configuration(); var builder = new ConfigurationBuilder(config); configurator(builder); var assemblies = config.Assemblies.Resolve(); // cache types var types = assemblies .SelectMany(a => a.GetLoadableTypes()) .ToList(); var context = new Context(types, config.Data, config.LogWriter); foreach (var starter in config.Starters) { context.WriteLog("Execute Starter: {0}", starter); var watch = Stopwatch.StartNew(); starter.Run(context); watch.Stop(); context.WriteLog("Completed Starter: {0}, Time: {1} ms", starter, watch.ElapsedMilliseconds); } // save service provider _serviceProvider = context.ServiceProvider; }