<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      實現領域驅動設計 - 使用ABP框架 - 領域服務

      領域服務

      領域服務實現領域邏輯

      • 依賴于服務和存儲庫。
      • 需要處理多個聚合,因為該邏輯不適合任何聚合。

      領域服務與領域對象一起工作。它們的方法可以獲取并返回實體、值對象、原始類型……但是,它們不獲取/返回dto。dto是應用層的一部分

      示例:分配問題給用戶

      記住問題分配是如何在問題實體中實現的

      public class Issue : AggregateRoot<Guid>
      {
          public Guid? AssignedUserId { get; private set; }
      
          public async Task AssignToAsync(AppUser user, IUserIssueService userIssueService)
          {
              var openIssueCount = await userIssueService.GetOpenIssueCountAsync(user.Id);
      
              if(openIssueCount >= 3)
              {
                  throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit");
              }
      
              AssignedUserId = user.Id;
          }
      
          public void CleanAssignment()
          {
              AssignedUserId = null;
          }
      }
      

      在這里,我們將把這個邏輯轉移到領域服務中。
      首先,修改Issue類:

      public class Issue : AggregateRoot<Guid>
      {
          public Guid? AssignedUserId { get; internal set; }
      }
      
      • 刪除了與分配問題相關的方法。
      • 將 AssignedUserId 屬性的setter從私有改為內部,以允許從領域服務設置它

      下一步是創建一個名為 IssueManager 的領域服務,該服務具有AssignToAsync 來將給定問題分配給給定用戶

      public class IssueManager : DomainService
      {
          private readonly IRepository<Issue, Guid> _issueReposiroty;
      
          public IssueManager(IRepository<Issue, Guid> issueReposiroty)
          {
              _issueReposiroty = issueReposiroty;
          }
      
          public async Task AssignToAsync(Issue issue, AppUser user)
          {
              var openIssueCount = await _issueRepository.CountAsync(i => i.AssignedUserId == user.Id && !i.IsClosed);
      
              if(openIssueCount >= 3)
              {
                  throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit");
              }
      
              issue.AssignedUserId = user.Id;
          }
      }
      

      IssueManager 可以注入任何依賴的服務,并用于查詢用戶的分配問題數量。
      我們更喜歡并建議為領域服務使用 Manager 后綴。

      這個設計的唯一問題就是 Issue.AssignedUserId 現在在類外開放設置了。然而,它不是公開的。它是內部的,并且只能在同一個程序集中(IssueTracking)進行更改。此示例解決方案的領域項目。我們認為這是合理的

      • 領域層開發人員已經知道領域規則,他們使用 IssueManager
      • 應用層開發人員已經被強制使用IssueManager,他們不直接設置它。

      雖然兩種方法之間存在權衡,但當業務邏輯需要使用外部服務時,我們更喜歡創建域服務

      如果你沒有一個好的理由,我們認為沒有必要為領域服務創建接口(比如為IssueManager創建IIssueManager)

      posted @ 2022-06-23 16:24  Broadm  閱讀(210)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 97se亚洲综合自在线| 婷婷六月天在线| 国产高清在线精品一本大道| 国产成人精品无码播放| 亚洲av无码牛牛影视在线二区| 女同久久一区二区三区| 十八禁午夜福利免费网站| 精品国产乱一区二区三区| 久在线视频播放免费视频| 伊伊人成亚洲综合人网7777| 黑人玩弄人妻中文在线| 国产精品偷伦费观看一次| 国产精品日日摸夜夜添夜夜添无码 | 黄又色又污又爽又高潮| 亚洲自拍偷拍福利小视频| 四虎在线成人免费观看| 宽甸| 国产在线精彩自拍视频| 三级网站视频在在线播放| 久久这里有精品国产电影网| 看亚洲黄色不在线网占| 色99久久久久高潮综合影院| 国内精品无码一区二区三区| 欧美老少配性行为| 国产欧美一区二区精品性色| 好爽毛片一区二区三区四| 午夜福利视频| 久久日韩在线观看视频| 国产三级精品三级在线看| 国产精品三级中文字幕| 国产高清视频一区二区三区| 久久久久国色av免费观看性色| 国产日韩乱码精品一区二区| AV极品无码专区亚洲AV| 日本高清中文字幕免费一区二区| 国产一级片内射在线视频| 国产麻豆91网在线看| 亚洲欧美综合一区二区三区| 国产在线中文字幕精品| 欧美18videosex性欧美tube1080| 中文字幕人妻无码一区二区三区|