Compare commits
	
		
			3 Commits
		
	
	
		
			main
			...
			feat/condi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 398ca3d7b6 | |||
| ffed92e85c | |||
|   | f694b9a41a | 
| @@ -7,7 +7,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Blueprint.KeyVault", " | |||||||
| EndProject | EndProject | ||||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Mongo", "Core.Blueprint.Mongo\Core.Blueprint.Mongo.csproj", "{27A8E3E1-D613-4D5B-8105-485699409F1E}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Mongo", "Core.Blueprint.Mongo\Core.Blueprint.Mongo.csproj", "{27A8E3E1-D613-4D5B-8105-485699409F1E}" | ||||||
| EndProject | EndProject | ||||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Redis", "Core.Blueprint.Redis\Core.Blueprint.Redis.csproj", "{11F2AA11-FB98-4A33-AEE4-CD49588D2FE1}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Caching", "Core.Blueprint.Redis\Core.Blueprint.Caching.csproj", "{11F2AA11-FB98-4A33-AEE4-CD49588D2FE1}" | ||||||
| EndProject | EndProject | ||||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Storage", "Core.Blueprint.Storage\Core.Blueprint.Storage.csproj", "{636E4520-79F9-46C8-990D-08F2D24A151C}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Storage", "Core.Blueprint.Storage\Core.Blueprint.Storage.csproj", "{636E4520-79F9-46C8-990D-08F2D24A151C}" | ||||||
| EndProject | EndProject | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="ErrorDetailsDto.cs"> | // <copyright file="ErrorDetailsDto.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="HttpErrorDto.cs"> | // <copyright file="HttpErrorDto.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="HttpException.cs"> | // <copyright file="HttpException.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="LogDetail.cs"> | // <copyright file="LogDetail.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="LogOperation.cs"> | // <copyright file="LogOperation.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="LogSeverity.cs"> | // <copyright file="LogSeverity.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="LogTarget.cs"> | // <copyright file="LogTarget.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="ServiceSettings.cs"> | // <copyright file="ServiceSettings.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="Claims.cs"> | // <copyright file="Claims.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| namespace Core.Blueprint.Logging | namespace Core.Blueprint.Logging | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="DisplayNames.cs"> | // <copyright file="DisplayNames.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="EnvironmentVariables.cs"> | // <copyright file="EnvironmentVariables.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="ErrorCodes.cs"> | // <copyright file="ErrorCodes.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="MimeTypes.cs"> | // <copyright file="MimeTypes.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="Responses.cs"> | // <copyright file="Responses.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="HttpErrorMiddleware.cs"> | // <copyright file="HttpErrorMiddleware.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="HttpLogger.cs"> | // <copyright file="HttpLogger.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
| // <copyright file="HttpLoggingMiddleware.cs"> | // <copyright file="HttpLoggingMiddleware.cs"> | ||||||
| //     Heath | //     AgileWebs | ||||||
| // </copyright> | // </copyright> | ||||||
| // *********************************************************************** | // *********************************************************************** | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,10 +5,10 @@ using MongoDB.Driver.Authentication.Oidc; | |||||||
| namespace Core.Blueprint.Mongo.Configuration | namespace Core.Blueprint.Mongo.Configuration | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// The <see cref="HeathIdentityProvider"/> class is responsible for acquiring an OpenID Connect (OIDC)  |     /// The <see cref="AzureIdentityProvider"/> class is responsible for acquiring an OpenID Connect (OIDC)  | ||||||
|     /// access token for MongoDB authentication using Azure Identity and Managed Identity credentials. |     /// access token for MongoDB authentication using Azure Identity and Managed Identity credentials. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public class HeathIdentityProvider : IOidcCallback |     public class AzureIdentityProvider : IOidcCallback | ||||||
|     { |     { | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// The audience (resource identifier) for which the OIDC token is being requested. |         /// The audience (resource identifier) for which the OIDC token is being requested. | ||||||
| @@ -21,10 +21,10 @@ namespace Core.Blueprint.Mongo.Configuration | |||||||
|         private readonly string _environment; |         private readonly string _environment; | ||||||
| 
 | 
 | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Initializes a new instance of the <see cref="HeathIdentityProvider"/> class with the specified audience. |         /// Initializes a new instance of the <see cref="AzureIdentityProvider"/> class with the specified audience. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="audience">The audience (resource identifier) for which the OIDC token is being requested.</param> |         /// <param name="audience">The audience (resource identifier) for which the OIDC token is being requested.</param> | ||||||
|         public HeathIdentityProvider(string audience) |         public AzureIdentityProvider(string audience) | ||||||
|         { |         { | ||||||
|             _audience = audience; |             _audience = audience; | ||||||
|             _environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; |             _environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
| @@ -46,7 +46,7 @@ namespace Core.Blueprint.DAL.Mongo.Configuration | |||||||
|             { |             { | ||||||
|                 var settings = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; |                 var settings = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; | ||||||
|                 var mongoClientSettings = MongoClientSettings.FromConnectionString(settings.ConnectionString); |                 var mongoClientSettings = MongoClientSettings.FromConnectionString(settings.ConnectionString); | ||||||
|                 mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new HeathIdentityProvider(settings.Audience)); |                 mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new AzureIdentityProvider(settings.Audience)); | ||||||
|                 return new MongoClient(mongoClientSettings); |                 return new MongoClient(mongoClientSettings); | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,4 @@ | |||||||
| using System; | namespace Core.Blueprint.Caching.Adapters | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace Core.Blueprint.Redis |  | ||||||
| { | { | ||||||
|     public interface ICacheSettings |     public interface ICacheSettings | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,8 +1,10 @@ | |||||||
| using Microsoft.Extensions.Configuration; | using Core.Blueprint.Caching.Adapters; | ||||||
|  | using Core.Blueprint.Caching.Contracts; | ||||||
|  | using Microsoft.Extensions.Configuration; | ||||||
| using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||||
| using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||||
|  |  | ||||||
| namespace Core.Blueprint.Redis.Configuration | namespace Core.Blueprint.Caching.Configuration | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Provides extension methods for registering Redis-related services in the DI container. |     /// Provides extension methods for registering Redis-related services in the DI container. | ||||||
| @@ -17,23 +19,32 @@ namespace Core.Blueprint.Redis.Configuration | |||||||
|         /// <returns>The updated service collection.</returns> |         /// <returns>The updated service collection.</returns> | ||||||
|         public static IServiceCollection AddRedis(this IServiceCollection services, IConfiguration configuration) |         public static IServiceCollection AddRedis(this IServiceCollection services, IConfiguration configuration) | ||||||
|         { |         { | ||||||
|             // Retrieve the Redis connection string from the configuration. |             // TODO for the following variable we'll need to add in the appsettings.json the following config: "UseRedisCache": true, | ||||||
|             // Get Redis configuration section |             bool useRedis = configuration.GetValue<bool>("UseRedisCache"); | ||||||
|             var redisConnectionString = configuration.GetSection("ConnectionStrings:Redis").Value; |             //TODO decide wheter to use appsettings or the following ENV variable | ||||||
|             if (string.IsNullOrEmpty(redisConnectionString)) |             useRedis = Environment.GetEnvironmentVariable("CORE_BLUEPRINT_PACKAGES_USE_REDIS")?.ToLower() == "true"; | ||||||
|  |  | ||||||
|  |             if (useRedis) | ||||||
|             { |             { | ||||||
|                 throw new InvalidOperationException("Redis connection is not configured."); |                 var redisConnectionString = configuration.GetSection("ConnectionStrings:Redis").Value; | ||||||
|  |                 if (string.IsNullOrEmpty(redisConnectionString)) | ||||||
|  |                 { | ||||||
|  |                     throw new InvalidOperationException("Redis connection is not configured."); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 services.AddSingleton<ICacheProvider>(provider => | ||||||
|  |                     new RedisCacheProvider(redisConnectionString, provider.GetRequiredService<ILogger<RedisCacheProvider>>())); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 services.AddMemoryCache(); | ||||||
|  |                 services.AddSingleton<ICacheProvider, MemoryCacheProvider>(); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             // Register RedisCacheProvider |  | ||||||
|             services.AddSingleton<IRedisCacheProvider>(provider => |  | ||||||
|                 new RedisCacheProvider(redisConnectionString, provider.GetRequiredService<ILogger<RedisCacheProvider>>())); |  | ||||||
|  |  | ||||||
|             // Get CacheSettings and register with the ICacheSettings interface |  | ||||||
|             var cacheSettings = configuration.GetSection("CacheSettings").Get<CacheSettings>(); |             var cacheSettings = configuration.GetSection("CacheSettings").Get<CacheSettings>(); | ||||||
|             if (cacheSettings == null) |             if (cacheSettings == null) | ||||||
|             { |             { | ||||||
|                 throw new InvalidOperationException("Redis CacheSettings section is not configured."); |                 throw new InvalidOperationException("CacheSettings section is not configured."); | ||||||
|             } |             } | ||||||
|             services.AddSingleton<ICacheSettings>(cacheSettings); |             services.AddSingleton<ICacheSettings>(cacheSettings); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| namespace Core.Blueprint.Redis | namespace Core.Blueprint.Caching.Contracts | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Interface for managing Redis cache operations. |     /// Interface for managing Redis cache operations. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public interface IRedisCacheProvider |     public interface ICacheProvider | ||||||
|     { |     { | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Retrieves a cache item by its key. |         /// Retrieves a cache item by its key. | ||||||
| @@ -8,6 +8,7 @@ | |||||||
| 
 | 
 | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="Microsoft.Azure.StackExchangeRedis" Version="3.2.0" /> |     <PackageReference Include="Microsoft.Azure.StackExchangeRedis" Version="3.2.0" /> | ||||||
|  |     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" /> |     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" /> |     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="8.0.2" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" /> |     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.0" /> | ||||||
| @@ -1,11 +1,7 @@ | |||||||
| using System; | using System.Text; | ||||||
| using System.Collections.Generic; |  | ||||||
| using System.Linq; |  | ||||||
| using System.Text; |  | ||||||
| using System.Text.RegularExpressions; | using System.Text.RegularExpressions; | ||||||
| using System.Threading.Tasks; |  | ||||||
|  |  | ||||||
| namespace Core.Blueprint.Redis.Helpers | namespace Core.Blueprint.Caching.Helpers | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Helper class for generating consistent and normalized cache keys. |     /// Helper class for generating consistent and normalized cache keys. | ||||||
|   | |||||||
							
								
								
									
										86
									
								
								Core.Blueprint.Redis/MemoryCacheProvider.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								Core.Blueprint.Redis/MemoryCacheProvider.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,86 @@ | |||||||
|  | using Core.Blueprint.Caching.Contracts; | ||||||
|  | using Microsoft.Extensions.Logging; | ||||||
|  | using Microsoft.Extensions.Caching.Memory; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace Core.Blueprint.Caching | ||||||
|  | { | ||||||
|  |     public sealed class MemoryCacheProvider : ICacheProvider | ||||||
|  |     { | ||||||
|  |         private readonly IMemoryCache _cache; | ||||||
|  |         private readonly ILogger<MemoryCacheProvider> _logger; | ||||||
|  |         public MemoryCacheProvider(IMemoryCache cache, ILogger<MemoryCacheProvider> logger) | ||||||
|  |         { | ||||||
|  |             _cache = cache; | ||||||
|  |             _logger = logger; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ValueTask<TEntity> GetAsync<TEntity>(string key) | ||||||
|  |         { | ||||||
|  |             if (_cache.TryGetValue(key, out var value)) | ||||||
|  |             { | ||||||
|  |                 if (value is TEntity typedValue) | ||||||
|  |                 { | ||||||
|  |                     return ValueTask.FromResult(typedValue); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 try | ||||||
|  |                 { | ||||||
|  |                     var json = value?.ToString(); | ||||||
|  |                     var deserialized = JsonSerializer.Deserialize<TEntity>(json); | ||||||
|  |                     return ValueTask.FromResult(deserialized); | ||||||
|  |                 } | ||||||
|  |                 catch (Exception ex) | ||||||
|  |                 { | ||||||
|  |                     _logger.LogWarning(ex, "Error deserializing cache value for key {Key}", key); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return ValueTask.FromResult(default(TEntity)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ValueTask SetAsync<TEntity>(string key, TEntity value, TimeSpan? expiry = null) | ||||||
|  |         { | ||||||
|  |             var options = new MemoryCacheEntryOptions(); | ||||||
|  |             if (expiry.HasValue) | ||||||
|  |             { | ||||||
|  |                 options.SetAbsoluteExpiration(expiry.Value); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             _cache.Set(key, value, options); | ||||||
|  |             return ValueTask.CompletedTask; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ValueTask RemoveAsync(string key) | ||||||
|  |         { | ||||||
|  |             _cache.Remove(key); | ||||||
|  |             return ValueTask.CompletedTask; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ValueTask<bool> ExistsAsync(string key) | ||||||
|  |         { | ||||||
|  |             return ValueTask.FromResult(_cache.TryGetValue(key, out _)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public ValueTask RefreshAsync(string key, TimeSpan? expiry = null) | ||||||
|  |         { | ||||||
|  |             // MemoryCache does not support sliding expiration refresh like Redis, | ||||||
|  |             // so we must re-set the value manually if required. | ||||||
|  |  | ||||||
|  |             if (_cache.TryGetValue(key, out var value)) | ||||||
|  |             { | ||||||
|  |                 _cache.Remove(key); | ||||||
|  |  | ||||||
|  |                 var options = new MemoryCacheEntryOptions(); | ||||||
|  |                 if (expiry.HasValue) | ||||||
|  |                 { | ||||||
|  |                     options.SetAbsoluteExpiration(expiry.Value); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 _cache.Set(key, value, options); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return ValueTask.CompletedTask; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,14 +1,15 @@ | |||||||
| using Azure.Identity; | using Azure.Identity; | ||||||
|  | using Core.Blueprint.Caching.Contracts; | ||||||
| using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||||
| using StackExchange.Redis; | using StackExchange.Redis; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace Core.Blueprint.Redis | namespace Core.Blueprint.Caching | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Redis cache provider for managing cache operations. |     /// Redis cache provider for managing cache operations. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public sealed class RedisCacheProvider : IRedisCacheProvider |     public sealed class RedisCacheProvider : ICacheProvider | ||||||
|     { |     { | ||||||
|         private IDatabase _cacheDatabase = null!; |         private IDatabase _cacheDatabase = null!; | ||||||
|         private readonly ILogger<RedisCacheProvider> _logger; |         private readonly ILogger<RedisCacheProvider> _logger; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user