Domain Driven Design (DDD) là một phương pháp phát triển phần mềm tập trung vào việc tạo ra một rich and accurate domain model. Domain model là một mô tả của các khái niệm và mối quan hệ trong nghiệp vụ của một ứng dụng.
DDD phù hợp với các ứng dụng có domain phức tạp và quy mô lớn. Các ứng dụng này thường có nghiệp vụ phức tạp và các yêu cầu thay đổi thường xuyên. DDD giúp các nhà phát triển tạo ra các ứng dụng dễ hiểu, dễ bảo trì và dễ thích ứng với sự thay đổi.
Business logic được chia thành hai lớp: Domain layer và Application layer. Mỗi lớp chứa các loại business logic khác nhau:
- Domain layer: Domain layer triển khai nghiệp vụ cốt lõi, độc lập với các nghiệp vụ của domain/system.
- Application layer: Application layer triển khai các use cases của ứng dụng dựa trên domain. Một use case có thể được coi là một tương tác của người dùng trên UI.
- Presentation Layer: Presentation Layer chứa các thành phần UI của ứng dụng.
- Infrastructure Layer: Infrastructure Layer triển khai các lớp trừu tượng, tích hợp với các thư viện và hệ thống của bên thứ ba.
Core Building Blocks
DDD chủ yếu tập trung vào Domain Layer và Application Layer, đồng thời phần này sẽ bỏ qua Presentation Layer và Infrastructure Layer vì các nghiệp vụ không nên phụ thuộc vào hai lớp này. Điều đó không có nghĩa là Presentation Layer và Infrastructure Layer không quan trọng. Chúng rất quan trọng. Các UI framework và database provider có các quy tắc của riêng mình mà bạn cần biết và áp dụng.
Domain Layer Building Blocks
- Entity: Entity là một đối tượng có các thuộc tính (trạng thái, dữ liệu) và phương thức riêng của nó. Một entity được biểu thị bằng định danh duy nhất là (Id). Hai đối tượng entity có Id khác nhau được coi là các entity khác nhau.
- Value Object: Value Object là một loại đối tượng được xác định bởi các thuộc tính của nó thay vì một Id duy nhất.
- Aggregate: Aggregate là một cụm các đối tượng (entity và value object) được liên kết với nhau bởi một đối tượng Aggregate Root.
- Repository (interface): Repository được sử dụng bởi Domain và Application Layers để truy cập vào database. Nó ẩn giấu độ phức tạp của DBMS.
- Domain Service: Domain Service triển khai các nghiệp vụ cốt lõi của domain.
Application Layer Building Blocks
- Application Service: Application Service triển khai các use cases của ứng dụng. Một application service thường nhận và trả lại DTO. Được sử dụng bởi Presentation Layer.
- Data Transfer Object (DTO): DTO là một đối tượng đơn giản không có bất kỳ logic nghiệp vụ nào được sử dụng để chuyển dữ liệu giữa Application và Presentation Layers.
- Unit of Work (UOW): Tất cả các thao tác bên trong UOW phải được commit khi thành công hoặc rolled back khi thất bại.