實現領域驅動設計 - 使用ABP框架 - 更新操作實體
用例演示 - 更新 / 操作實體
一旦一個實體被創建,它將被用例更新/操作,直到它從系統中刪除。可以有不同類型的用例直接或間接地更改實體
在本節中,我們將討論更改 Issue 的多個屬性的典型更新操作。
這次,從更新DTO開始:
public class UpdateIssueDto
{
[Required]
public string Title { get; set; }
public string Text { get; set; }
public Guid? AssignedUserId { get; set; }
}
通過與 IssueCreationDto 比較,您看不到 RepositoryId 。因為,我們的系統不允許跨倉庫移動問題(想想GitHub倉庫)。只有 Title 是必需的,其他屬性是可選的
讓我們看看 IssueAppService 中的 Update 實現:
public class IssueAppService : ApplicationService, IIssueAppService
{
//省略了依賴注入
public async Task<IssueDto> UpdateAsync(Guid id, UpdateIssueDto input)
{
//從數據庫獲取問題實體
var issue = await _issueRepository.GetAsync(id);
//修改標題
await _issueManager.ChangeTitleAsync(issue, input.Title);
//修改分配人
if(input.AssignedUserId.HasValue)
{
var user = await _userRepository.GetAsync(input.AssignedUserId.Value);
await _issueManager.AssignToAsync(issue, user);
}
//修改內容 (沒有業務規則,接受任何內容)
issue.Text = input.Text;
// 更新實體到數據庫
await _issueRepository.UpdateAsync(issue);
//返回表示這個新的問題的DTO
return ObjectMapper.Map<Issue, IssueDto>(issue);
}
}
-
UpdateAsync方法把 id 作為一個單獨的參數。它不包含在UpdateIssueDto 中。這是一個設計決策,可以幫助ABP將此服務 自動暴露 為 HTTP API 端點路由。所以,這和DDD無關 -
首先從數據庫中獲取 Issue 實體。
-
使用
IssueManager的ChangeTitleAsync,而不是直接調用Issue.SetTitle(…)因為我們需要實現重復的Title檢查,就像剛才在實體創建中所做的那樣。這需要對 Issue 和 IssueManager 類進行一些更改(將在下面解釋)。 -
使用
IssueManager的AssignToAsync方法,如果分配的用戶在這個請求中被更改 -
直接設置
Issue.Text,因為沒有相關的業務規則。如果以后需要,我們總是可以進行重構 -
將更改保存到數據庫。同樣,保存實體是協調業務對象和事務的應用程序服務的職責。如果
IssueManager在ChangeTitleAsync和AssignToAsync方法內部保存,將會有雙數據庫操作 參見討論:為什么問題不在IssueManager中保存到數據庫? -
最后使用
IObjectMapper返回一個IssueDto,該IssueDto是通過映射從更新的 Issue 實體自動創建的
如前所述,我們需要對 Issue 和 IssueManager 類進行一些更改。
首先,在 Issue 類中設置 SetTitle 為 internal:
internal void SetTitle(string title)
{
Title = Check.NotNullOrWhiteSpace(title, nameof(title));
}
然后在 IssueManager 中添加了一個新方法來更改標題:
public async Task ChangeTitleAsync(Issue issue, string title)
{
if(issue.Title == title)
{
return;
}
//如果存在相同標題的問題,直接拋錯
if(await _issueRepository.AnyAsync(i => i.Title == title))
{
throw new BusinessException("IssueTracking:IssueWithSameTitleExists");
}
issue.SetTitle(title);
}

浙公網安備 33010602011771號