# Tài Liệu Kiến Trúc

> Tài liệu kiến trúc chi tiết cho Template Microservice .NET 10.

## Tổng Quan Kiến Trúc

```mermaid
graph TB
    subgraph "Lớp API"
        C[Controllers]
        CMD[Commands]
        Q[Queries]
        B[Behaviors]
        V[Validations]
    end
    
    subgraph "Lớp Domain"
        AR[Aggregate Roots]
        E[Entities]
        VO[Value Objects]
        DE[Domain Events]
        DX[Domain Exceptions]
    end
    
    subgraph "Lớp Infrastructure"
        DB[(PostgreSQL)]
        R[Repositories]
        CTX[DbContext]
        ID[Idempotency]
    end
    
    C --> CMD
    C --> Q
    CMD --> B --> V
    CMD --> AR
    Q --> R
    R --> CTX --> DB
    AR --> DE
    R --> AR
    
    style C fill:#4a90d9,stroke:#2d5986,color:#fff
    style AR fill:#50c878,stroke:#2d8659,color:#fff
    style DB fill:#ff6b6b,stroke:#c0392b,color:#fff
```

## Trách Nhiệm Các Lớp

### 1. Lớp Domain (MyService.Domain)

Trái tim của ứng dụng chứa business logic thuần túy. Lớp này:
- Có **ZERO** phụ thuộc bên ngoài (ngoại trừ MediatR.Contracts cho events)
- Chỉ chứa các class POCO
- Triển khai các tactical patterns của DDD

#### Thành Phần

| Thành phần | Mục Đích |
|------------|----------|
| **SeedWork** | Base classes: Entity, ValueObject, Enumeration, IAggregateRoot |
| **AggregatesModel** | Aggregate roots với entities và value objects |
| **Events** | Domain events cho giao tiếp cross-aggregate |
| **Exceptions** | Domain exceptions cho vi phạm business rules |

### 2. Lớp Infrastructure (MyService.Infrastructure)

Triển khai kỹ thuật và các mối quan tâm bên ngoài:
- Truy cập database (EF Core)
- Triển khai repositories
- Tích hợp external services

### 3. Lớp API (MyService.API)

Điểm vào ứng dụng và triển khai CQRS:
- Controllers để xử lý HTTP
- Commands cho các thao tác ghi
- Queries cho các thao tác đọc
- MediatR behaviors cho cross-cutting concerns

## Luồng CQRS

```mermaid
sequenceDiagram
    participant Client
    participant Controller
    participant MediatR
    participant LoggingBehavior
    participant ValidatorBehavior
    participant TransactionBehavior
    participant CommandHandler
    participant Repository
    participant DbContext
    
    Client->>Controller: HTTP Request
    Controller->>MediatR: Send(Command)
    MediatR->>LoggingBehavior: Handle
    LoggingBehavior->>ValidatorBehavior: Next()
    ValidatorBehavior->>TransactionBehavior: Next()
    TransactionBehavior->>CommandHandler: Next()
    CommandHandler->>Repository: Add/Update/Delete
    Repository->>DbContext: SaveEntitiesAsync()
    DbContext-->>Repository: Success
    Repository-->>CommandHandler: Result
    CommandHandler-->>Controller: Response
    Controller-->>Client: HTTP Response
```

## Domain Events

```mermaid
graph LR
    AR[Aggregate Root] -->|Phát sinh| DE[Domain Event]
    DE -->|Dispatch bởi| CTX[DbContext]
    CTX -->|Publish tới| M[MediatR]
    M -->|Xử lý bởi| H1[Handler 1]
    M -->|Xử lý bởi| H2[Handler 2]
    
    style AR fill:#50c878,stroke:#2d8659,color:#fff
    style DE fill:#f39c12,stroke:#d68910,color:#fff
    style M fill:#9b59b6,stroke:#7d3c98,color:#fff
```

## Schema Database

### Sample Aggregate

```mermaid
erDiagram
    samples {
        uuid id PK
        varchar(200) name
        varchar(1000) description
        int status_id FK
        timestamp created_at
        timestamp updated_at
    }
    
    sample_statuses {
        int id PK
        varchar(50) name
    }
    
    samples ||--o{ sample_statuses : has
```

## Pipeline MediatR

```
Request → LoggingBehavior → ValidatorBehavior → TransactionBehavior → Handler → Response
            │                     │                    │
            ▼                     ▼                    ▼
       Log start/end         Validate           Begin/Commit
       + timing              với                Transaction
                            FluentValidation
```

### Thứ Tự Behaviors

1. **LoggingBehavior** - Ghi log xử lý request với timing
2. **ValidatorBehavior** - Validate request sử dụng FluentValidation
3. **TransactionBehavior** - Bao bọc command handlers trong database transactions

## Xử Lý Lỗi

### Phân Cấp Exceptions

```
Exception
└── DomainException
    └── SampleDomainException
```

### Problem Details (RFC 7807)

Tất cả lỗi được trả về theo định dạng Problem Details:

```json
{
  "type": "https://tools.ietf.org/html/rfc7807",
  "title": "Lỗi Validation",
  "status": 400,
  "detail": "Một hoặc nhiều lỗi validation đã xảy ra.",
  "errors": {
    "Name": ["Tên là bắt buộc"]
  }
}
```

## Health Checks

```mermaid
graph TD
    HC[Health Check Endpoint]
    HC --> |/health/live| L[Liveness]
    HC --> |/health/ready| R[Readiness]
    HC --> |/health| F[Full Status]
    
    R --> PG[(PostgreSQL)]
    R --> RD[(Redis)]
    
    style HC fill:#3498db,stroke:#2980b9,color:#fff
    style L fill:#2ecc71,stroke:#27ae60,color:#fff
    style R fill:#f39c12,stroke:#d68910,color:#fff
```

## Kiến Trúc Deployment

### Docker Compose (Local)

```yaml
services:
  myservice-api:
    build: .
    ports: ["5000:8080"]
    depends_on:
      - postgres
      - redis
  
  postgres:
    image: postgres:16-alpine
    
  redis:
    image: redis:7-alpine
```

### Kubernetes (Production)

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myservice-api
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: api
        image: myservice:latest
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /health/live
            port: 8080
        readinessProbe:
          httpGet:
            path: /health/ready
            port: 8080
```

## Cân Nhắc Bảo Mật

1. **Authentication**: JWT Bearer token (cấu hình trong production)
2. **Authorization**: Role-based access control
3. **Input Validation**: FluentValidation trên tất cả requests
4. **SQL Injection**: EF Core parameterized queries
5. **Secrets**: Biến môi trường, không bao giờ trong code

## Tối Ưu Hiệu Năng

1. **Connection Pooling**: EF Core với Npgsql connection resilience
2. **Async/Await**: Tất cả I/O operations đều async
3. **Response Caching**: Thêm caching headers cho queries
4. **Database Indexes**: Cấu hình trong EntityConfigurations

## Tài Liệu Tham Khảo

- [eShopOnContainers](https://github.com/dotnet-architecture/eShopOnContainers)
- [Hướng dẫn Kiến trúc .NET Microservices](https://docs.microsoft.com/en-us/dotnet/architecture/microservices/)
- [Domain-Driven Design](https://martinfowler.com/bliki/DomainDrivenDesign.html)
- [CQRS Pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs)
