# 刪除產品
刪除產品與創建或編輯操作相比,非常簡單,因為刪除我們不需要構建表單。
首先,在`IProductAppService`接口中添加一個新方法:
```
Task DeleteAsync(Guid id);
```
然后,在`ProductAppService`類中實現它:
```
public async Task DeleteAsync(Guid id)
{
????await _productRepository.DeleteAsync(id);
}
```
現在向產品列表添加一個新刪除按鈕。打開`Index.cshtml.js`,并在**Edit**操作之后添加以下定義(在`rowAction.items`數組中):
```
{
????text: l('Delete'),
????confirmMessage: function (data) {
????????return l('ProductDeletionConfirmationMessage',data.record.name);
????},
????action: function (data) {
????????productManagement.products.product
????????????.delete(data.record.id)
????????????.then(function() {
????????????????abp.notify.info(l('SuccessfullyDeleted'));
????????????????dataTable.ajax.reload();
????????????});
????}
}
```
`confirmMessage`用于在刪除之前獲得用戶確認。`productManagement.products.product.delete`函數由 ABP 框架動態創建。通過這種方式,可以直接在 JS 代碼中調用服務器端方法。我們只需傳遞當前記錄的 ID。`then`函數傳遞一個回調函數,用于刪除之后的操作。最后,我們使用`abp.notify.info`通知用戶,最后刷新數據表。
我們使用了一些本地化文本,因此我們需要在本地化`en.json`文件中添加以下代碼:
```
"ProductDeletionConfirmationMessage": "Are you sure to delete this book: {0}",
"SuccessfullyDeleted": "Successfully deleted!"
```
再次訪問 web 查看結果:

因為現在有兩個操作按鈕,所以**編輯**按鈕會自動變成一個下拉選項。當您單擊**刪除**操作時,您會收到一條確認消息:

如果你點擊在**是**按鈕上,您將在頁面上看到一條通知,并且數據表將被刷新。
實施產品刪除非常簡單。ABP 的內置功能幫助我們實現了常見的模式,例如客戶端到服務器的通信、確認對話框和 UI 通知。
請注意,`Product`實體派生于`FullAuditedAggregateRoot`,所以它使用了軟刪除。刪除產品后檢查數據庫,您會看到它并沒有真正刪除,但是`IsDeleted`字段已經設置為`true`(邏輯刪除不是物理刪除)。下次查詢商品時,已刪除的商品會自動過濾掉,不包含在查詢結果中。這是由 ABP 框架的數據過濾系統完成的。
## 概括
在本章中,我們創建了一個完整的 CRUD 頁面。我們介紹了解決方案中的所有層,并了解了ABP 的程序開發的基本方法。
同時,也向您介紹了許多不同的概念,例如實體、存儲庫、數據庫映射和遷移、自動化測試、API 控制器、動態 JavaScript 代理、對象映射、軟刪除等。ABP 是一個全棧應用程序框架,可幫助您通過最佳實踐來實現這些概念。它提供了必要的基礎設施,使您的日常開發更容易。
此時您可能不了解所有細節。其余章節會深入研究這些概念并展示它們的細節和不同的用例。
以上的示例相對簡單,它不包含任何重要的業務邏輯,因為我引入了許多概念目的是想讓大家對這些基礎概念有個初步的理解而不是業務復雜性。在此示例中,我忽略了授權。授權將在\[*第 7 章*\] *探索橫切關注點*”中進行說明。
在一本書中演示一個具有現實復雜性的示例并不容易。然而,我已經為本書的讀者準備了一個完整的參考應用程序,它具有真實世界的特點和復雜性。參考程序是開源的,可在 GitHub 上獲得。
下一章將介紹該參考程序并展示參考解決方案的功能、分層和代碼結構。其余章節會經常引用該示例的源代碼。
- 前言
- 第一部分
- 第1章 現代軟件開發和 ABP 框架
- 企業級 Web 開發的挑戰
- ABP框架的能力清單
- 第2章 ABP框架入門
- 安裝 ABP CLI
- 創建新解決方案
- 運行解決方案
- 探索預構建模塊
- 第3章 逐步開發開發ABP應用
- 創建解決方案
- 定義領域對象
- EFCore和數據庫映射
- 定義應用服務
- 測試產品
- 產品列表
- 創建產品
- 編輯產品
- 刪除產品
- 第4章 探索 EventHub解決方案
- 應用介紹
- 架構探索
- 方案運行
- 第二部分
- 第5章 探索ABP基礎架構
- 了解模塊化
- 使用依賴注入系統
- 配置應用程序
- 實現選項模式
- 日志系統
- 第6章 數據訪問基礎架構
- 定義實體
- 定義倉儲庫
- EF Core集成
- 了解 UoW
- 第7章 探索橫切關注點
- 認證授權
- 用戶驗證
- 異常處理
- 第8章 體驗 ABP 的功能和服務
- 獲取當前用戶
- 使用數據過濾
- 控制審計日志
- 緩存數據
- 本地化用戶界面
- 第三部分
- 第9章 理解領域驅動設計
- 介紹 DDD
- 構建基于 DDD 的 解決方案
- 處理多個應用程序
- 了解執行流程
- DDD的通用原則
- 第10章 領域層 Domain
- 領域事件案例分析
- 聚合和實體的設計原則和實踐
- 實現領域服務
- 落地存儲庫
- 構建規約(Specification)
- 領域事件
- 第11章 應用層 Application
- 落地應用服務
- 設計 DTO
- 理解各層的職責
- 第四部分
- 第12章 MVC/Razor 頁面
- 主題系統
- 綁定和壓縮
- 導航菜單
- Bootstrap標簽助手
- 創建表單并驗證
- 使用模態窗口
- 使用JS API
- 調用HTTP API
- 第13章 Blazor WebAssembly UI
- 什么是Blazor
- ABP Blazor UI
- 驗證用戶身份
- 理解主題系統
- 使用菜單
- 使用基本服務
- 使用UI服務
- 消費HTTP API
- 使用全局腳本和樣式
- 第14章 HTTP API 和實時服務
- 構建HTTP API
- 使用HTTP API
- 使用SignalR
- 第五部分
- 第15章 落地模塊化
- 理解模塊化
- 構建支付模塊
- 安裝模塊
- 第16章 實現多租戶
- 理解多租戶
- 多租戶基礎設施
- 使用功能系統
- 何時使用多租戶
- 第17章 構建自動化測試
- 了解ABP測試基礎設施
- 構建單元測試
- 構建集成測試