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

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

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

      實現領域驅動設計 - 使用ABP框架 - 領域邏輯 & 應用邏輯

      領域邏輯 & 應用邏輯

      如前所述,領域驅動設計中的業務邏輯分為兩部分(層):領域邏輯和應用邏輯:

      領域邏輯和應用邏輯.png

      • 領域邏輯由系統的核心領域規則組成,應用邏輯實現應用特定的用例

      雖然定義很明確,但實現起來可能并不容易。您可能無法決定哪些代碼應該位于應用程序層,哪些代碼應該位于領域層。本節試圖解釋其中的差異

      多個應用程序層

      當系統比較大時,DDD有助于處理復雜性。特別是,如果在一個領域中開發了多個應用程序,那么領域邏輯與應用程序邏輯的分離就變得重要得多。

      假設您正在構建一個具有多個應用程序的系統

      • 一個網站應用程序,用 ASP.NET Core MVC 構建,向用戶展示你的產品。這樣的網站不需要認證就可以看到產品。用戶只有在執行某些操作(比如將產品添加到購物車中)時才會登錄到網站。

      • 一個后臺管理程序,使用 Angular UI 構建(使用REST APIs)。本應用被公司辦公人員使用來管理系統(如編輯產品描述)

      • 一個移動應用程序, 與網站相比,它具有更簡單的UI。它可以通過 REST APIs 或其他技術(如TCP套接字)與服務器通信。

      多個應用程序

      每個應用程序都有不同的需求、不同的用例(應用服務方法)、不同的dto、不同的驗證和授權規則……等

      如果將所有這些邏輯混合到單個應用程序層會使您的服務包含太多的邏輯,使代碼更難開發、維護和測試,并導致潛在的bug

      如果一個領域有多個應用程序:

      • 為每個應用程序/客戶端類型創建單獨的應用程序層,并在這些單獨的層中實現應用程序特定的業務邏輯。
      • 使用單個領域層共享核心領域邏輯。

      這樣的設計使得區分領域邏輯和應用程序邏輯變得更加重要。

      為了更清楚地了解實現,您可以為每個應用程序類型創建不同的項目(.csproj)。例如:

      • 后臺管理應用: IssueTracker.Admin.Application & IssueTracker.Admin.Application.Contracts

      • 公共網站應用: IssueTracker.Public.Application & IssueTracker.Public.Application.Contracts

      • 移動應用: IssueTracker.Mobile.Application & IssueTracker.Mobile.Application.Contracts

      案例

      本節包含一些應用程序服務和領域服務示例,以討論如何決定將業務邏輯放置在這些服務中

      示例:在領域服務中新建組織

      public class OrganizationManager : DomainService
      {
          //省略了依賴注入
          public async Task<Organization> CreateAsync(string name)
          {
              if(await _organizationRepository.AnyAsync(x => x.Name == name))
              {
                  throw new BusinessException("IssueTracking:DuplicateOrganizationName");
              }
      
              await _authorizationService.CheckAsync("OrganizationCreationPermissin");
      
              Logger.LogDebug($"Creating organization {name} by {_currentUser.UserName}");
      
              var organization = new Organization();
      
              await _emailSender.SendAsync(
                  "admin@issuetracking.com",
                  "New Organization",
                  "A new organization created with name: " + name
              );
      
              return organization;
          }
      }
      

      讓我們一步一步地看看 CreateAsync 方法,來討論代碼部分是否應該放在領域服務中

      • 正確: 它首先檢查重復的組織名稱,并在這種情況下拋出異常。這與核心領域規則有關,我們不允許重復名稱

      • 錯誤: 領域服務不應該執行授權。授權 應該在應用層中完成。

      • 錯誤: 它記錄了包含當前用戶的用戶名的消息。領域服務不應該依賴于當前用戶。即使系統中沒有用戶,領域服務也應該可用。當前用戶(會話)應該是一個與表示/應用層相關的概念。

      • 錯誤: 它發送了關于這個新組織創建的 電子郵件。我們認為這也是一個特定于用例的業務邏輯。您可能希望在不同的用例中創建不同類型的電子郵件,或者在某些情況下不需要發送電子郵件。

      示例:在應用服務中新建組織

      public class OrganizationAppService : ApplicationService
      {
          //省略了依賴注入
      
          [UnitOfWork]
          [Authorize("OrganizationCreationPermissin")]
          public async Task<Organization> CreateAsync(CreateOrganizationDto input)
          {
              await _paymentService.ChargeAsync(
                  CurrentUser.Id, 
                  GetOrganizationPrice()
              );
      
              var organization = await _organizationManager.CreateAsync(input.Name);
      
              await _organizationManager.InsertAsync(organization);
      
              await _emailSender.SendAsync(
                  "admin@issuetracking.com",
                  "New Organization",
                  "A new organization created with name: " + input.Name
              );
      
              return organization; //!!!
          }
      
          private double GetOrganizationPrice()
          {
              return 42.0; //或者從其他地方獲取
          }
      }
      

      讓我們一步一步地看看 CreateAsync 方法,來討論代碼部分是否應該放在應用程序服務中

      • 正確: 應用程序服務方法應該是工作單元(事務)。ABP的 工作單元 系統使這個自動完成(甚至不需要為應用服務添加 [UnitOfWork] 屬性)。

      • 正確: 授權 應該在應用層完成。這里,它是通過使用 [Authorize] 屬性來完成的

      • 正確: 調用支付(基礎設施服務)來為該操作收費(創建組織在我們的業務中是一種付費服務)

      • 正確: 應用服務方法負責將更改保存到數據庫。

      • 正確: 我們可以發送 電子郵件 通知系統管理員

      • 錯誤: 不要從應用程序服務返回實體。而是返回一個DTO。

      討論:為什么我們不將支付邏輯轉移到領域服務中?

      您可能想知道為什么支付代碼不在 OrganizationManager 中。這是一件很重要的事情,我們不想錯過付款

      然而,僅僅重要還不足以將代碼視為核心業務邏輯。 我們可能還有其他的用例,在這些用例中創建一個新的 Organization 是不需要收費的。比如:

      • 管理員用戶可以使用后臺應用程序創建新的組織,而無需支付任何費用

      • 后臺工作的數據導入/集成/同步系統也可能需要創建沒有任何支付操作的組織。

      如您所見,支付不是創建有效組織的必要操作。它是特定于用例的應用程序邏輯。

      示例: 增刪改查 操作

      public class IssueAppService
      {
          private readonly IssueManager _issueManager;
          public IssueAppService(IssueManager issueManager)
          {
              _issueManager = issueManager;
          }
      
          public async Task<IssueDto> GetAsync(Guid id)
          {
              return _issueManager.GetAsync(id);
          }
      
          public async Task CreateAsync(IssueCreationDto input)
          {
              return _issueManager.CreateAsync(input);
          }
      
          public async Task UpdateAsync(UpdateIssueDto input)
          {
              return _issueManager.UpdateAsync(input);
          }
      
          public async Task DeleteAsync(Guid id)
          {
              return _issueManager.DeleteAsync(id);
          }
      }
      

      這個應用程序服務本身不做任何事情,而是將所有工作委托給領域服務。它甚至將 dto 傳遞給 IssueManager

      • 不要僅僅為沒有任何領域邏輯的簡單CRUD操作創建領域服務。
      • 永遠不要向領域服務傳遞dto或從領域服務返回dto。

      應用程序服務可以直接使用存儲庫來查詢、創建、更新或刪除數據,除非在這些操作期間需要執行一些領域邏輯。在這種情況下,創建 Domain Service 方法,但只針對那些真正需要的方法

      如果你對領域驅動設計和構建大型企業系統更感興趣,推薦以下書籍作為參考書:

      • "Domain Driven Design" by Eric Evans
      • "Implementing Domain Driven Design" by Vaughn
        Vernon
      • "Clean Architecture" by Robert C. Martin

      完結

      posted @ 2022-06-24 14:42  Broadm  閱讀(529)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 四虎永久地址WWW成人久久| 久久久久成人片免费观看蜜芽| 韩国免费a级毛片久久| 中文国产不卡一区二区| 91精品乱码一区二区三区 | 国产高清精品在线一区二区| 中文字幕久久国产精品| 天堂一区人妻无码| 亚洲色在线v中文字幕| 亚洲日本韩国欧美云霸高清| 国产亚洲精品AA片在线播放天| 中文字幕人妻中文AV不卡专区| 99久久国产成人免费网站| 国产一区二区不卡91| 中文字幕日韩人妻一区| 欧美一区二区三区成人久久片| 无码专区 人妻系列 在线| 男女猛烈激情xx00免费视频| 亚洲熟女乱色一区二区三区 | 婷婷久久综合九色综合88| 国产91色综合久久免费| 国产亚洲精品AA片在线爽| 天堂国产一区二区三区| 高清有码国产一区二区| 狠狠色噜噜狠狠狠777米奇小说| 天天噜噜日日久久综合网| 久久综合伊人77777| av大片在线无码免费| 高清性欧美暴力猛交| 天堂久久天堂av色综合| 忍着娇喘人妻被中出中文字幕 | 真人作爱免费视频| 亚洲欧美国产精品久久久久久久 | 国产一区二区三区日韩精品| 威远县| 国产成人亚洲综合图区| 人妻无码中文专区久久app| 国产高清视频在线播放www色| 欧美成人精品三级在线观看| 久久精品道一区二区三区| 99久久精品国产亚洲精品|