public ModuleContextCandidate( Assembly assembly, Type moduleConfigType, LibraryModuleConfiguration libraryModuleConfiguration, IModuleConfigurationManager moduleConfigurationManager, EmbeddedFileProvider embeddedFileProvider, IModuleConfiguration defaultModuleConfiguration ) { Assembly = assembly; ModuleConfigType = moduleConfigType; LibraryModuleConfiguration = libraryModuleConfiguration; ModuleConfigurationManager = moduleConfigurationManager; EmbeddedFileProvider = embeddedFileProvider; DefaultModuleConfiguration = defaultModuleConfiguration; }
private static IList <ModuleContext> GetAssemblies(IConfiguration configuration, ILoggerFactory loggerFactory) { var assemblyList = new List <ModuleContext>(); var defaultConfigurationSection = configuration.GetSection("DefaultConfiguration"); // module.*.json5 var configurationSection = configuration.GetSection("Configuration"); // modules-autogenerated.xml var loadedAssemblies = new ConcurrentDictionary <string, Assembly>(); var moduleCandidatePerAssembly = new ConcurrentDictionary <string, IDictionary <string, ModuleContextCandidate> >(); var standaloneModuleCandidatePerAssembly = new ConcurrentDictionary <string, ModuleContextCandidate>(); foreach (var libraryModuleKeySection in defaultConfigurationSection.GetChildren()) { var libraryModuleSection = defaultConfigurationSection.GetSection(libraryModuleKeySection.Key); var generalModuleConfiguration = new LibraryModuleConfiguration(); libraryModuleSection.Bind(generalModuleConfiguration); var assembly = loadedAssemblies.GetOrAdd( generalModuleConfiguration.AssemblyName, Assembly.Load ); var moduleCandidate = moduleCandidatePerAssembly.GetOrAdd( generalModuleConfiguration.AssemblyName, (key) => new Dictionary <string, ModuleContextCandidate>() ); var moduleConfigType = assembly.ExportedTypes.FirstOrDefault( x => typeof(IModuleConfiguration).IsAssignableFrom(x) ); var moduleConfigurationManagerType = assembly.ExportedTypes.FirstOrDefault( x => typeof(IModuleConfigurationManager).IsAssignableFrom(x) ); if (moduleConfigType != null) { var moduleConfigurationSection = libraryModuleSection.GetSection("Configuration"); IModuleConfiguration defaultModuleConfiguration = null; if (moduleConfigurationSection.GetChildren().Any()) { defaultModuleConfiguration = Activator.CreateInstance(moduleConfigType) as IModuleConfiguration; moduleConfigurationSection.Bind(defaultModuleConfiguration); } IModuleConfigurationManager moduleConfigurationManager = null; if (moduleConfigurationManagerType != null) { moduleConfigurationManager = Activator.CreateInstance(moduleConfigurationManagerType) as IModuleConfigurationManager; } var embeddedFileProvider = new EmbeddedFileProvider(assembly); if (string.IsNullOrEmpty(defaultModuleConfiguration?.Name)) { assemblyList.Add( new ModuleContext( assembly, moduleConfigType, generalModuleConfiguration, moduleConfigurationManager, embeddedFileProvider, null, defaultModuleConfiguration ) ); } else { moduleCandidate.Add( defaultModuleConfiguration.Name, new ModuleContextCandidate( assembly, moduleConfigType, generalModuleConfiguration, moduleConfigurationManager, embeddedFileProvider, defaultModuleConfiguration ) ); } standaloneModuleCandidatePerAssembly.GetOrAdd( generalModuleConfiguration.AssemblyName, (key) => new ModuleContextCandidate( assembly, moduleConfigType, generalModuleConfiguration, moduleConfigurationManager, embeddedFileProvider, defaultModuleConfiguration ) ); } } foreach (var libraryModuleKeySection in configurationSection.GetChildren()) { var libraryModuleSection = configurationSection.GetSection(libraryModuleKeySection.Key); var generalModuleConfiguration = new LibraryModuleConfiguration(); libraryModuleSection.Bind(generalModuleConfiguration); if ( !loadedAssemblies.TryGetValue(generalModuleConfiguration.AssemblyName, out var assembly) || !moduleCandidatePerAssembly.TryGetValue(generalModuleConfiguration.AssemblyName, out var moduleCandidates) ) { // something went terribly wrong, try to keep it alive by continue continue; } var moduleConfigType = assembly.ExportedTypes.FirstOrDefault( x => typeof(IModuleConfiguration).IsAssignableFrom(x) ); if (moduleConfigType != null) { IModuleConfiguration moduleConfiguration = null; var configurationInstanceSection = libraryModuleSection.GetSection("Configuration"); if (configurationInstanceSection.GetChildren().Any()) { moduleConfiguration = Activator.CreateInstance(moduleConfigType) as IModuleConfiguration; configurationInstanceSection.Bind(moduleConfiguration); } if ( moduleConfiguration != null && !string.IsNullOrEmpty(moduleConfiguration.Name) && moduleCandidates.TryGetValue(moduleConfiguration.Name, out var moduleCandidate) ) { assemblyList.Add( new ModuleContext( moduleCandidate.Assembly, moduleCandidate.ModuleConfigType, moduleCandidate.LibraryModuleConfiguration, moduleCandidate.ModuleConfigurationManager, moduleCandidate.EmbeddedFileProvider, moduleConfiguration, moduleCandidate.DefaultModuleConfiguration ) ); moduleCandidates.Remove(moduleConfiguration.Name); } else if ( moduleConfiguration != null && standaloneModuleCandidatePerAssembly.TryGetValue( generalModuleConfiguration.AssemblyName, out var standaloneModuleCandidate ) ) { assemblyList.Add( new ModuleContext( standaloneModuleCandidate.Assembly, standaloneModuleCandidate.ModuleConfigType, standaloneModuleCandidate.LibraryModuleConfiguration, standaloneModuleCandidate.ModuleConfigurationManager, standaloneModuleCandidate.EmbeddedFileProvider, moduleConfiguration, standaloneModuleCandidate.DefaultModuleConfiguration ) ); } else { loggerFactory?.CreateLogger <IModuleConfiguration>().LogWarning( string.Format( "Dynamic module of type '{0}' lack of configuration or name, skipping. Assuming only make available dynamic module for other purpose", generalModuleConfiguration.AssemblyName ) ); } } } foreach (var moduleCandidates in moduleCandidatePerAssembly.Values) { foreach (var moduleCandidate in moduleCandidates.Values) { assemblyList.Add( new ModuleContext( moduleCandidate.Assembly, moduleCandidate.ModuleConfigType, moduleCandidate.LibraryModuleConfiguration, moduleCandidate.ModuleConfigurationManager, moduleCandidate.EmbeddedFileProvider, null, moduleCandidate.DefaultModuleConfiguration ) ); } } return(assemblyList); }