/// <summary> /// Initialize assemblies setup. /// </summary> /// <param name="logger"><see cref="ILogger"/> to use for logging.</param> /// <param name="entryAssembly"><see cref="Assembly"/> to use as entry assembly - null indicates it will get it from the <see cref="Assembly.GetEntryAssembly()"/> method.</param> /// <param name="defaultAssemblyProvider">The default <see cref="ICanProvideAssemblies"/> - null inidicates it will use the default implementation.</param> /// <param name="excludeAllCallback">A callback to build on the exclude all specification.</param> /// <returns>Discovered <see cref="IAssemblies"/>.</returns> public static IAssemblies Start( ILogger logger, Assembly entryAssembly = null, ICanProvideAssemblies defaultAssemblyProvider = null, Action <ExcludeAll> excludeAllCallback = null) { var assembliesConfigurationBuilder = new AssembliesConfigurationBuilder(); var assembliesSpecification = assembliesConfigurationBuilder .ExcludeAll() .ExceptProjectLibraries() .ExceptDolittleLibraries(); excludeAllCallback?.Invoke(assembliesSpecification); if (entryAssembly == null) { entryAssembly = Assembly.GetEntryAssembly(); } var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyFilters = new AssemblyFilters(assembliesConfiguration); var assemblyProvider = new AssemblyProvider( new ICanProvideAssemblies[] { defaultAssemblyProvider ?? new DefaultAssemblyProvider(logger, entryAssembly) }, assemblyFilters, new AssemblyUtility(), logger); var assemblies = new Assemblies(entryAssembly, assemblyProvider); return(assemblies); }
public static IServiceCollection Add_doLittle(this IServiceCollection services) { var logAppenders = LoggingConfigurator.DiscoverAndConfigure(Internals.LoggerFactory); doLittle.Logging.ILogger logger = new Logger(logAppenders); var assembliesConfigurationBuilder = new AssembliesConfigurationBuilder(); assembliesConfigurationBuilder.IncludeAll(); var contractToImplementorsMap = new ContractToImplementorsMap(); var executingAssembly = typeof(doLittleModule).GetTypeInfo().Assembly; contractToImplementorsMap.Feed(executingAssembly.GetTypes()); var assemblySpecifiers = new AssemblySpecifiers(assembliesConfigurationBuilder.RuleBuilder, logger); assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly); var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyFilters = new AssemblyFilters(assembliesConfiguration); var assemblyProvider = new AssemblyProvider( new ICanProvideAssemblies[] { new DefaultAssemblyProvider(logger) }, assemblyFilters, new AssemblyUtility(), assemblySpecifiers); Internals.AllAssemblies = assemblyProvider.GetAll(); Internals.AssemblyFilters = assemblyFilters; Internals.AssembliesConfiguration = assembliesConfiguration; Internals.AssemblyProvider = assemblyProvider; Internals.Assemblies = new Assemblies(assemblyProvider); return(services); }
static AssembliesConfigurationBuilder BuildAssembliesConfigurationIfCallbackDefined(Action <AssembliesConfigurationBuilder> assembliesConfigurationBuilderCallback) { var builder = new AssembliesConfigurationBuilder(); assembliesConfigurationBuilderCallback?.Invoke(builder); if (builder.RuleBuilder == null) { builder.IncludeAll(); } return(builder); }
/// <inheritdoc/> public void Perform() { var assembliesConfigurationBuilder = new AssembliesConfigurationBuilder(); assembliesConfigurationBuilder .ExcludeAll() .ExceptProjectLibraries() .ExceptDolittleLibraries(); var entryAssembly = _buildTarget.Assembly; var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyFilters = new AssemblyFilters(assembliesConfiguration); var assemblyProvider = new Dolittle.Assemblies.AssemblyProvider( new ICanProvideAssemblies[] { new DefaultAssemblyProvider(_logger, entryAssembly) }, assemblyFilters, new AssemblyUtility(), _logger ); var assemblies = new Dolittle.Assemblies.Assemblies(entryAssembly, assemblyProvider); var contractToImplementorsMap = new ContractToImplementorsMap(new AsyncScheduler()); Parallel.ForEach(assemblies.GetAll(), _ => { try { var types = _.GetTypes(); contractToImplementorsMap.Feed(types); } catch {} }); var contractsToImplementors = contractToImplementorsMap.ContractsAndImplementors; var serializedMap = _serializer.SerializeMap(contractsToImplementors); _modifiers.AddModifier(new EmbedResource(CachedContractToImplementorsMap.MapResourceName, Encoding.UTF8.GetBytes(serializedMap))); var serializedTypes = _serializer.SerializeTypes(contractToImplementorsMap.All); _modifiers.AddModifier(new EmbedResource(CachedContractToImplementorsMap.TypesResourceName, Encoding.UTF8.GetBytes(serializedTypes))); var implementors = contractsToImplementors.Values.Sum(_ => _.Count()); _buildMessages.Information($"Embedded a map with {contractsToImplementors.Keys.Count} contracts to {implementors} implementors"); }