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); }
/// <summary> /// Initialize systems needed for the type system and discovery mechanisms to work. /// </summary> /// <param name="assemblies"><see cref="IAssemblies"/> that will be used.</param> /// <param name="scheduler"><see cref="IScheduler"/> to use for scheduling work.</param> /// <param name="logger"><see cref="ILogger"/> for logging.</param> /// <param name="entryAssembly"><see cref="Assembly"/> to use as entry assembly - null indicates it will ask for the entry assembly.</param> /// <returns><see cref="ITypeFinder"/> that can be used.</returns> public static ITypeFinder Start(IAssemblies assemblies, IScheduler scheduler, ILogger logger, Assembly entryAssembly = null) { if (entryAssembly == null) { entryAssembly = Assembly.GetEntryAssembly(); } IContractToImplementorsMap contractToImplementorsMap; #if false // Re-enable when https://github.com/dolittle-fundamentals/DotNET.Fundamentals/issues/219 is fixed if (CachedContractToImplementorsMap.HasCachedMap(entryAssembly)) { var before = DateTime.UtcNow; logger.Information("Contract to implementors map cache found - using it instead of dynamically discovery"); contractToImplementorsMap = new CachedContractToImplementorsMap( new ContractToImplementorsSerializer(logger), entryAssembly); Console.WriteLine($"CachedMap : {DateTime.UtcNow.Subtract(before).ToString("G")}"); } else #endif { logger.Information("Using runtime discovery for contract to implementors map"); contractToImplementorsMap = new ContractToImplementorsMap(scheduler); contractToImplementorsMap.Feed(entryAssembly.GetTypes()); var typeFeeder = new TypeFeeder(scheduler, logger); typeFeeder.Feed(assemblies, contractToImplementorsMap); } return(new TypeFinder(contractToImplementorsMap)); }
/// <summary> /// Configure by letting Bifrost discover anything that implements the discoverable configuration interfaces /// </summary> /// <returns></returns> public static Configure DiscoverAndConfigure(Action <AssembliesConfigurationBuilder> assembliesConfigurationBuilderCallback = null, IEnumerable <ICanProvideAssemblies> additionalAssemblyProviders = null) { IContractToImplementorsMap contractToImplementorsMap; var assembliesConfigurationBuilder = BuildAssembliesConfigurationIfCallbackDefined(assembliesConfigurationBuilderCallback); contractToImplementorsMap = new ContractToImplementorsMap(); var executingAssembly = typeof(Configure).GetTypeInfo().Assembly; contractToImplementorsMap.Feed(executingAssembly.GetTypes()); var assemblySpecifiers = new AssemblySpecifiers(contractToImplementorsMap, new TypeFinder(), assembliesConfigurationBuilder.RuleBuilder); assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly); var assemblyProviders = new List <ICanProvideAssemblies> { #if (NET461) new AppDomainAssemblyProvider(), #endif //new DefaultAssemblyProvider() new FileSystemAssemblyProvider(new FileSystem()) }; if (additionalAssemblyProviders != null) { assemblyProviders.AddRange(additionalAssemblyProviders); } var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyProvider = new AssemblyProvider( assemblyProviders, new AssemblyFilters(assembliesConfiguration), new AssemblyUtility(), assemblySpecifiers, contractToImplementorsMap); var assemblies = assemblyProvider.GetAll(); var canCreateContainerType = DiscoverCanCreateContainerType(assemblies); ThrowIfCanCreateContainerNotFound(canCreateContainerType); ThrowIfCanCreateContainerDoesNotHaveDefaultConstructor(canCreateContainerType); var canCreateContainerInstance = Activator.CreateInstance(canCreateContainerType) as ICanCreateContainer; var container = canCreateContainerInstance.CreateContainer(); var configure = With(container, BindingLifecycle.Transient, assembliesConfiguration, assemblyProvider, contractToImplementorsMap); configure.EntryAssembly = canCreateContainerType.GetTypeInfo().Assembly; configure.Initialize(); return(configure); }
/// <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"); }
/// <summary> /// Initialize systems needed for the type system and discovery mechanisms to work. /// </summary> /// <param name="assemblies"><see cref="IAssemblies"/> that will be used.</param> /// <param name="scheduler"><see cref="IScheduler"/> to use for scheduling work.</param> /// <param name="logger"><see cref="ILogger"/> for logging.</param> /// <param name="entryAssembly"><see cref="Assembly"/> to use as entry assembly - null indicates it will ask for the entry assembly.</param> /// <returns><see cref="ITypeFinder"/> that can be used.</returns> public static ITypeFinder Start(IAssemblies assemblies, IScheduler scheduler, ILogger logger, Assembly entryAssembly = null) { if (entryAssembly == null) { entryAssembly = Assembly.GetEntryAssembly(); } IContractToImplementorsMap contractToImplementorsMap; contractToImplementorsMap = new ContractToImplementorsMap(scheduler); contractToImplementorsMap.Feed(entryAssembly.GetTypes()); var typeFeeder = new TypeFeeder(scheduler, logger); typeFeeder.Feed(assemblies, contractToImplementorsMap); return(new TypeFinder(contractToImplementorsMap)); }
/// <summary> /// Configure by letting Bifrost discover anything that implements the discoverable configuration interfaces /// </summary> /// <returns></returns> public static Configure DiscoverAndConfigure( #if (!NET461) ILoggerFactory loggerFactory, #endif Action <AssembliesConfigurationBuilder> assembliesConfigurationBuilderCallback = null, IEnumerable <ICanProvideAssemblies> additionalAssemblyProviders = null) { #if (NET461) var logAppenders = LoggingConfigurator.DiscoverAndConfigure(); #else var logAppenders = LoggingConfigurator.DiscoverAndConfigure(loggerFactory); #endif Logging.ILogger logger = new Logger(logAppenders); logger.Information("Starting up"); IContractToImplementorsMap contractToImplementorsMap; var assembliesConfigurationBuilder = BuildAssembliesConfigurationIfCallbackDefined(assembliesConfigurationBuilderCallback); logger.Trace("Settings up contract to implementors map"); contractToImplementorsMap = new ContractToImplementorsMap(); var executingAssembly = typeof(Configure).GetTypeInfo().Assembly; contractToImplementorsMap.Feed(executingAssembly.GetTypes()); logger.Trace("Specifying which assemblies to include"); var assemblySpecifiers = new AssemblySpecifiers(contractToImplementorsMap, new TypeFinder(), assembliesConfigurationBuilder.RuleBuilder); assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly); var assemblyProviders = new List <ICanProvideAssemblies> { #if (NET461) new AppDomainAssemblyProvider(logger), #else new DefaultAssemblyProvider(logger), #endif new FileSystemAssemblyProvider(new FileSystem(), logger) }; if (additionalAssemblyProviders != null) { assemblyProviders.AddRange(additionalAssemblyProviders); } var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyProvider = new AssemblyProvider( assemblyProviders, new AssemblyFilters(assembliesConfiguration), new AssemblyUtility(), assemblySpecifiers, contractToImplementorsMap, logger); var assemblies = assemblyProvider.GetAll(); var canCreateContainerType = DiscoverCanCreateContainerType(assemblies); ThrowIfCanCreateContainerNotFound(canCreateContainerType); ThrowIfCanCreateContainerDoesNotHaveDefaultConstructor(canCreateContainerType); var canCreateContainerInstance = Activator.CreateInstance(canCreateContainerType) as ICanCreateContainer; var container = canCreateContainerInstance.CreateContainer(); container.Bind(logAppenders); container.Bind(logger); var configure = With( container, assembliesConfiguration, assemblyProvider, contractToImplementorsMap); configure.EntryAssembly = canCreateContainerType.GetTypeInfo().Assembly; configure.Initialize(); return(configure); }
public static Configure DiscoverAndConfigure(Action<AssembliesConfigurationBuilder> assembliesConfigurationBuilderCallback = null, IEnumerable<ICanProvideAssemblies> additionalAssemblyProviders = null) #endif { IContractToImplementorsMap contractToImplementorsMap; var assembliesConfigurationBuilder = BuildAssembliesConfigurationIfCallbackDefined(assembliesConfigurationBuilderCallback); contractToImplementorsMap = new ContractToImplementorsMap(); #if (SILVERLIGHT) var assemblyProvider = new AssemblyProvider(); var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); #else var executingAssembly = Assembly.GetExecutingAssembly(); contractToImplementorsMap.Feed(executingAssembly.GetTypes()); var assemblySpecifiers = new AssemblySpecifiers(contractToImplementorsMap, new TypeFinder(), assembliesConfigurationBuilder.RuleBuilder); assemblySpecifiers.SpecifyUsingSpecifiersFrom(executingAssembly); var assemblyProviders = new List<ICanProvideAssemblies> { new AppDomainAssemblyProvider(), new FileSystemAssemblyProvider(new FileSystem()) }; if (additionalAssemblyProviders != null) assemblyProviders.AddRange(additionalAssemblyProviders); var assembliesConfiguration = new AssembliesConfiguration(assembliesConfigurationBuilder.RuleBuilder); var assemblyProvider = new AssemblyProvider( assemblyProviders, new AssemblyFilters(assembliesConfiguration), new AssemblyUtility(), assemblySpecifiers, contractToImplementorsMap); #endif var assemblies = assemblyProvider.GetAll(); var canCreateContainerType = DiscoverCanCreateContainerType(assemblies); ThrowIfCanCreateContainerNotFound(canCreateContainerType); ThrowIfCanCreateContainerDoesNotHaveDefaultConstructor(canCreateContainerType); var canCreateContainerInstance = Activator.CreateInstance(canCreateContainerType) as ICanCreateContainer; var container = canCreateContainerInstance.CreateContainer(); var configure = With(container, BindingLifecycle.Transient, assembliesConfiguration, assemblyProvider, contractToImplementorsMap); configure.EntryAssembly = canCreateContainerType.Assembly; configure.Initialize(); return configure; }