protected static IEnumerable <Tuple <Type, Type, string> > GetImplementationDependencies(IPluginsContainer <IConceptDatabaseDefinition> plugins, IEnumerable <Type> conceptImplementations) { var dependencies = new List <Tuple <Type, Type, string> >(); foreach (Type conceptImplementation in conceptImplementations) { Type dependency = plugins.GetMetadata(conceptImplementation, "DependsOn"); if (dependency == null) { continue; } Type implements = plugins.GetMetadata(conceptImplementation, "Implements"); Type dependencyImplements = plugins.GetMetadata(dependency, "Implements"); if (!implements.Equals(dependencyImplements) && !implements.IsAssignableFrom(dependencyImplements) && !dependencyImplements.IsAssignableFrom(implements)) { throw new FrameworkException(string.Format( "DatabaseGenerator plugin {0} cannot depend on {1}." + "\"DependsOn\" value in ExportMetadata attribute must reference implementation of same concept." + " This additional dependencies should be used only to disambiguate between plugins that implement same IConceptInfo." + " {2} implements {3}, while {4} implements {5}.", conceptImplementation.FullName, dependency.FullName, conceptImplementation.Name, implements.FullName, dependency.Name, dependencyImplements.FullName)); } dependencies.Add(Tuple.Create(dependency, conceptImplementation, "DependsOn metadata")); } return(dependencies); }
private Dictionary <string, List <string> > ResolveDependencies(IList <IGenerator> generators) { var explicitDependencies = generators .Where(generator => generator.Dependencies != null) .SelectMany(generator => generator.Dependencies.Select(dependency => (name: GetGeneratorName(generator), dependency))); Log("Explicit dependencies", explicitDependencies); var mefDependencies = generators .Select(generator => (name: GetGeneratorName(generator), dependency: _generatorsContainer.GetMetadata(generator, MefProvider.DependsOn)?.FullName)) .Where(pair => pair.dependency != null); Log("MEF dependencies", mefDependencies); var configurationDependencies = ParseAdditionalDependenciesFromConfiguration(); Log("Configuration dependencies", configurationDependencies); var allPairs = explicitDependencies .Concat(mefDependencies) .Concat(configurationDependencies); return(allPairs .GroupBy(pair => pair.name) .ToDictionary(group => group.Key, group => group.Select(pair => pair.dependency).Distinct().ToList())); }
protected static IEnumerable<Tuple<Type, Type, string>> GetImplementationDependencies(IPluginsContainer<IConceptDatabaseDefinition> plugins, IEnumerable<Type> conceptImplementations) { var dependencies = new List<Tuple<Type, Type, string>>(); foreach (Type conceptImplementation in conceptImplementations) { Type dependency = plugins.GetMetadata(conceptImplementation, "DependsOn"); if (dependency == null) continue; Type implements = plugins.GetMetadata(conceptImplementation, "Implements"); Type dependencyImplements = plugins.GetMetadata(dependency, "Implements"); if (!implements.Equals(dependencyImplements) && !implements.IsAssignableFrom(dependencyImplements) && !dependencyImplements.IsAssignableFrom(implements)) throw new FrameworkException(string.Format( "DatabaseGenerator plugin {0} cannot depend on {1}." + "\"DependsOn\" value in ExportMetadata attribute must reference implementation of same concept." + " This additional dependencies should be used only to disambiguate between plugins that implement same IConceptInfo." + " {2} implements {3}, while {4} implements {5}.", conceptImplementation.FullName, dependency.FullName, conceptImplementation.Name, implements.FullName, dependency.Name, dependencyImplements.FullName)); dependencies.Add(Tuple.Create(dependency, conceptImplementation, "DependsOn metadata")); } return dependencies; }