protected virtual async Task <IReadOnlyList <string> > GetBundleFilesAsync(BundleConfigurationCollection bundles, string bundleName, IBundler bundler) { var contributors = GetContributors(bundles, bundleName); var bundleFiles = RequestResources.TryAdd(await GetBundleFilesAsync(contributors)); var dynamicResources = RequestResources.TryAdd(await GetDynamicResourcesAsync(contributors)); if (!IsBundlingEnabled()) { return(bundleFiles.Union(dynamicResources).ToImmutableList()); } var bundleRelativePath = Options.BundleFolderName.EnsureEndsWith('/') + bundleName + "." + bundleFiles.JoinAsString("|").ToMd5() + "." + bundler.FileExtension; var cacheItem = BundleCache.GetOrAdd(bundleRelativePath, () => { var cacheValue = new BundleCacheItem( new List <string> { "/" + bundleRelativePath } ); WatchChanges(cacheValue, bundleFiles, bundleRelativePath); var bundleResult = bundler.Bundle( new BundlerContext( bundleRelativePath, bundleFiles, IsMinficationEnabled() ) ); SaveBundleResult(bundleRelativePath, bundleResult); return(cacheValue); }); return(cacheItem.Files.Union(dynamicResources).ToImmutableList()); }
private void WatchChanges(BundleCacheItem cacheValue, List <string> files, string bundleRelativePath) { lock (cacheValue.WatchDisposeHandles) { foreach (var file in files) { var watchDisposeHandle = WebContentFileProvider.Watch(file).RegisterChangeCallback(_ => { lock (cacheValue.WatchDisposeHandles) { cacheValue.WatchDisposeHandles.ForEach(h => h.Dispose()); cacheValue.WatchDisposeHandles.Clear(); } BundleCache.Remove(bundleRelativePath); DynamicFileProvider.Delete("/wwwroot/" + bundleRelativePath); //TODO: get rid of wwwroot! }, null); cacheValue.WatchDisposeHandles.Add(watchDisposeHandle); } } }