Reacting to IExpirationTrigger -> IChangeToken rename
This commit is contained in:
parent
b544aabfdb
commit
9eb2c5b810
|
|
@ -3,8 +3,8 @@
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNet.Mvc;
|
using Microsoft.AspNet.Mvc;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using TagHelperSample.Web.Models;
|
using TagHelperSample.Web.Models;
|
||||||
using TagHelperSample.Web.Services;
|
using TagHelperSample.Web.Services;
|
||||||
|
|
||||||
|
|
@ -25,15 +25,15 @@ namespace TagHelperSample.Web.Components
|
||||||
public IViewComponentResult Invoke()
|
public IViewComponentResult Invoke()
|
||||||
{
|
{
|
||||||
// Since this component is invoked from within a CacheTagHelper,
|
// Since this component is invoked from within a CacheTagHelper,
|
||||||
// cache the movie list and provide an expiration trigger, which when triggered causes the
|
// cache the movie list and provide an expiration token, which when notified causes the
|
||||||
// CacheTagHelper's cached data to be invalidated.
|
// CacheTagHelper's cached data to be invalidated.
|
||||||
var cacheKey = "featured_movies";
|
var cacheKey = "featured_movies";
|
||||||
IEnumerable<FeaturedMovies> movies;
|
IEnumerable<FeaturedMovies> movies;
|
||||||
if (!_cache.TryGetValue(cacheKey, out movies))
|
if (!_cache.TryGetValue(cacheKey, out movies))
|
||||||
{
|
{
|
||||||
IExpirationTrigger trigger;
|
IChangeToken expirationToken;
|
||||||
movies = _moviesService.GetFeaturedMovies(out trigger);
|
movies = _moviesService.GetFeaturedMovies(out expirationToken);
|
||||||
_cache.Set(cacheKey, movies, new MemoryCacheEntryOptions().AddExpirationTrigger(trigger));
|
_cache.Set(cacheKey, movies, new MemoryCacheEntryOptions().AddExpirationToken(expirationToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
return View(movies);
|
return View(movies);
|
||||||
|
|
@ -44,9 +44,9 @@ namespace TagHelperSample.Web.Components
|
||||||
string quote;
|
string quote;
|
||||||
if (!_cache.TryGetValue(movieName, out quote))
|
if (!_cache.TryGetValue(movieName, out quote))
|
||||||
{
|
{
|
||||||
IExpirationTrigger trigger;
|
IChangeToken expirationToken;
|
||||||
quote = _moviesService.GetCriticsQuote(out trigger);
|
quote = _moviesService.GetCriticsQuote(out expirationToken);
|
||||||
_cache.Set(movieName, quote, new MemoryCacheEntryOptions().AddExpirationTrigger(trigger));
|
_cache.Set(movieName, quote, new MemoryCacheEntryOptions().AddExpirationToken(expirationToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Content(quote);
|
return Content(quote);
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,9 @@ namespace TagHelperSample.Web.Controllers
|
||||||
_moviesService = moviesService;
|
_moviesService = moviesService;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sample exhibiting the use of nested cache tag helpers with custom user expiration triggers.
|
// Sample exhibiting the use of nested cache tag helpers with custom user expiration tokens.
|
||||||
// Trigger expirations cascade, expiration of the inner tag helper's content either due to absolute or sliding
|
// Trigger expirations cascade, expiration of the inner tag helper's content either due to absolute or sliding
|
||||||
// expiration or due to a user specified expiration trigger would cause the outer cache tag helper to also expire.
|
// expiration or due to a user specified expiration token would cause the outer cache tag helper to also expire.
|
||||||
public IActionResult Index()
|
public IActionResult Index()
|
||||||
{
|
{
|
||||||
ViewData["Title"] = "Movies";
|
ViewData["Title"] = "Movies";
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.Framework.Caching;
|
using Microsoft.Framework.Primitives;
|
||||||
using Microsoft.Framework.Caching.Memory;
|
|
||||||
using TagHelperSample.Web.Models;
|
using TagHelperSample.Web.Models;
|
||||||
|
|
||||||
namespace TagHelperSample.Web.Services
|
namespace TagHelperSample.Web.Services
|
||||||
|
|
@ -18,11 +17,11 @@ namespace TagHelperSample.Web.Services
|
||||||
private CancellationTokenSource _featuredMoviesTokenSource;
|
private CancellationTokenSource _featuredMoviesTokenSource;
|
||||||
private CancellationTokenSource _quotesTokenSource;
|
private CancellationTokenSource _quotesTokenSource;
|
||||||
|
|
||||||
public IEnumerable<FeaturedMovies> GetFeaturedMovies(out IExpirationTrigger expirationTrigger)
|
public IEnumerable<FeaturedMovies> GetFeaturedMovies(out IChangeToken expirationToken)
|
||||||
{
|
{
|
||||||
_featuredMoviesTokenSource = new CancellationTokenSource();
|
_featuredMoviesTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
expirationTrigger = new CancellationTokenTrigger(_featuredMoviesTokenSource.Token);
|
expirationToken = new CancellationChangeToken(_featuredMoviesTokenSource.Token);
|
||||||
return GetMovies().OrderBy(m => m.Rank).Take(2);
|
return GetMovies().OrderBy(m => m.Rank).Take(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -33,7 +32,7 @@ namespace TagHelperSample.Web.Services
|
||||||
_featuredMoviesTokenSource = null;
|
_featuredMoviesTokenSource = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetCriticsQuote(out IExpirationTrigger trigger)
|
public string GetCriticsQuote(out IChangeToken expirationToken)
|
||||||
{
|
{
|
||||||
_quotesTokenSource = new CancellationTokenSource();
|
_quotesTokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
|
@ -45,7 +44,7 @@ namespace TagHelperSample.Web.Services
|
||||||
"Bravo!"
|
"Bravo!"
|
||||||
};
|
};
|
||||||
|
|
||||||
trigger = new CancellationTokenTrigger(_quotesTokenSource.Token);
|
expirationToken = new CancellationChangeToken(_quotesTokenSource.Token);
|
||||||
return quotes[_random.Next(0, quotes.Length)];
|
return quotes[_random.Next(0, quotes.Length)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,10 @@
|
||||||
"System.Runtime": ""
|
"System.Runtime": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dnxcore50": { }
|
"dnxcore50": {
|
||||||
|
"dependencies": {
|
||||||
|
"System.Text.Encoding": "4.0.11-*"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Directives
|
||||||
// negative results and adding a Watch for that file.
|
// negative results and adding a Watch for that file.
|
||||||
|
|
||||||
var options = new MemoryCacheEntryOptions()
|
var options = new MemoryCacheEntryOptions()
|
||||||
.AddExpirationTrigger(_fileProvider.Watch(pagePath))
|
.AddExpirationToken(_fileProvider.Watch(pagePath))
|
||||||
.SetSlidingExpiration(SlidingExpirationDuration);
|
.SetSlidingExpiration(SlidingExpirationDuration);
|
||||||
|
|
||||||
var file = _fileProvider.GetFileInfo(pagePath);
|
var file = _fileProvider.GetFileInfo(pagePath);
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
cacheResult = CompilerCacheResult.FileNotFound;
|
cacheResult = CompilerCacheResult.FileNotFound;
|
||||||
|
|
||||||
cacheEntryOptions = new MemoryCacheEntryOptions();
|
cacheEntryOptions = new MemoryCacheEntryOptions();
|
||||||
cacheEntryOptions.AddExpirationTrigger(_fileProvider.Watch(normalizedPath));
|
cacheEntryOptions.AddExpirationToken(_fileProvider.Watch(normalizedPath));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -128,12 +128,12 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
private MemoryCacheEntryOptions GetMemoryCacheEntryOptions(string relativePath)
|
private MemoryCacheEntryOptions GetMemoryCacheEntryOptions(string relativePath)
|
||||||
{
|
{
|
||||||
var options = new MemoryCacheEntryOptions();
|
var options = new MemoryCacheEntryOptions();
|
||||||
options.AddExpirationTrigger(_fileProvider.Watch(relativePath));
|
options.AddExpirationToken(_fileProvider.Watch(relativePath));
|
||||||
|
|
||||||
var viewImportsPaths = ViewHierarchyUtility.GetViewImportsLocations(relativePath);
|
var viewImportsPaths = ViewHierarchyUtility.GetViewImportsLocations(relativePath);
|
||||||
foreach (var location in viewImportsPaths)
|
foreach (var location in viewImportsPaths)
|
||||||
{
|
{
|
||||||
options.AddExpirationTrigger(_fileProvider.Watch(location));
|
options.AddExpirationToken(_fileProvider.Watch(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
return options;
|
return options;
|
||||||
|
|
|
||||||
|
|
@ -236,10 +236,10 @@ namespace Microsoft.AspNet.Mvc.Razor.Precompilation
|
||||||
PrecompilationCacheEntry cacheEntry)
|
PrecompilationCacheEntry cacheEntry)
|
||||||
{
|
{
|
||||||
var options = new MemoryCacheEntryOptions();
|
var options = new MemoryCacheEntryOptions();
|
||||||
options.AddExpirationTrigger(FileProvider.Watch(fileInfo.RelativePath));
|
options.AddExpirationToken(FileProvider.Watch(fileInfo.RelativePath));
|
||||||
foreach (var path in ViewHierarchyUtility.GetViewImportsLocations(fileInfo.RelativePath))
|
foreach (var path in ViewHierarchyUtility.GetViewImportsLocations(fileInfo.RelativePath))
|
||||||
{
|
{
|
||||||
options.AddExpirationTrigger(FileProvider.Watch(path));
|
options.AddExpirationToken(FileProvider.Watch(path));
|
||||||
}
|
}
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -144,7 +144,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
var key = GenerateKey(context);
|
var key = GenerateKey(context);
|
||||||
if (!MemoryCache.TryGetValue(key, out result))
|
if (!MemoryCache.TryGetValue(key, out result))
|
||||||
{
|
{
|
||||||
// Create an entry link scope and flow it so that any triggers related to the cache entries
|
// Create an entry link scope and flow it so that any tokens related to the cache entries
|
||||||
// created within this scope get copied to this scope.
|
// created within this scope get copied to this scope.
|
||||||
using (var link = MemoryCache.CreateLinkingScope())
|
using (var link = MemoryCache.CreateLinkingScope())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -97,10 +97,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
if (!_cache.TryGetValue(path, out value))
|
if (!_cache.TryGetValue(path, out value))
|
||||||
{
|
{
|
||||||
value = QueryHelpers.AddQueryString(path, VersionKey, GetHashForFile(fileInfo));
|
value = QueryHelpers.AddQueryString(path, VersionKey, GetHashForFile(fileInfo));
|
||||||
_cache.Set(
|
var cacheEntryOptions = new MemoryCacheEntryOptions().AddExpirationToken(_fileProvider.Watch(resolvedPath));
|
||||||
path,
|
_cache.Set(path, value, cacheEntryOptions);
|
||||||
value,
|
|
||||||
new MemoryCacheEntryOptions().AddExpirationTrigger(_fileProvider.Watch(resolvedPath)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
|
|
|
||||||
|
|
@ -115,8 +115,8 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
var options = new MemoryCacheEntryOptions();
|
var options = new MemoryCacheEntryOptions();
|
||||||
foreach (var pattern in includePatterns)
|
foreach (var pattern in includePatterns)
|
||||||
{
|
{
|
||||||
var trigger = FileProvider.Watch(pattern);
|
var changeToken = FileProvider.Watch(pattern);
|
||||||
options.AddExpirationTrigger(trigger);
|
options.AddExpirationToken(changeToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
files = FindFiles(includePatterns, excludePatterns);
|
files = FindFiles(includePatterns, excludePatterns);
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Host.Directives
|
||||||
Assert.Same(expected1, result1);
|
Assert.Same(expected1, result1);
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
fileProvider.GetTrigger(path).IsExpired = true;
|
fileProvider.GetChangeToken(path).HasChanged = true;
|
||||||
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => expected2);
|
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => expected2);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
|
|
@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Host.Directives
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
fileProvider.DeleteFile(path);
|
fileProvider.DeleteFile(path);
|
||||||
fileProvider.GetTrigger(path).IsExpired = true;
|
fileProvider.GetChangeToken(path).HasChanged = true;
|
||||||
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => { throw new Exception("Shouldn't be called."); });
|
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => { throw new Exception("Shouldn't be called."); });
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
|
|
@ -121,7 +121,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Host.Directives
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
fileProvider.AddFile(path, "test content");
|
fileProvider.AddFile(path, "test content");
|
||||||
fileProvider.GetTrigger(path).IsExpired = true;
|
fileProvider.GetChangeToken(path).HasChanged = true;
|
||||||
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => expected);
|
var result2 = chunkTreeCache.GetOrAdd(path, fileInfo => expected);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
|
|
|
||||||
|
|
@ -111,9 +111,9 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
Assert.Same(expected, result1.CompilationResult);
|
Assert.Same(expected, result1.CompilationResult);
|
||||||
|
|
||||||
// Act 2
|
// Act 2
|
||||||
// Delete the file from the file system and set it's expiration trigger.
|
// Delete the file from the file system and set it's expiration token.
|
||||||
fileProvider.DeleteFile(ViewPath);
|
fileProvider.DeleteFile(ViewPath);
|
||||||
fileProvider.GetTrigger(ViewPath).IsExpired = true;
|
fileProvider.GetChangeToken(ViewPath).HasChanged = true;
|
||||||
var result2 = cache.GetOrAdd(ViewPath, ThrowsIfCalled);
|
var result2 = cache.GetOrAdd(ViewPath, ThrowsIfCalled);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
|
|
@ -147,7 +147,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
Assert.Same(expected1.CompiledType, result2.CompilationResult.CompiledType);
|
Assert.Same(expected1.CompiledType, result2.CompilationResult.CompiledType);
|
||||||
|
|
||||||
// Act 3
|
// Act 3
|
||||||
fileProvider.GetTrigger(ViewPath).IsExpired = true;
|
fileProvider.GetChangeToken(ViewPath).HasChanged = true;
|
||||||
var result3 = cache.GetOrAdd(ViewPath, _ => expected2);
|
var result3 = cache.GetOrAdd(ViewPath, _ => expected2);
|
||||||
|
|
||||||
// Assert 3
|
// Assert 3
|
||||||
|
|
@ -182,7 +182,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
Assert.Same(expected1.CompiledType, result2.CompilationResult.CompiledType);
|
Assert.Same(expected1.CompiledType, result2.CompilationResult.CompiledType);
|
||||||
|
|
||||||
// Act 3
|
// Act 3
|
||||||
fileProvider.GetTrigger(globalImportPath).IsExpired = true;
|
fileProvider.GetChangeToken(globalImportPath).HasChanged = true;
|
||||||
var result3 = cache.GetOrAdd(ViewPath, _ => expected2);
|
var result3 = cache.GetOrAdd(ViewPath, _ => expected2);
|
||||||
|
|
||||||
// Assert 2
|
// Assert 2
|
||||||
|
|
@ -242,7 +242,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
fileProvider.Watch(PrecompiledViewsPath);
|
fileProvider.Watch(PrecompiledViewsPath);
|
||||||
fileProvider.GetTrigger(PrecompiledViewsPath).IsExpired = true;
|
fileProvider.GetChangeToken(PrecompiledViewsPath).HasChanged = true;
|
||||||
var result = cache.GetOrAdd(PrecompiledViewsPath, ThrowsIfCalled);
|
var result = cache.GetOrAdd(PrecompiledViewsPath, ThrowsIfCalled);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
@ -260,7 +260,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Compilation
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
fileProvider.Watch(globalImportPath);
|
fileProvider.Watch(globalImportPath);
|
||||||
fileProvider.GetTrigger(globalImportPath).IsExpired = true;
|
fileProvider.GetChangeToken(globalImportPath).HasChanged = true;
|
||||||
var result = cache.GetOrAdd(PrecompiledViewsPath, ThrowsIfCalled);
|
var result = cache.GetOrAdd(PrecompiledViewsPath, ThrowsIfCalled);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
|
|
|
||||||
|
|
@ -18,9 +18,9 @@ using Microsoft.AspNet.Mvc.ViewEngines;
|
||||||
using Microsoft.AspNet.Mvc.ViewFeatures;
|
using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
||||||
using Microsoft.AspNet.Routing;
|
using Microsoft.AspNet.Routing;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
using Microsoft.Framework.Internal;
|
using Microsoft.Framework.Internal;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -536,7 +536,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var expiresSliding = TimeSpan.FromSeconds(30);
|
var expiresSliding = TimeSpan.FromSeconds(30);
|
||||||
var expected = new[] { Mock.Of<IExpirationTrigger>(), Mock.Of<IExpirationTrigger>() };
|
var expected = new[] { Mock.Of<IChangeToken>(), Mock.Of<IChangeToken>() };
|
||||||
var cache = new MemoryCache(new MemoryCacheOptions());
|
var cache = new MemoryCache(new MemoryCacheOptions());
|
||||||
var cacheTagHelper = new CacheTagHelper(cache)
|
var cacheTagHelper = new CacheTagHelper(cache)
|
||||||
{
|
{
|
||||||
|
|
@ -544,13 +544,13 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
};
|
};
|
||||||
|
|
||||||
var entryLink = new EntryLink();
|
var entryLink = new EntryLink();
|
||||||
entryLink.AddExpirationTriggers(expected);
|
entryLink.AddExpirationTokens(expected);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var cacheEntryOptions = cacheTagHelper.GetMemoryCacheEntryOptions(entryLink);
|
var cacheEntryOptions = cacheTagHelper.GetMemoryCacheEntryOptions(entryLink);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.Equal(expected, cacheEntryOptions.Triggers.ToArray());
|
Assert.Equal(expected, cacheEntryOptions.ExpirationTokens.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -722,7 +722,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
var tokenSource = new CancellationTokenSource();
|
var tokenSource = new CancellationTokenSource();
|
||||||
var cache = new MemoryCache(new MemoryCacheOptions());
|
var cache = new MemoryCache(new MemoryCacheOptions());
|
||||||
var cacheEntryOptions = new MemoryCacheEntryOptions()
|
var cacheEntryOptions = new MemoryCacheEntryOptions()
|
||||||
.AddExpirationTrigger(new CancellationTokenTrigger(tokenSource.Token));
|
.AddExpirationToken(new CancellationChangeToken(tokenSource.Token));
|
||||||
var tagHelperContext = new TagHelperContext(
|
var tagHelperContext = new TagHelperContext(
|
||||||
allAttributes: new TagHelperAttributeList(),
|
allAttributes: new TagHelperAttributeList(),
|
||||||
items: new Dictionary<object, object>(),
|
items: new Dictionary<object, object>(),
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ using Microsoft.AspNet.Mvc.ViewEngines;
|
||||||
using Microsoft.AspNet.Mvc.ViewFeatures;
|
using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
||||||
using Microsoft.AspNet.Routing;
|
using Microsoft.AspNet.Routing;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Microsoft.Framework.WebEncoders.Testing;
|
using Microsoft.Framework.WebEncoders.Testing;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
@ -304,7 +304,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
||||||
.Returns(mockFile.Object);
|
.Returns(mockFile.Object);
|
||||||
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
||||||
.Returns(new TestFileTrigger());
|
.Returns(new TestFileChangeToken());
|
||||||
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
||||||
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ using System.Text;
|
||||||
using Microsoft.AspNet.FileProviders;
|
using Microsoft.AspNet.FileProviders;
|
||||||
using Microsoft.AspNet.Hosting;
|
using Microsoft.AspNet.Hosting;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
||||||
.Returns(mockFile.Object);
|
.Returns(mockFile.Object);
|
||||||
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
||||||
.Returns(new TestFileTrigger());
|
.Returns(new TestFileChangeToken());
|
||||||
|
|
||||||
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
||||||
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
||||||
|
|
@ -137,10 +137,10 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
public void SetsValueInCache(string filePath, string watchPath, string requestPathBase)
|
public void SetsValueInCache(string filePath, string watchPath, string requestPathBase)
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var trigger = new Mock<IExpirationTrigger>();
|
var changeToken = new Mock<IChangeToken>();
|
||||||
var hostingEnvironment = GetMockHostingEnvironment(filePath, requestPathBase != null);
|
var hostingEnvironment = GetMockHostingEnvironment(filePath, requestPathBase != null);
|
||||||
Mock.Get(hostingEnvironment.WebRootFileProvider)
|
Mock.Get(hostingEnvironment.WebRootFileProvider)
|
||||||
.Setup(f => f.Watch(watchPath)).Returns(trigger.Object);
|
.Setup(f => f.Watch(watchPath)).Returns(changeToken.Object);
|
||||||
|
|
||||||
object cacheValue = null;
|
object cacheValue = null;
|
||||||
var cache = new Mock<IMemoryCache>();
|
var cache = new Mock<IMemoryCache>();
|
||||||
|
|
@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
}
|
}
|
||||||
|
|
||||||
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
||||||
.Returns(new TestFileTrigger());
|
.Returns(new TestFileChangeToken());
|
||||||
|
|
||||||
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
||||||
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,10 @@ using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.AspNet.FileProviders;
|
using Microsoft.AspNet.FileProviders;
|
||||||
using Microsoft.AspNet.Http;
|
using Microsoft.AspNet.Http;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
using Microsoft.Framework.FileSystemGlobbing;
|
using Microsoft.Framework.FileSystemGlobbing;
|
||||||
using Microsoft.Framework.FileSystemGlobbing.Abstractions;
|
using Microsoft.Framework.FileSystemGlobbing.Abstractions;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
|
|
@ -272,9 +272,9 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal
|
||||||
public void CachesMatchResults()
|
public void CachesMatchResults()
|
||||||
{
|
{
|
||||||
// Arrange
|
// Arrange
|
||||||
var trigger = new Mock<IExpirationTrigger>();
|
var changeToken = new Mock<IChangeToken>();
|
||||||
var fileProvider = MakeFileProvider(MakeDirectoryContents("site.css", "blank.css"));
|
var fileProvider = MakeFileProvider(MakeDirectoryContents("site.css", "blank.css"));
|
||||||
Mock.Get(fileProvider).Setup(f => f.Watch(It.IsAny<string>())).Returns(trigger.Object);
|
Mock.Get(fileProvider).Setup(f => f.Watch(It.IsAny<string>())).Returns(changeToken.Object);
|
||||||
var cache = MakeCache();
|
var cache = MakeCache();
|
||||||
Mock.Get(cache).Setup(c => c.Set(
|
Mock.Get(cache).Setup(c => c.Set(
|
||||||
/*key*/ It.IsAny<string>(),
|
/*key*/ It.IsAny<string>(),
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@ using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
||||||
using Microsoft.AspNet.Routing;
|
using Microsoft.AspNet.Routing;
|
||||||
using Microsoft.Dnx.Runtime;
|
using Microsoft.Dnx.Runtime;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
using Microsoft.Framework.Logging;
|
using Microsoft.Framework.Logging;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Microsoft.Framework.WebEncoders.Testing;
|
using Microsoft.Framework.WebEncoders.Testing;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
@ -871,7 +871,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
||||||
.Returns(mockFile.Object);
|
.Returns(mockFile.Object);
|
||||||
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
||||||
.Returns(new TestFileTrigger());
|
.Returns(new TestFileChangeToken());
|
||||||
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
||||||
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,9 @@ using Microsoft.AspNet.Mvc.ViewFeatures;
|
||||||
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
using Microsoft.AspNet.Razor.Runtime.TagHelpers;
|
||||||
using Microsoft.AspNet.Routing;
|
using Microsoft.AspNet.Routing;
|
||||||
using Microsoft.Dnx.Runtime;
|
using Microsoft.Dnx.Runtime;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
using Microsoft.Framework.Logging;
|
using Microsoft.Framework.Logging;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
using Microsoft.Framework.WebEncoders.Testing;
|
using Microsoft.Framework.WebEncoders.Testing;
|
||||||
using Moq;
|
using Moq;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
@ -964,7 +964,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny<string>()))
|
||||||
.Returns(mockFile.Object);
|
.Returns(mockFile.Object);
|
||||||
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
mockFileProvider.Setup(fp => fp.Watch(It.IsAny<string>()))
|
||||||
.Returns(new TestFileTrigger());
|
.Returns(new TestFileChangeToken());
|
||||||
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
var hostingEnvironment = new Mock<IHostingEnvironment>();
|
||||||
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object);
|
||||||
|
|
||||||
|
|
@ -986,7 +986,7 @@ namespace Microsoft.AspNet.Mvc.TagHelpers
|
||||||
.Returns(result != null);
|
.Returns(result != null);
|
||||||
|
|
||||||
var cacheEntryOptions = new MemoryCacheEntryOptions();
|
var cacheEntryOptions = new MemoryCacheEntryOptions();
|
||||||
cacheEntryOptions.AddExpirationTrigger(new Mock<IExpirationTrigger>().Object);
|
cacheEntryOptions.AddExpirationToken(Mock.Of<IChangeToken>());
|
||||||
cache
|
cache
|
||||||
.Setup(
|
.Setup(
|
||||||
c => c.Set(
|
c => c.Set(
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Microsoft.Framework.Primitives
|
||||||
|
{
|
||||||
|
internal class TestFileChangeToken : IChangeToken
|
||||||
|
{
|
||||||
|
public bool ActiveChangeCallbacks => false;
|
||||||
|
|
||||||
|
public bool HasChanged { get; set; }
|
||||||
|
|
||||||
|
public IDisposable RegisterChangeCallback(Action<object> callback, object state)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using Microsoft.AspNet.FileProviders;
|
using Microsoft.AspNet.FileProviders;
|
||||||
using Microsoft.Framework.Caching;
|
using Microsoft.Framework.Primitives;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc.Razor
|
namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
|
|
@ -13,8 +13,8 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, IFileInfo> _lookup =
|
private readonly Dictionary<string, IFileInfo> _lookup =
|
||||||
new Dictionary<string, IFileInfo>(StringComparer.Ordinal);
|
new Dictionary<string, IFileInfo>(StringComparer.Ordinal);
|
||||||
private readonly Dictionary<string, TestFileTrigger> _fileTriggers =
|
private readonly Dictionary<string, TestFileChangeToken> _fileTriggers =
|
||||||
new Dictionary<string, TestFileTrigger>(StringComparer.Ordinal);
|
new Dictionary<string, TestFileChangeToken>(StringComparer.Ordinal);
|
||||||
|
|
||||||
public virtual IDirectoryContents GetDirectoryContents(string subpath)
|
public virtual IDirectoryContents GetDirectoryContents(string subpath)
|
||||||
{
|
{
|
||||||
|
|
@ -58,19 +58,19 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual IExpirationTrigger Watch(string filter)
|
public virtual IChangeToken Watch(string filter)
|
||||||
{
|
{
|
||||||
TestFileTrigger trigger;
|
TestFileChangeToken changeToken;
|
||||||
if (!_fileTriggers.TryGetValue(filter, out trigger) || trigger.IsExpired)
|
if (!_fileTriggers.TryGetValue(filter, out changeToken) || changeToken.HasChanged)
|
||||||
{
|
{
|
||||||
trigger = new TestFileTrigger();
|
changeToken = new TestFileChangeToken();
|
||||||
_fileTriggers[filter] = trigger;
|
_fileTriggers[filter] = changeToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
return trigger;
|
return changeToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TestFileTrigger GetTrigger(string filter)
|
public TestFileChangeToken GetChangeToken(string filter)
|
||||||
{
|
{
|
||||||
return _fileTriggers[filter];
|
return _fileTriggers[filter];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace Microsoft.Framework.Caching
|
|
||||||
{
|
|
||||||
internal class TestFileTrigger : IExpirationTrigger
|
|
||||||
{
|
|
||||||
public bool ActiveExpirationCallbacks { get; } = false;
|
|
||||||
|
|
||||||
public bool IsExpired { get; set; }
|
|
||||||
|
|
||||||
public IDisposable RegisterExpirationCallback(Action<object> callback, object state)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -2,8 +2,8 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNet.Mvc;
|
using Microsoft.AspNet.Mvc;
|
||||||
using Microsoft.Framework.Caching;
|
|
||||||
using Microsoft.Framework.Caching.Memory;
|
using Microsoft.Framework.Caching.Memory;
|
||||||
|
using Microsoft.Framework.Primitives;
|
||||||
|
|
||||||
namespace HtmlGenerationWebSite.Components
|
namespace HtmlGenerationWebSite.Components
|
||||||
{
|
{
|
||||||
|
|
@ -24,9 +24,9 @@ namespace HtmlGenerationWebSite.Components
|
||||||
string products;
|
string products;
|
||||||
if (!Cache.TryGetValue(category, out products))
|
if (!Cache.TryGetValue(category, out products))
|
||||||
{
|
{
|
||||||
IExpirationTrigger trigger;
|
IChangeToken changeToken;
|
||||||
products = ProductsService.GetProducts(category, out trigger);
|
products = ProductsService.GetProducts(category, out changeToken);
|
||||||
Cache.Set(category, products, new MemoryCacheEntryOptions().AddExpirationTrigger(trigger));
|
Cache.Set(category, products, new MemoryCacheEntryOptions().AddExpirationToken(changeToken));
|
||||||
}
|
}
|
||||||
|
|
||||||
ViewData["Products"] = products;
|
ViewData["Products"] = products;
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Microsoft.Framework.Caching;
|
using Microsoft.Framework.Primitives;
|
||||||
|
|
||||||
namespace HtmlGenerationWebSite
|
namespace HtmlGenerationWebSite
|
||||||
{
|
{
|
||||||
|
|
@ -10,11 +10,11 @@ namespace HtmlGenerationWebSite
|
||||||
{
|
{
|
||||||
private readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
|
private readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
|
||||||
|
|
||||||
public string GetProducts(string category, out IExpirationTrigger trigger)
|
public string GetProducts(string category, out IChangeToken changeToken)
|
||||||
{
|
{
|
||||||
var token = _tokenSource.IsCancellationRequested ? CancellationToken.None :
|
var token = _tokenSource.IsCancellationRequested ?
|
||||||
_tokenSource.Token;
|
CancellationToken.None : _tokenSource.Token;
|
||||||
trigger = new CancellationTokenTrigger(token);
|
changeToken = new CancellationChangeToken(token);
|
||||||
if (category == "Books")
|
if (category == "Books")
|
||||||
{
|
{
|
||||||
return "Book1, Book2";
|
return "Book1, Book2";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue