网站首页 网站源码
using System.Collections.Specialized;
using System.Net.Http;
using System.Net.Http.Json;
using Dpz.Core.Public.ViewModel.V4;
using Dpz.Core.Service.V4.Services;
using Dpz.Core.Web.Models;
using ZiggyCreatures.Caching.Fusion;
namespace Dpz.Core.Web.Library.Api.Service;
public class HomeCacheService(
IArticleService articleService,
IPictureRecordService pictureRecordService,
IHttpContextAccessor httpContextAccessor,
IHttpClientFactory httpClientFactory,
IFusionCache fusionCache,
ILogger<HomeCacheService> logger
) : IHomeCacheService
{
/// <summary>
/// 过期时间
/// </summary>
private readonly TimeSpan _expired = TimeSpan.FromDays(1);
private async Task<IList<VmPictureRecord>> GetBannersAsync()
{
var banner = await pictureRecordService.GetBannerAsync();
return banner.ToList();
}
public async Task<HomeContainerModel> GetCacheDataAsync()
{
return await fusionCache.GetOrSetAsync<HomeContainerModel>(
CacheKey.HomeContainerKey,
async (_, _) =>
{
var model = new HomeContainerModel
{
Blogs = await GetTopArticlesAsync(),
LikeArticle = await GetRandomArticlesAsync(),
News = await GetLatestArticlesAsync(),
Pictures = await GetBannersAsync(),
Tags = await GetArticleTagsAsync(),
};
return model;
},
options => options.SetDuration(_expired)
);
}
public async Task<IList<string>> GetArticleTagsAsync()
{
return await articleService.GetAllTagsAsync();
}
public async Task<IList<VmArticleMini>> GetLatestArticlesAsync()
{
return await articleService.GetLatestAsync();
}
public async Task<IList<VmArticleMini>> GetRandomArticlesAsync()
{
return await articleService.GetRandomArticlesAsync();
}
public async Task<TodayNewsModel?> GetTodayNewsAsync()
{
var ipAddress = httpContextAccessor.HttpContext?.Request.GetIpAddress() ?? "";
var todayNewsKey = $"home-news-{ipAddress}";
return await fusionCache.GetOrSetAsync<TodayNewsModel?>(
todayNewsKey,
async (_, cancellationToke) =>
{
var httpClient = httpClientFactory.CreateClient("edge");
try
{
var parameters = new NameValueCollection { { "ip", ipAddress } };
var request = new HttpRequestMessage(
HttpMethod.Get,
"https://news.topurl.cn/api?" + parameters.ToQueryString()
);
var response = await httpClient.SendAsync(request, cancellationToke);
if (!response.IsSuccessStatusCode)
{
logger.LogWarning(
"get today news fail,status code:{Code}",
response.StatusCode
);
return null;
}
var data = await response.Content.ReadFromJsonAsync<NewsResponse>(
cancellationToken: cancellationToke
);
return data?.Data;
}
catch (Exception ex)
{
logger.LogError(ex, "get today news fail");
return null;
}
},
options => options.SetDuration(TimeSpan.FromHours(5))
);
}
private async Task<List<VmArticleMini>> GetTopArticlesAsync()
{
var articleMinis = await articleService.GetTopArticlesAsync(-3);
return articleMinis;
}
}
上述代码定义了一个名为 HomeCacheService
的类,它实现了 IHomeCacheService
接口。这个类的主要功能是管理和缓存与首页相关的数据,包括文章、图片、标签等。以下是代码的主要功能和结构的详细解释:
HomeCacheService
的构造函数接受多个依赖项,包括:
IArticleService
:用于获取文章相关数据的服务。IHybridCachingProvider
:用于缓存数据的服务。IPictureRecordService
:用于获取图片记录的服务。IHttpContextAccessor
:用于访问当前 HTTP 上下文。IHttpClientFactory
:用于创建 HTTP 客户端。ILogger<HomeCacheService>
:用于记录日志。_expired
变量定义了缓存的过期时间,这里设置为 3 小时。
HomeKey
是用于缓存首页数据的键。
GetBannersAsync
方法用于获取横幅图片:
pictureRecordService.GetBannerAsync()
获取横幅数据,并将其存入缓存。GetCacheDataAsync
方法用于获取首页的所有数据:
HomeContainerModel
对象。HomeContainerModel
对象,然后存入缓存。UpdateBannerAsync
方法用于更新横幅数据:
pictureRecordService
获取最新的横幅数据,并在每个横幅的 AccessUrl
后添加 !banner
字符串。GetArticleTagsAsync
方法用于获取文章标签:
articleService.GetAllTagsAsync()
获取标签,并将其存入缓存。GetLatestArticlesAsync
方法用于获取最新的文章:
articleService.GetLatestAsync()
获取最新文章,并将其存入缓存。UpdateLatestArticlesAsync
方法用于更新最新文章的缓存。
GetRandomArticlesAsync
方法用于获取随机文章:
articleService.GetRandomArticlesAsync()
获取随机文章,并将其存入缓存。GetTodayNewsAsync
方法用于获取今日新闻:
GetTopArticlesAsync
方法用于获取热门文章:
articleService.GetTopArticlesAsync()
获取热门文章,并将其存入缓存。UpdateViewTopAsync
方法用于更新热门文章的缓存。
HomeCacheService
类的主要功能是通过缓存机制提高首页数据的访问效率,减少对数据库和外部服务的频繁调用。它通过多个方法获取和更新不同类型的数据,并使用缓存来存储这些数据,以便在后续请求中快速访问。