iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
SideProject30

我想自己刻部落格系列 第 13

建立 Post Service

  • 分享至 

  • xImage
  •  

現在 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


上一篇
使用 DI 相依性注入
下一篇
新增文章功能、首頁顯示功能
系列文
我想自己刻部落格31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言