static EFCachedQueryExtensions()
        {
            var serviceProvider = EFStaticServiceProvider.Instance;

            _defaultCacheServiceProvider = serviceProvider.GetRequiredService <IEFCacheServiceProvider>();
            _defaultCacheKeyProvider     = serviceProvider.GetRequiredService <IEFCacheKeyProvider>();
        }
Beispiel #2
0
        private static EFCacheKey CacheKey <T>(IQueryable <T> queryable, IEFCacheKeyProvider cacheKeyProvider)
        {
            var saltKey  = SaltKey(queryable.Expression);
            var cacheKey = cacheKeyProvider.GetEFCacheKey(queryable, queryable.Expression, saltKey);

            return(cacheKey);
        }
        /// <summary>
        /// Returns a new query where the entities returned will be cached in the IEFCacheServiceProvider.
        /// </summary>
        /// <param name="query">The input EF query.</param>
        /// <param name="cachePolicy">Defines the expiration mode of the cache item. If you set it to null or don't specify it, the global `new CacheManager.Core.ConfigurationBuilder().WithExpiration()` setting will be used automatically.</param>
        /// <param name="debugInfo">Stores the debug information of the caching process.</param>
        /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
        /// <param name="cacheServiceProvider">Cache Service Provider.</param>
        /// <returns>Provides functionality to evaluate queries against a specific data source.</returns>
        public static IQueryable Cacheable(
            this IQueryable query, EFCachePolicy cachePolicy, EFCacheDebugInfo debugInfo,
            IEFCacheKeyProvider cacheKeyProvider, IEFCacheServiceProvider cacheServiceProvider)
        {
            var type            = typeof(EFCachedQueryable <>).MakeGenericType(query.ElementType);
            var cachedQueryable = Activator.CreateInstance(type, query, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider);

            return(cachedQueryable as IQueryable);
        }
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="efCache">EFCachePolicy determines the AbsoluteExpiration time and Priority of the cache.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedQueryable(
     IQueryable <TType> query,
     EFCachePolicy efCache,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     _query    = query;
     _provider = new EFCachedQueryProvider <TType>(query, efCache, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="saltKey">If you think the computed hash of the query is not enough, set this value.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedQueryable(
     IQueryable <TType> query,
     string saltKey,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     _query    = markAsNoTracking(query);
     _provider = new EFCachedQueryProvider <TType>(_query, saltKey, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
Beispiel #6
0
        public EFCacheRepositoryFactory(IRepositoryFactory repositoryFactory, IServiceProvider serviceProvider)
        {
            this.repositoryFactory = repositoryFactory ?? throw new ArgumentNullException("repositoryFactory in EFCacheRepositoryFactory");

            if (serviceProvider == null)
            {
                throw new ArgumentNullException("serviceProvider in EFCacheRepositoryFactory");
            }

            cacheKeyProvider     = serviceProvider.GetService <IEFCacheKeyProvider>();
            cacheServiceProvider = serviceProvider.GetService <IEFCacheServiceProvider>();
        }
Beispiel #7
0
 /// <summary>
 /// Defines methods to create and execute queries that are described by an System.Linq.IQueryable object.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">The Cache Service Provider.</param>
 public EFCachedQueryProvider(
     IQueryable <TType> query,
     EFCachePolicy cachePolicy,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     _query                = query;
     _cachePolicy          = cachePolicy;
     _debugInfo            = debugInfo;
     _cacheKeyProvider     = cacheKeyProvider;
     _cacheServiceProvider = cacheServiceProvider;
 }
 /// <summary>
 /// Helps processing SecondLevelCacheInterceptor
 /// </summary>
 public DbCommandInterceptorProcessor(
     IEFCacheServiceProvider cacheService,
     IEFCacheDependenciesProcessor cacheDependenciesProcessor,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCachePolicyParser cachePolicyParser,
     ILogger <DbCommandInterceptorProcessor> logger)
 {
     _cacheService = cacheService;
     _cacheDependenciesProcessor = cacheDependenciesProcessor;
     _cacheKeyProvider           = cacheKeyProvider;
     _cachePolicyParser          = cachePolicyParser;
     _logger = logger;
 }
Beispiel #9
0
 /// <summary>
 /// Defines methods to create and execute queries that are described by an System.Linq.IQueryable object.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">The Cache Service Provider.</param>
 public EFMaterializer(
     IQueryable query,
     EFCachePolicy cachePolicy,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     _query                = query;
     _cachePolicy          = cachePolicy;
     _debugInfo            = debugInfo;
     _cacheKeyProvider     = cacheKeyProvider;
     _cacheServiceProvider = cacheServiceProvider;
 }
Beispiel #10
0
 /// <summary>
 /// Defines methods to create and execute queries that are described by an System.Linq.IQueryable object.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="saltKey">If you think the computed hash of the query is not enough, set this value.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">The Cache Service Provider.</param>
 public EFCachedQueryProvider(
     IQueryable <TType> query,
     string saltKey,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     _query                = query;
     _saltKey              = saltKey;
     _debugInfo            = debugInfo;
     _cacheKeyProvider     = cacheKeyProvider;
     _cacheServiceProvider = cacheServiceProvider;
 }
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="saltKey">If you think the computed hash of the query is not enough, set this value.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedQueryable(
     IQueryable <TType> query,
     string saltKey,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     SaltKey              = saltKey;
     DebugInfo            = debugInfo;
     CacheKeyProvider     = cacheKeyProvider;
     CacheServiceProvider = cacheServiceProvider;
     Query     = query.MarkAsNoTracking();
     _provider = new EFCachedQueryProvider <TType>(Query, saltKey, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedQueryable(
     IQueryable <TType> query,
     EFCachePolicy cachePolicy,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     CachePolicy          = cachePolicy;
     DebugInfo            = debugInfo;
     CacheKeyProvider     = cacheKeyProvider;
     CacheServiceProvider = cacheServiceProvider;
     Query     = query.MarkAsNoTracking();
     _provider = new EFCachedQueryProvider(Query, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedDbSet(
     DbSet <TType> query,
     EFCachePolicy cachePolicy,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     CachePolicy          = cachePolicy;
     DebugInfo            = debugInfo;
     CacheKeyProvider     = cacheKeyProvider;
     CacheServiceProvider = cacheServiceProvider;
     Query     = query;
     _provider = new EFCachedQueryProvider <TType>(Query, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
        /// <summary>
        /// Returns a new query where the entities returned will be cached in the IEFCacheServiceProvider.
        /// </summary>
        /// <typeparam name="TType">Entity type.</typeparam>
        /// <param name="query">The input EF query.</param>
        /// <param name="efCachePolicy">Determines the AbsoluteExpiration time and Priority of the cache.</param>
        /// <param name="debugInfo">Stores the debug information of the caching process.</param>
        /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
        /// <param name="cacheServiceProvider">Cache Service Provider.</param>
        /// <returns></returns>
        public static EFCachedQueryable <TType> Cacheable <TType>(
            this IQueryable <TType> query, EFCachePolicy efCachePolicy, EFCacheDebugInfo debugInfo,
            IEFCacheKeyProvider cacheKeyProvider, IEFCacheServiceProvider cacheServiceProvider)
        {
            var noTrackingQuery = query.toAsNoTrackingQuery();

            if (isLinqToObjectsQuery(noTrackingQuery))
            {
                return(new EFCachedQueryable <TType>(
                           query, efCachePolicy, debugInfo, _defaultLinqToObjectsCacheKeyProvider, cacheServiceProvider));
            }
            return(new EFCachedQueryable <TType>(
                       noTrackingQuery, efCachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider));
        }
Beispiel #15
0
 /// <summary>
 /// Provides functionality to evaluate queries against a specific data source.
 /// </summary>
 /// <param name="query">The input EF query.</param>
 /// <param name="saltKey">If you think the computed hash of the query is not enough, set this value.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 public EFCachedDbSet(
     DbSet <TType> query,
     string saltKey,
     EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCacheServiceProvider cacheServiceProvider)
 {
     SaltKey              = saltKey;
     DebugInfo            = debugInfo;
     CacheKeyProvider     = cacheKeyProvider;
     CacheServiceProvider = cacheServiceProvider;
     Query     = query;
     _provider = new EFCachedQueryProvider <TType>(Query, saltKey, debugInfo, cacheKeyProvider, cacheServiceProvider);
 }
Beispiel #16
0
 /// <summary>
 /// Helps processing SecondLevelCacheInterceptor
 /// </summary>
 public DbCommandInterceptorProcessor(
     IEFDebugLogger logger,
     IEFCacheServiceProvider cacheService,
     IEFCacheDependenciesProcessor cacheDependenciesProcessor,
     IEFCacheKeyProvider cacheKeyProvider,
     IEFCachePolicyParser cachePolicyParser,
     IEFSqlCommandsProcessor sqlCommandsProcessor)
 {
     _cacheService = cacheService;
     _cacheDependenciesProcessor = cacheDependenciesProcessor;
     _cacheKeyProvider           = cacheKeyProvider;
     _cachePolicyParser          = cachePolicyParser;
     _logger = logger;
     _sqlCommandsProcessor = sqlCommandsProcessor;
 }
Beispiel #17
0
        private static void configureProviders()
        {
            if (_defaultCacheServiceProvider != null && _defaultCacheKeyProvider != null)
            {
                return;
            }

            var applicationServices = EFServiceProvider.ApplicationServices;

            if (applicationServices == null)
            {
                throw new InvalidOperationException("Please add `AddEFSecondLevelCache` method to `IServiceCollection` and also add `UseEFSecondLevelCache` method to `IApplicationBuilder`.");
            }

            _defaultCacheServiceProvider = applicationServices.GetService <IEFCacheServiceProvider>();
            _defaultCacheKeyProvider     = applicationServices.GetService <IEFCacheKeyProvider>();
        }
        /// <summary>
        /// Provides functionality to evaluate queries against a specific data source.
        /// </summary>
        /// <param name="query">The input EF query.</param>
        /// <param name="cachePolicy">Defines the expiration mode of the cache item.</param>
        /// <param name="debugInfo">Stores the debug information of the caching process.</param>
        /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
        /// <param name="cacheServiceProvider">Cache Service Provider.</param>
        public EFCachedDbSet(
            DbSet <TType> query,
            EFCachePolicy cachePolicy,
            EFCacheDebugInfo debugInfo,
            IEFCacheKeyProvider cacheKeyProvider,
            IEFCacheServiceProvider cacheServiceProvider)
        {
            CachePolicy          = cachePolicy;
            DebugInfo            = debugInfo;
            CacheKeyProvider     = cacheKeyProvider;
            CacheServiceProvider = cacheServiceProvider;
            Query = query;
            var queryable = Query.AsNoTracking().AsQueryable();

            ElementType = queryable.ElementType;
            Expression  = queryable.Expression;
            _provider   = new EFCachedQueryProvider(queryable, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider);
        }
        /// <summary>
        /// Helps processing SecondLevelCacheInterceptor
        /// </summary>
        public DbCommandInterceptorProcessor(
            IEFDebugLogger logger,
            IEFCacheServiceProvider cacheService,
            IEFCacheDependenciesProcessor cacheDependenciesProcessor,
            IEFCacheKeyProvider cacheKeyProvider,
            IEFCachePolicyParser cachePolicyParser,
            IEFSqlCommandsProcessor sqlCommandsProcessor,
            IOptions <EFCoreSecondLevelCacheSettings> cacheSettings)
        {
            _cacheService = cacheService;
            _cacheDependenciesProcessor = cacheDependenciesProcessor;
            _cacheKeyProvider           = cacheKeyProvider;
            _cachePolicyParser          = cachePolicyParser;
            _logger = logger;
            _sqlCommandsProcessor = sqlCommandsProcessor;

            if (cacheSettings == null)
            {
                throw new ArgumentNullException(nameof(cacheSettings));
            }

            _cacheSettings = cacheSettings.Value;
        }
 /// <summary>
 /// Returns a new query where the entities returned will be cached in the IEFCacheServiceProvider.
 /// </summary>
 /// <typeparam name="TType">Entity type.</typeparam>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item. If you set it to null or don't specify it, the global `new CacheManager.Core.ConfigurationBuilder().WithExpiration()` setting will be used automatically.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 /// <returns></returns>
 public static EFCachedDbSet <TType> Cacheable <TType>(
     this DbSet <TType> query, EFCachePolicy cachePolicy, EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider, IEFCacheServiceProvider cacheServiceProvider) where TType : class
 {
     return(new EFCachedDbSet <TType>(query, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider));
 }
Beispiel #21
0
 public EFCacheRepository(IRepository <DomainType> repository, IEFCacheKeyProvider cacheKeyProvider, IEFCacheServiceProvider cacheServiceProvider)
 {
     this.repository           = repository ?? throw new ArgumentNullException("repository in CachingRepository");
     this.cacheKeyProvider     = cacheKeyProvider ?? throw new ArgumentNullException("cacheKeyProvider in CachingRepository");
     this.cacheServiceProvider = cacheServiceProvider ?? throw new ArgumentNullException("cacheServiceProvider in CachingRepository");
 }
 /// <summary>
 /// Returns a new query where the entities returned will be cached in the IEFCacheServiceProvider.
 /// </summary>
 /// <typeparam name="TType">Entity type.</typeparam>
 /// <param name="query">The input EF query.</param>
 /// <param name="cachePolicy">Defines the expiration mode of the cache item. If you set it to null or don't specify it, the global `new CacheManager.Core.ConfigurationBuilder().WithExpiration()` setting will be used automatically.</param>
 /// <param name="debugInfo">Stores the debug information of the caching process.</param>
 /// <param name="cacheKeyProvider">Gets an EF query and returns its hash to store in the cache.</param>
 /// <param name="cacheServiceProvider">Cache Service Provider.</param>
 /// <returns></returns>
 public static EFCachedQueryable <TType> Cacheable <TType>(
     this IQueryable <TType> query, EFCachePolicy cachePolicy, EFCacheDebugInfo debugInfo,
     IEFCacheKeyProvider cacheKeyProvider, IEFCacheServiceProvider cacheServiceProvider)
 {
     return(new EFCachedQueryable <TType>(query, cachePolicy, debugInfo, cacheKeyProvider, cacheServiceProvider));
 }
 static EFCachedQueryExtension()
 {
     _defaultCacheServiceProvider          = new EFCacheServiceProvider();
     _defaultCacheKeyProvider              = new EFCacheKeyProvider(new EFCacheKeyHashProvider());
     _defaultLinqToObjectsCacheKeyProvider = new LinqToObjectsCacheKeyProvider(new EFCacheKeyHashProvider());
 }