Jakeuj's Notes master Help

ABP.IO 新手教學 No.16 建立應用服務 Application Service

ABP.IO WEB應用程式框架 新手教學 No.0 索引

最後是應用服務層,這邊寫完就可以呼叫 API 了,這邊先來引用官方說明

應用程序層由兩個分離的項目組成:

  • Acme.BookStore.Application.Contracts包含你的DTO應用服務接口.

  • Acme.BookStore.Application 包含你的應用服務實現.

總之呢,上面那個合約是實際 client 所關心的,包含服務介面與DTO,

至於怎麼實作外部是不需要知道的,所以如果有公開dll給clinet使用基本上只會包含 Application.Contracts

DTO

首先呢我們需要先定義與client溝通的資料傳輸物件 DTO

所以在Acme.BookStore.Application.Contracts項目中創建 Books 資料夾並新增一個名為BookDto的DTO類

  • DTO類被用來在表示層應用層 傳遞數據 .查看DTO文檔查看更多信息.

  • 為了在頁面上展示書籍信息, BookDto被用來將書籍數據傳遞到表示層.

  • BookDto繼承自AuditedEntityDto<Guid> .跟上面定義的Book實體一樣具有一些審計屬性.

namespace Acme.BookStore.Books { public class BookDto : AuditedEntityDto<Guid> { public string Name { get; set; } public BookType Type { get; set; } public DateTime PublishDate { get; set; } public float Price { get; set; } } }

※ 官方教學是沒有 Books 資料夾,但實戰上建議全部專案的Book相關東西都先建立一個Books資料夾,再把東西建在裡面,不然東西一多想像一下…

1626684853

這邊 Dto 基類可以自己換別的,比如只有Id的 EntityDto<T>

namespace AbpDemo { public class ProductDto : EntityDto<Guid> { public string Name { get; set; } //... } }

https://docs.abp.io/zh-Hans/abp/latest/Data-Transfer-Objects#%E5%AE%9E%E4%BD%93%E7%9B%B8%E5%85%B3dto

AutoMapper

有用過應該不是很陌生,這邊要在 profile 裡面加上 Dto 的映射,樣板內建好的 Profile 檔案

Acme.BookStore.Application項目的BookStoreApplicationAutoMapperProfile類中定義

namespace Acme.BookStore { public class BookStoreApplicationAutoMapperProfile : Profile { public BookStoreApplicationAutoMapperProfile() { CreateMap<Book, BookDto>(); } } }
1626685149

Application Service

官方範例是使用 CRUD 基底類別,我這邊打算先用比較一般的 API 來做說明

參照: https://docs.abp.io/zh-Hans/abp/latest/Application-Services

首先定義介面 IBookAppService 必須繼承 IApplicationService ,雖然沒有介面也可以跑,但最佳實踐建議每個服務都有自己的介面

namespace Acme.BookStore.Books { public interface IBookAppService: IApplicationService { Task<List<BookDto>> GetListAsync(); } }
1626686760

然後實作該介面,必須繼承樣板內建的 BookStoreAppService,還有剛剛新增好的 IBookAppService

namespace Acme.BookStore.Books { public class BookAppService:BookStoreAppService, IBookAppService { private readonly IRepository<Book, Guid> _bookRepository; public BookAppService(IRepository<Book, Guid> bookRepository) { _bookRepository = bookRepository; } public async Task<List<BookDto>> GetListAsync() { var entities = await _bookRepository.GetListAsync(); return ObjectMapper.Map<List<Book>, List<BookDto>>(entities); } } }
1626686900

Redis

參考文件: Redis

預設 Redis 是打開的,如果開發環境沒有 redis 可以關閉。

Acme.BookStore.HttpApi.Host appsettings.Development.json

{ "Redis": { "IsEnabled": "false" } }

當然你要用 docker 起一個 redis container 也是可以,或是改到你 redis 開發機的位址去。

到這邊就可以執行 Acme.BookStore.HttpApi.Host 了,會跑出 Swagger Page,然後可以試著呼叫 API

CrudAppService

參考文件: CrudAppService

官方原教學:https://docs.abp.io/zh-Hans/abp/latest/Tutorials/Part-1#ibookappservice

有內建快速 Crud 讓你不需要實作甚麼程式就可以擁有基本 CRUD 功能

包含分頁、排序與篩選…等等常用功能。

參考:https://docs.abp.io/zh-Hans/abp/latest/Application-Services#crud%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1

自動生成API Controllers

參考文件: 自動生成API Controllers

Abp 是不用自己再去寫薄博的控制器的,它會自動將 AppService 公開 API

你通常創建Controller以將應用程序服務公開為HTTP API端點.因此允許瀏覽器或第三方客戶端通過AJAX調用它們.

ABP可以自動按照慣例將你的應用程序服務配置為MVC API控制器.

Swagger UI

1626690589 Jakeuj

PS5

  • ABP

  • 回首頁

本文章從點部落遷移至 Writerside

14 October 2025