上篇文章完成了文章增刪改的接口和友情連接列表的接口,本篇繼續。html
善於思考的同窗確定發現,在執行增刪改操做後,Redis緩存中的數據仍是存在的,也就意味着查詢接口返回的數據仍是舊的,因此在寫接口以前,先完成一下清緩存的操做。前端
移除緩存我這裏找了一個新的包:Caching.CSRedis
,選他是由於微軟的包Microsoft.Extensions.Caching.StackExchangeRedis
沒有給咱們實現批量刪除的功能。git
Caching.CSRedis
開源地址,https://github.com/2881099/csredis 在這不作過多介紹,感興趣的本身去看。github
在.Application.Caching
層添加包Caching.CSRedis
,Install-Package Caching.CSRedis
,而後在模塊類MeowvBlogApplicationCachingModule
中進行配置。redis
//MeowvBlogApplicationCachingModule.cs ... public override void ConfigureServices(ServiceConfigurationContext context) { ... var csredis = new CSRedis.CSRedisClient(AppSettings.Caching.RedisConnectionString); RedisHelper.Initialization(csredis); context.Services.AddSingleton<IDistributedCache>(new CSRedisCache(RedisHelper.Instance)); } ...
直接新建一個移除緩存的接口:ICacheRemoveService
,添加移除緩存的方法RemoveAsync()
。代碼較少,能夠直接寫在緩存基類CachingServiceBase
中。數據庫
public interface ICacheRemoveService { /// <summary> /// 移除緩存 /// </summary> /// <param name="key"></param> /// <param name="cursor"></param> /// <returns></returns> Task RemoveAsync(string key, int cursor = 0); }
而後能夠在基類中實現這個接口。數組
public async Task RemoveAsync(string key, int cursor = 0) { var scan = await RedisHelper.ScanAsync(cursor); var keys = scan.Items; if (keys.Any() && key.IsNotNullOrEmpty()) { keys = keys.Where(x => x.StartsWith(key)).ToArray(); await RedisHelper.DelAsync(keys); } }
簡單說一下這個操做過程,使用ScanAsync()
獲取到全部的Redis key值,返回的是一個string數組,而後根據參數找到符合此前綴的全部key,最後調用DelAsync(keys)
刪除緩存。緩存
在須要有移除緩存功能的接口上繼承ICacheRemoveService
,這裏就是IBlogCacheService
。app
//IBlogCacheService.cs namespace Meowv.Blog.Application.Caching.Blog { public partial interface IBlogCacheService : ICacheRemoveService { } }
在基類中已經實現了這個接口,因此如今全部繼承基類的緩存實現類均可以調用移除緩存方法了。async
在MeowvBlogConsts
中添加緩存前綴的常量。
//MeowvBlogConsts.cs /// <summary> /// 緩存前綴 /// </summary> public static class CachePrefix { public const string Authorize = "Authorize"; public const string Blog = "Blog"; public const string Blog_Post = Blog + ":Post"; public const string Blog_Tag = Blog + ":Tag"; public const string Blog_Category = Blog + ":Category"; public const string Blog_FriendLink = Blog + ":FriendLink"; }
而後在BlogService.Admin.cs
服務執行增刪改後調用移除緩存的方法。
//BlogService.Admin.cs // 執行清除緩存操做 await _blogCacheService.RemoveAsync(CachePrefix.Blog_Post);
由於是小項目,採用這種策略直接刪除緩存,這樣就搞定了當在執行增刪改操做後,前臺接口能夠實時查詢出最後的結果。
當咱們修改文章數據的時候,是須要把當前數據庫中的數據帶出來顯示在界面上的,由於有可能只是個別地方須要修改,因此這還須要一個查詢文章詳情的接口,固然這裏的詳情和前端的是不同的,這裏是須要根據Id主鍵去查詢。
添加模型類PostForAdminDto.cs
,直接繼承PostDto
,而後添加一個Tags列表就行,==,好像和上一篇文章中的EditPostInput
字段是如出一轍的。順手將EditPostInput
改一下吧,具體代碼以下:
//PostForAdminDto.cs using System.Collections.Generic; namespace Meowv.Blog.Application.Contracts.Blog { public class PostForAdminDto : PostDto { /// <summary> /// 標籤列表 /// </summary> public IEnumerable<string> Tags { get; set; } } } //EditPostInput.cs namespace Meowv.Blog.Application.Contracts.Blog.Params { public class EditPostInput : PostForAdminDto { } }
在IBlogService.Admin.cs
中添加接口。
/// <summary> /// 獲取文章詳情 /// </summary> /// <param name="id"></param> /// <returns></returns> Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id);
實現這個接口。
/// <summary> /// 獲取文章詳情 /// </summary> /// <param name="id"></param> /// <returns></returns> public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync(int id) { var result = new ServiceResult<PostForAdminDto>(); var post = await _postRepository.GetAsync(id); var tags = from post_tags in await _postTagRepository.GetListAsync() join tag in await _tagRepository.GetListAsync() on post_tags.TagId equals tag.Id where post_tags.PostId.Equals(post.Id) select tag.TagName; var detail = ObjectMapper.Map<Post, PostForAdminDto>(post); detail.Tags = tags; detail.Url = post.Url.Split("/").Where(x => !string.IsNullOrEmpty(x)).Last(); result.IsSuccess(detail); return result; }
先根據Id查出文章數據,再經過聯合查詢找出標籤數據。
CreateMap<Post, PostForAdminDto>().ForMember(x => x.Tags, opt => opt.Ignore());
新建一條AutoMapper配置,將Post
轉換成PostForAdminDto
,忽略Tags。
而後將查出來的標籤、Url賦值給DTO,輸出便可。在BlogController.Admin
中添加API。
/// <summary> /// 獲取文章詳情 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpGet] [Authorize] [Route("admin/post")] [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)] public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync([Required] int id) { return await _blogService.GetPostForAdminAsync(id); }
至此,完成了關於文章的全部接口。
接下來按照以上方式依次完成分類、標籤、友鏈的增刪改查接口,我以爲若是你有跟着我一塊兒作,剩下的能夠本身完成。
開源地址:https://github.com/Meowv/Blog/tree/blog_tutorial
搭配下方課程學習更佳 ↓ ↓ ↓