using System.Threading.Tasks;
using DouyinApi.Common;
using DouyinApi.Common.Caches;
using DouyinApi.Common.Caches.Distributed;
using DouyinApi.Common.Caches.Interface;
using DouyinApi.Common.Option;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Serilog;
using StackExchange.Redis;
namespace DouyinApi.Extensions.ServiceExtensions;
public static class CacheSetup
{
///
/// 统一注册缓存
///
///
public static void AddCacheSetup(this IServiceCollection services)
{
var cacheOptions = App.GetOptions();
if (cacheOptions.Enable)
{
// 配置启动Redis服务,虽然可能影响项目启动速度,但是不能在运行的时候报错,所以是合理的
services.AddSingleton(sp =>
{
//获取连接字符串
var configuration = ConfigurationOptions.Parse(cacheOptions.ConnectionString, true);
configuration.ResolveDns = true;
return ConnectionMultiplexer.Connect(configuration);
});
services.AddSingleton(p => p.GetService() as ConnectionMultiplexer);
//使用Redis
services.AddStackExchangeRedisCache(options =>
{
options.ConnectionMultiplexerFactory =
() => Task.FromResult(App.GetService(false));
if (!cacheOptions.InstanceName.IsNullOrEmpty()) options.InstanceName = cacheOptions.InstanceName;
});
services.AddTransient();
}
else
{
//使用内存
services.Remove(services.FirstOrDefault(x => x.ServiceType == typeof(IMemoryCache)));
services.AddSingleton();
services.AddSingleton(provider => provider.GetService());
services.AddOptions();
services.AddSingleton();
}
services.AddSingleton();
}
}