public static ISemanticNetwork WithModules(this ISemanticNetwork semanticNetwork, ICollection <IExtensionModule> modules) { var modulesToApply = new List <IExtensionModule>(modules); while (modulesToApply.Count > 0) { var applied = new List <IExtensionModule>(); foreach (var module in modulesToApply) { if (semanticNetwork.GetMissingDependencies(module).Count == 0) { module.AttachTo(semanticNetwork); applied.Add(module); } } if (applied.Count > 0) { modulesToApply.RemoveAll(applied.Contains); } else { throw new ModuleException(String.Join("; ", modulesToApply.Select(m => m.Name)), $"Impossible to apply {modulesToApply.Count} modules because they have unresolved dependencies."); } } return(semanticNetwork); }
public void AttachTo(ISemanticNetwork semanticNetwork) { if (semanticNetwork.Modules.ContainsKey(Name)) { return; } var missingDependencies = semanticNetwork.GetMissingDependencies(this); if (missingDependencies.Count > 0) { throw new ModuleException(Name, $"Impossible to apply \"{Name}\" module. Required modules \"{String.Join("\", \"", missingDependencies)}\" are not loaded."); } if (!IsMetadataRegistered) { RegisterMetadata(); } Attach(semanticNetwork); semanticNetwork.Modules[Name] = this; }