Beispiel #1
0
        protected virtual IReadOnlyList <string> GetBundleFiles(BundleConfigurationCollection bundles, string bundleName, IBundler bundler)
        {
            var contributors     = GetContributors(bundles, bundleName);
            var bundleFiles      = RequestResources.TryAdd(GetBundleFiles(contributors));
            var dynamicResources = RequestResources.TryAdd(GetDynamicResources(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());
        }
Beispiel #2
0
        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);
                }
            }
        }