現在 Repository 都已經實做完了,接下來換實作 Service 了,今天先做大致的 PostService ,
需要實作取得全部文章、新增、編輯、刪除(假刪除)。並要注意編輯時,要做歷史紀錄備份。
public class PostService
{
private readonly IPostRepository _postRepository;
public PostService(IPostRepository postRepository)
{
_postRepository = postRepository;
}
public List<Post> GetAll(int page = 1, int pageSize = 10)
{
var skipCount = (page - 1) * pageSize;
return _postRepository.Query(x => x.ParentId == 0)?.Skip(skipCount).Take(pageSize).ToList() ?? new List<Post>();
}
public async Task<Post?> GetAsync(int id)
{
return await _postRepository.GetAsync(x => x.Id == id);
}
public async Task CreateAsync(Post post)
{
post.UserId = 1;
post.PublishDate = DateTime.Now;
post.UpdateDate = DateTime.Now;
await _postRepository.CreateAsync(post);
_postRepository.UnitOfWork.Save();
}
public async Task Update(Post post)
{
var oldPost = await GetAsync(post.Id);
if (oldPost is null)
{
return;
}
var historyPost = oldPost.Clone();
historyPost.ParentId = oldPost.Id;
historyPost.Id = 0;
historyPost.Status = PostStatus.編輯紀錄.ToString();
await _postRepository.CreateAsync(historyPost);
oldPost.Title = post.Title;
oldPost.Content = post.Content;
oldPost.FilteredContent = post.FilteredContent;
oldPost.Status = post.Status;
oldPost.OgTitle = post.OgTitle;
oldPost.OgDescription = post.OgDescription;
oldPost.OgKeywords = post.OgKeywords;
oldPost.OgImage = post.OgImage;
oldPost.UpdateDate = DateTime.Now;
_postRepository.UnitOfWork.Save();
}
public async void Delete(int id)
{
var post = await GetAsync(id);
if (post is null)
{
return;
}
post.Status = PostStatus.已刪除.ToString();
_postRepository.UnitOfWork.Save();
}
}
建構函式:這個類別具有一個建構函式,接受一個 IPostRepository 介面型別的參數,用來依賴一個實作了該介面的物件。這是相依性注入的一個例子,它允許在建立 PostService 的實例時傳入不同的資料存取實作,實現了鬆散耦合。
GetAll 方法:這個方法用於檢索所有文章,可以指定要返回的頁數和每頁的大小。它使用 _postRepository 來存取資料庫中的文章,並進行分頁操作。
GetAsync 方法:這個方法用於異步檢索特定 ID 的文章。它使用 _postRepository 來執行異步查詢。
CreateAsync 方法:這個方法用於創建新文章。它設定了一些文章屬性,如 UserId、PublishDate 和 UpdateDate,然後呼叫 _postRepository 的 CreateAsync 方法來將文章新增到資料庫中。最後,它呼叫 _postRepository.UnitOfWork.Save() 以保存變更。
Update 方法:這個方法用於更新現有的文章。它首先嘗試獲取舊文章,如果找不到舊文章,則返回。然後,它創建一個新的歷史文章(historyPost),這個歷史文章是對舊文章的一個複製,並添加了一些更新的屬性,例如 ParentId 和 Status。用來表示哪一篇文章的歷史紀錄。接著,它呼叫 _postRepository 的 CreateAsync 方法來將歷史文章作為編輯紀錄新增到資料庫中。然後呼叫 _postRepository.UnitOfWork.Save() 以保存變更。
PostService 類別主要負責管理文章的 CRUD(創建、讀取、更新、刪除)操作,並支援分頁查詢。它依賴於一個實現了 IPostRepository 介面的資料存取物件,以實現與資料庫的互動。此外,它還包括了一個歷史記錄的功能,當更新文章時會創建一個歷史版本。
另外我定義了 PostStatus Enums 代表文章的狀態
public enum PostStatus
{
草稿,
已發佈,
編輯紀錄,
已下架,
已刪除
}
並幫 Post 定義了擴充方法 Clone() 作為複製之用
public static class PostExtensions
{
public static Post Clone(this Post post)
{
var newPost = new Post();
newPost.Id = post.Id;
newPost.Title = post.Title;
newPost.Content = post.Content;
newPost.FilteredContent = post.FilteredContent;
newPost.UpdateDate = post.UpdateDate;
newPost.PublishDate = post.PublishDate;
newPost.Status = post.Status;
newPost.OgDescription = post.OgDescription;
newPost.OgTitle = post.OgTitle;
newPost.OgKeywords = post.OgKeywords;
newPost.OgImage = post.OgImage;
return newPost;
}
}
程式碼請至 GitHub