コード例 #1
0
 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;
 }
コード例 #2
0
        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);
        }