Compare commits
	
		
			13 Commits
		
	
	
		
			feature/im
			...
			38b63455d4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 38b63455d4 | |||
| fbfa21f89a | |||
| e3cdf1fb32 | |||
| 351cc28181 | |||
| 4e6bf79656 | |||
| 73b909f780 | |||
| 7b326051bb | |||
| ff24c06934 | |||
| 31b26399a9 | |||
|   | 5935e87704 | ||
| 73f9d8550f | |||
|   | 852560d0e2 | ||
|   | 4103c4da8d | 
| @@ -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.Caching", "Core.Blueprint.Redis\Core.Blueprint.Caching.csproj", "{11F2AA11-FB98-4A33-AEE4-CD49588D2FE1}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.Blueprint.Redis", "Core.Blueprint.Redis\Core.Blueprint.Redis.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 | ||||||
|   | |||||||
| @@ -13,6 +13,8 @@ namespace Core.Blueprint.Logging | |||||||
|     /// </summary> |     /// </summary> | ||||||
|     public static class MimeTypes |     public static class MimeTypes | ||||||
|     { |     { | ||||||
|  |         public const string ApplicationVersion = "1.0"; | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// The service application/json mime type. |         /// The service application/json mime type. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ using Microsoft.Extensions.Configuration; | |||||||
| using Microsoft.Extensions.DependencyInjection; | using Microsoft.Extensions.DependencyInjection; | ||||||
| using Microsoft.Extensions.Options; | using Microsoft.Extensions.Options; | ||||||
| using MongoDB.Driver; | using MongoDB.Driver; | ||||||
|  | using static MongoDB.Driver.WriteConcern; | ||||||
|  |  | ||||||
| namespace Core.Blueprint.DAL.Mongo.Configuration | namespace Core.Blueprint.DAL.Mongo.Configuration | ||||||
| { | { | ||||||
| @@ -25,40 +26,48 @@ namespace Core.Blueprint.DAL.Mongo.Configuration | |||||||
|             var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; |             var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
|              |              | ||||||
|             services.AddSingleton<IMongoContext, MongoContext>(); |             services.AddSingleton<IMongoContext, MongoContext>(); | ||||||
|  |             string ConnectionString = configuration.GetSection("ConnectionStrings:MongoDB").Value ?? string.Empty; | ||||||
|  |             string Databasename = configuration.GetSection("MongoDb:DatabaseName").Value ?? string.Empty; | ||||||
|  |             string Audience = string.Empty; | ||||||
|  |  | ||||||
|             var ConnectionString = configuration.GetSection("ConnectionStrings:MongoDB").Value ?? string.Empty; |             if (!environment.Equals("Local", StringComparison.OrdinalIgnoreCase)) | ||||||
|             var Databasename = configuration.GetSection("MongoDb:DatabaseName").Value ?? string.Empty; |             { | ||||||
|             var Audience = (environment == "Local") |                 Audience = configuration.GetSection("MongoDb:Audience").Value ?? string.Empty; | ||||||
|                 ? configuration.GetSection("MongoDb:LocalAudience").Value |             } | ||||||
|                 : configuration.GetSection("MongoDb:Audience").Value; |  | ||||||
|  |  | ||||||
|             if (string.IsNullOrEmpty(ConnectionString) || string.IsNullOrEmpty(Databasename) || string.IsNullOrEmpty(Audience)) |             if (string.IsNullOrEmpty(ConnectionString) || string.IsNullOrEmpty(Databasename)) | ||||||
|  |             { | ||||||
|                 throw new InvalidOperationException("Mongo connection is not configured correctly."); |                 throw new InvalidOperationException("Mongo connection is not configured correctly."); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             services.Configure<MongoDbSettings>(options => |             services.Configure(delegate (MongoDbSettings options) | ||||||
|             { |             { | ||||||
|                 options.ConnectionString = ConnectionString; |                 options.ConnectionString = ConnectionString; | ||||||
|                 options.Databasename = Databasename; |                 options.Databasename = Databasename; | ||||||
|                 options.Audience = Audience; |  | ||||||
|             }); |  | ||||||
|  |  | ||||||
|             services.AddSingleton<IMongoClient>(serviceProvider => |                 if (!environment.Equals("Local", StringComparison.OrdinalIgnoreCase)) | ||||||
|                 { |                 { | ||||||
|                 var settings = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; |                     options.Audience = Audience; | ||||||
|                 var mongoClientSettings = MongoClientSettings.FromConnectionString(settings.ConnectionString); |                 } | ||||||
|                 mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new AzureIdentityProvider(settings.Audience)); |             }); | ||||||
|  |             services.AddSingleton((Func<IServiceProvider, IMongoClient>)delegate (IServiceProvider serviceProvider) | ||||||
|  |             { | ||||||
|  |                 MongoDbSettings value2 = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; | ||||||
|  |                 MongoClientSettings mongoClientSettings = MongoClientSettings.FromConnectionString(value2.ConnectionString); | ||||||
|  |  | ||||||
|  |                 if (!environment.Equals("Local", StringComparison.OrdinalIgnoreCase))  | ||||||
|  |                 { | ||||||
|  |                     mongoClientSettings.Credential = MongoCredential.CreateOidcCredential(new AzureIdentityProvider(value2.Audience)); | ||||||
|  |                 } | ||||||
|  |                      | ||||||
|                 return new MongoClient(mongoClientSettings); |                 return new MongoClient(mongoClientSettings); | ||||||
|             }); |             }); | ||||||
|  |             services.AddSingleton(delegate (IServiceProvider serviceProvider) | ||||||
|             services.AddSingleton<IMongoDatabase>(serviceProvider => |  | ||||||
|             { |             { | ||||||
|                 var settings = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; |                 MongoDbSettings value = serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value; | ||||||
|                 var client = serviceProvider.GetRequiredService<IMongoClient>(); |                 return serviceProvider.GetRequiredService<IMongoClient>().GetDatabase(value.Databasename); | ||||||
|                 return client.GetDatabase(settings.Databasename); |  | ||||||
|             }); |             }); | ||||||
|  |             services.AddSingleton((Func<IServiceProvider, IMongoDbSettings>)((IServiceProvider serviceProvider) => serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value)); | ||||||
|             services.AddSingleton<IMongoDbSettings>(serviceProvider => serviceProvider.GetRequiredService<IOptions<MongoDbSettings>>().Value); |  | ||||||
|  |  | ||||||
|             return services; |             return services; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								Core.Blueprint.Mongo/nuget.config
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Core.Blueprint.Mongo/nuget.config
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <configuration> | ||||||
|  | 	<packageSources> | ||||||
|  | 		<add key="Gitea" value="https://gitea.white-enciso.pro/api/packages/AgileWebs/nuget" /> | ||||||
|  | 	</packageSources> | ||||||
|  | 	<packageSourceCredentials> | ||||||
|  | 		<Gitea> | ||||||
|  | 			<Username>oscarmmtz</Username> | ||||||
|  | 			<ClearTextPassword>544831e1ceaf52958e02c5de4d23cbde9e7a860a</ClearTextPassword> | ||||||
|  | 		</Gitea> | ||||||
|  | 	</packageSourceCredentials> | ||||||
|  | </configuration> | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| namespace Core.Blueprint.Caching.Adapters | namespace Core.Blueprint.Redis | ||||||
| { | { | ||||||
|     public interface ICacheSettings |     public interface ICacheSettings | ||||||
|     { |     { | ||||||
|   | |||||||
| @@ -1,10 +1,8 @@ | |||||||
| using Core.Blueprint.Caching.Adapters; | using Microsoft.Extensions.Configuration; | ||||||
| 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.Caching.Configuration | namespace Core.Blueprint.Redis.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. | ||||||
| @@ -19,32 +17,23 @@ namespace Core.Blueprint.Caching.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) | ||||||
|         { |         { | ||||||
|             // TODO for the following variable we'll need to add in the appsettings.json the following config: "UseRedisCache": true, |             // Retrieve the Redis connection string from the configuration. | ||||||
|             bool useRedis = configuration.GetValue<bool>("UseRedisCache"); |             // Get Redis configuration section | ||||||
|             //TODO decide wheter to use appsettings or the following ENV variable |  | ||||||
|             useRedis = Environment.GetEnvironmentVariable("CORE_BLUEPRINT_PACKAGES_USE_REDIS")?.ToLower() == "true"; |  | ||||||
|  |  | ||||||
|             if (useRedis) |  | ||||||
|             { |  | ||||||
|             var redisConnectionString = configuration.GetSection("ConnectionStrings:Redis").Value; |             var redisConnectionString = configuration.GetSection("ConnectionStrings:Redis").Value; | ||||||
|             if (string.IsNullOrEmpty(redisConnectionString)) |             if (string.IsNullOrEmpty(redisConnectionString)) | ||||||
|             { |             { | ||||||
|                 throw new InvalidOperationException("Redis connection is not configured."); |                 throw new InvalidOperationException("Redis connection is not configured."); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|                 services.AddSingleton<ICacheProvider>(provider => |             // Register RedisCacheProvider | ||||||
|  |             services.AddSingleton<IRedisCacheProvider>(provider => | ||||||
|                 new RedisCacheProvider(redisConnectionString, provider.GetRequiredService<ILogger<RedisCacheProvider>>())); |                 new RedisCacheProvider(redisConnectionString, provider.GetRequiredService<ILogger<RedisCacheProvider>>())); | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 services.AddMemoryCache(); |  | ||||||
|                 services.AddSingleton<ICacheProvider, MemoryCacheProvider>(); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|  |             // 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("CacheSettings section is not configured."); |                 throw new InvalidOperationException("Redis CacheSettings section is not configured."); | ||||||
|             } |             } | ||||||
|             services.AddSingleton<ICacheSettings>(cacheSettings); |             services.AddSingleton<ICacheSettings>(cacheSettings); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,9 +1,9 @@ | |||||||
| namespace Core.Blueprint.Caching.Contracts | namespace Core.Blueprint.Redis | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Interface for managing Redis cache operations. |     /// Interface for managing Redis cache operations. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public interface ICacheProvider |     public interface IRedisCacheProvider | ||||||
|     { |     { | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Retrieves a cache item by its key. |         /// Retrieves a cache item by its key. | ||||||
| @@ -4,11 +4,11 @@ | |||||||
|     <TargetFramework>net8.0</TargetFramework> |     <TargetFramework>net8.0</TargetFramework> | ||||||
|     <ImplicitUsings>enable</ImplicitUsings> |     <ImplicitUsings>enable</ImplicitUsings> | ||||||
|     <Nullable>enable</Nullable> |     <Nullable>enable</Nullable> | ||||||
|  | 	<PackageId>Core.Blueprint.Redis</PackageId> | ||||||
|   </PropertyGroup> |   </PropertyGroup> | ||||||
| 
 | 
 | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <PackageReference Include="Microsoft.Azure.StackExchangeRedis" Version="3.2.1" /> |     <PackageReference Include="Microsoft.Azure.StackExchangeRedis" Version="3.2.1" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.5" /> |  | ||||||
|     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.5" /> |     <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.5" /> |     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.5" /> | ||||||
|     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.5" /> |     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.5" /> | ||||||
| @@ -1,7 +1,11 @@ | |||||||
| using System.Text; | using System; | ||||||
|  | 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.Caching.Helpers | namespace Core.Blueprint.Redis.Helpers | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Helper class for generating consistent and normalized cache keys. |     /// Helper class for generating consistent and normalized cache keys. | ||||||
|   | |||||||
| @@ -1,86 +0,0 @@ | |||||||
| 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,15 +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; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace Core.Blueprint.Caching | namespace Core.Blueprint.Redis | ||||||
| { | { | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// Redis cache provider for managing cache operations. |     /// Redis cache provider for managing cache operations. | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public sealed class RedisCacheProvider : ICacheProvider |     public sealed class RedisCacheProvider : IRedisCacheProvider | ||||||
|     { |     { | ||||||
|         private IDatabase _cacheDatabase = null!; |         private IDatabase _cacheDatabase = null!; | ||||||
|         private readonly ILogger<RedisCacheProvider> _logger; |         private readonly ILogger<RedisCacheProvider> _logger; | ||||||
| @@ -30,20 +30,32 @@ namespace Core.Blueprint.Caching | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Initializes and establishes a connection to Redis using the provided connection string. |         /// Initializes and establishes a connection to Redis based on the environment. | ||||||
|  |         /// Uses a local connection in development, and Azure with token credentials in other environments. | ||||||
|         /// </summary> |         /// </summary> | ||||||
|         /// <param name="connectionString">The Redis connection string.</param> |         /// <param name="connectionString">The Redis connection string.</param> | ||||||
|         /// <returns>An <see cref="IDatabase"/> instance representing the Redis cache database.</returns> |         /// <returns>An <see cref="IDatabase"/> instance representing the Redis cache database.</returns> | ||||||
|         /// <exception cref="Exception">Thrown when the connection to Redis fails.</exce |         /// <exception cref="Exception">Thrown when the connection to Redis fails.</exception> | ||||||
|         async Task<IDatabase> InitializeRedisAsync(string connectionString) |         async Task<IDatabase> InitializeRedisAsync(string connectionString) | ||||||
|         { |         { | ||||||
|             try |             try | ||||||
|             { |             { | ||||||
|                 var configurationOptions = await ConfigurationOptions.Parse($"{connectionString}") |                 var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
|  |                 ConnectionMultiplexer connectionMultiplexer; | ||||||
|  |  | ||||||
|  |                 if (environment.Equals("Local", StringComparison.OrdinalIgnoreCase)) | ||||||
|  |                 { | ||||||
|  |                     connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(connectionString); | ||||||
|  |                 } | ||||||
|  |                 else | ||||||
|  |                 { | ||||||
|  |                     var configurationOptions = await ConfigurationOptions.Parse(connectionString) | ||||||
|                         .ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential()); |                         .ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential()); | ||||||
|  |  | ||||||
|                     configurationOptions.AbortOnConnectFail = false; |                     configurationOptions.AbortOnConnectFail = false; | ||||||
|                 var connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions); |  | ||||||
|  |                     connectionMultiplexer = await ConnectionMultiplexer.ConnectAsync(configurationOptions); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|                 _logger.LogInformation("Successfully connected to Redis."); |                 _logger.LogInformation("Successfully connected to Redis."); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -18,6 +18,8 @@ namespace Core.Blueprint.SQLServer.Configuration | |||||||
|         /// <returns>An updated <see cref="IServiceCollection"/> with SQL Server services registered.</returns> |         /// <returns>An updated <see cref="IServiceCollection"/> with SQL Server services registered.</returns> | ||||||
|         public static IServiceCollection AddSQLServer(this IServiceCollection services, IConfiguration configuration) |         public static IServiceCollection AddSQLServer(this IServiceCollection services, IConfiguration configuration) | ||||||
|         { |         { | ||||||
|  |             var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? string.Empty; | ||||||
|  |  | ||||||
|                 var chainedCredentials = new ChainedTokenCredential( |                 var chainedCredentials = new ChainedTokenCredential( | ||||||
|                     new ManagedIdentityCredential(), |                     new ManagedIdentityCredential(), | ||||||
|                     new SharedTokenCacheCredential(), |                     new SharedTokenCacheCredential(), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user