Example #1
0
        /// <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);
        }
Example #2
0
        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);
            }));
        }
Example #3
0
        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();
        }
Example #4
0
        /// <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;
        }