// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Concurrent; using Microsoft.AspNet.FileProviders; using Microsoft.Framework.Expiration.Interfaces; using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Mvc.Razor { /// /// Default implementation for the interface that caches /// the results of . /// public class DefaultRazorFileProviderCache : IRazorFileProviderCache { private readonly ConcurrentDictionary _fileInfoCache = new ConcurrentDictionary(StringComparer.Ordinal); private readonly IFileProvider _fileProvider; private readonly TimeSpan _offset; /// /// Initializes a new instance of . /// /// Accessor to . public DefaultRazorFileProviderCache(IOptions optionsAccessor) { _fileProvider = optionsAccessor.Options.FileProvider; _offset = optionsAccessor.Options.ExpirationBeforeCheckingFilesOnDisk; } protected virtual DateTime UtcNow { get { return DateTime.UtcNow; } } /// public IDirectoryContents GetDirectoryContents(string subpath) { return _fileProvider.GetDirectoryContents(subpath); } /// public IFileInfo GetFileInfo(string subpath) { ExpiringFileInfo expiringFileInfo; var utcNow = UtcNow; if (_fileInfoCache.TryGetValue(subpath, out expiringFileInfo) && expiringFileInfo.ValidUntil > utcNow) { return expiringFileInfo.FileInfo; } else { var fileInfo = _fileProvider.GetFileInfo(subpath); expiringFileInfo = new ExpiringFileInfo() { FileInfo = fileInfo, ValidUntil = _offset == TimeSpan.MaxValue ? DateTime.MaxValue : utcNow.Add(_offset), }; _fileInfoCache[subpath] = expiringFileInfo; return fileInfo; } } /// public IExpirationTrigger Watch(string filter) { return _fileProvider.Watch(filter); } private class ExpiringFileInfo { public IFileInfo FileInfo { get; set; } public DateTime ValidUntil { get; set; } } } }