# DDD架構與CA架構 ###### tags: `程式架構` - 戰略設計與戰術設計 - 架構風格 - 常見問題 - 重構 - 系統變化原因 - I/O 的變化 - restful api - socket - 市場需求變化 - 電商新活動新玩法 - 技術挑戰 - 看書/新技術 ## 戰略設計 "domain" "sub-domain" "bounded context" ## 戰術設計 "entity" "Value Object" "Aggregate" "Factory" "repository" " domain service" "Domain event" --- ## DDD架構 ### DDD (Domain-Driven Design) DDD (Domain-Driven Design) 是一種軟件架構設計思想,強調將領域專家(業務專家)的知識融入到軟件設計中,使得軟件能夠更好地反映業務需求。 DDD 通常包括以下幾層: #### Presentation 層: > 負責向用戶展示界面和接收用戶輸入,也就是 UI 層。通常包括 Web 應用程序、移動應用程序、桌面應用程序等。 #### Application 層: > 負責協調業務邏輯和 Presentation 層。它調用領域服務,並將數據傳遞給領域層進行處理。通常包括應用程序服務和領域服務。 #### Domain 層: > 負責封裝業務邏輯和狀態,是應用程序的核心。它包括領域模型、實體、值對象、聚合根等。 #### Infrastructure 層: > 負責提供通用的技術功能,如數據訪問、緩存、日誌、消息隊列等。它還提供了與外部系統和服務的集成。通常包括持久化機制、消息隊列、緩存、日誌、安全機制等。 --- ## CA架構 Clean Architecture 是一種軟體架構設計,它的核心思想是將系統分為不同的層次,每個層次都有其特定的職責,從而實現系統的可維護性、可擴展性和可測試性。通常情況下,Clean Architecture 可以分為以下幾層: #### Interface layer: > 該層負責實現系統的界面,例如 RESTful API、MVC 等。該層提供一個接口給外部系統使用。 #### Domain layer: > 該層包含了系統的核心邏輯和業務實體。它是整個系統的核心,也是最重要的一層。該層的職責是專注於業務邏輯的實現,並且與其他層保持獨立。 #### Application layer: > 該層負責管理系統的用例和業務邏輯的執行。該層處理外部輸入和輸出,並使用 Domain layer 提供的服務實現用例。這一層通常是系統的界面層。 #### Infrastructure layer: > 該層負責實現系統的外部設施,例如數據庫、網絡、存儲等。該層提供一個接口給 Application layer 使用。 ## 兩者差異 > DDD 著重於將商業邏輯放在中心,並通過分層將該邏輯分解為不同的子域。 **DDD 強調聚合根、實體、值**對象等概念,並使用領域事件和領域服務等模式來處理跨域問題。 > Clean Architecture 與 DDD 一樣,強調將核心業務邏輯與應用程序邏輯分離開來。它通過依賴反轉和依賴注入等技術實現低耦合性和高可測性。 **Clean Architecture 著重於定義清晰的邊界和約束**,以確保每一層都有明確的職責和目的。 ### 共用 ```C# public public interface IRepository<TEntity> : IRepository<TEntity> where TEntity : class { pubtlic T Get<T>( Expression<Func<TEntity, bool>> predicate = null); void Save(TEntity account); } public class ZoneAlbertRepository<TEntity> : IRepository<TEntity> where TEntity { pubtlic T Get<T>( Expression<Func<TEntity, bool>> predicate = null) { IQueryable<TEntity> query = _dbSet; query=query.Where(predicate) return query; } } ``` ### DDD ```C# public class AccountEntity { public int Id { get; private set; } public string AccountNumber { get; private set; } public decimal Balance { get; private set; } public void Withdraw(decimal amount) { // 處理提款邏輯 this.Balance-=amount } public void Deposit(decimal amount) { // 處理存款邏輯 this.Balance+=amount } } ``` ```C# public class AccountService { private readonly IRepository<AccountEntity> _accountRepository; public AccountService(IRepository<AccountEntity> accountRepository) { _accountRepository = accountRepository; } public void Withdraw(int accountId, decimal amount) { var account = _accountRepository.Get(x=>x.Id==accountId); account.Withdraw(amount); _accountRepository.Save(account); } public void Deposit(int accountId, decimal amount) { var account = _accountRepository.Get(x=>x.Id==accountId); account.Deposit(amount); _accountRepository.Save(account); } } ``` ### Clean Architecture ```C# public class AccountEntity { public int Id { get; set; } public string AccountNumber { get; set; } public decimal Balance { get; set; } } ``` ```C# public class AccountService { private readonly IRepository<AccountEntity> _accountRepository; public AccountService(IRepository<AccountEntity> accountRepository) { _accountRepository = accountRepository; } public void Withdraw(int accountId, decimal amount) { var account = _accountRepository.Get(x=>x.Id==accountId); account.Balance -= amount; _accountRepository.Save(account); } public void Deposit(int accountId, decimal amount) { var account = _accountRepository.Get(x=>x.Id==accountId); account.Balance += amount; _accountRepository.Save(account); } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up