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()); }
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))); }