Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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()));
        }
Exemplo n.º 3
0
        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;
        }