Пример #1
0
        public override bool Equals(ClientScriptResource x, ClientScriptResource y)
        {
            if (ReferenceEquals(x, y))
            {
                return(true);
            }

            if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
            {
                return(false);
            }

            return(ClientScriptResourceHandler
                   .GetKeys(new[] { x })
                   .Select(keyedResource => keyedResource.Key)
                   .Intersect(
                       ClientScriptResourceHandler
                       .GetKeys(new[] { y })
                       .Select(keyedResource => keyedResource.Key),
                       KeyComparer)
                   .Any());
        }
Пример #2
0
        public string RenderDeferredResources(HttpContextBase httpContext)
        {
            // Build an unordered dictionary of known resources
            var knownResources = ClientScriptResourceHandler
                                 .GetKeys(
                GetOrderedResourceCollection(httpContext)
                .Select(orderedResource => orderedResource.Resource)
                .Distinct(ResourceEqualityComparer))
                                 .ToDictionary(
                keyedResource => keyedResource.Key,
                keyedResource => keyedResource.Resource,
                StringComparer.OrdinalIgnoreCase);

            // Build a map of resources and their dependencies.
            // Use a known dependency if we have it, otherwise treat it
            // as a generic ScriptReferenceClientResource.
            var dependencyMap = GetOrderedResourceCollection(httpContext)
                                .ToDictionary(
                orderedResource => orderedResource.Resource,
                orderedResource => orderedResource
                .Resource
                .Dependencies
                .Where(requirement => !string.IsNullOrWhiteSpace(requirement))
                .Select(requirement => knownResources.ContainsKey(requirement)
                                                        ? knownResources[requirement]
                                                        : new ScriptReferenceClientResource(requirement)));

            // Build a dependency graph and apply a topological sort to get a "dependency ordered" list.
            var dependencyGraph = DependencyGraphProvider.CreateDependencyGraph(dependencyMap, ResourceEqualityComparer);
            var sortedResources = DependencyGraphProvider.TopologicalSort(dependencyGraph, ResourceEqualityComparer);

            // Render out the resources in the sorted order.
            return(string.Join(
                       Environment.NewLine,
                       ClientScriptResourceHandler.Render(sortedResources, RenderMode.Deferred)));
        }