DDD Layers (DDD యొక్క లేయర్లు)
1. Presentation Layer
ఈ లేయర్లో సాధారణంగా ఇవి ఉంటాయి:
- ASP.NET Core API
- MVC
- Angular
- React
ఉదాహరణ:
POST
/api/account/transfer
ఈ Layer యొక్క పని:
- Client నుండి Request స్వీకరించడం
- Requestను Application Layerకు పంపించడం
- Responseను Clientకు తిరిగి పంపించడం
గమనిక: ఈ Layerలో ఎలాంటి Business Logic ఉండకూడదు.
ప్రవాహం (Flow):
Request
↓
Application Layer
2. Application Layer
ఈ Layer యొక్క ముఖ్యమైన బాధ్యతలు:
- Use Cases నిర్వహించడం
- వివిధ Components మధ్య సమన్వయం (Coordination)
- Transactions నిర్వహించడం
- Domain Objectsను ఉపయోగించి పని చేయించడం
ఉదాహరణ:
TransferMoneyCommand
↓
TransferMoneyHandler
↓
Domain
↓
Repository
↓
Save
ఈ Layerలో కూడా Business Rules ఉండవు.
ఇది కేవలం అన్ని Operationsను సరైన క్రమంలో నిర్వహిస్తుంది (Orchestration).
3. Domain Layer (DDD యొక్క హృదయం)
DDDలో అత్యంత ముఖ్యమైన Layer ఇదే.
ఇందులో ఉండేవి:
- Entities
- Value Objects
- Aggregates
- Domain Events
- Repository Interfaces
- Business Rules
- Domain Services (అవసరమైతే)
అప్లికేషన్కు సంబంధించిన అన్ని ముఖ్యమైన Business Logic ఇక్కడే ఉంటుంది.
Entity అంటే ఏమిటి?
Entity అనేది Identity (ప్రత్యేక గుర్తింపు) కలిగిన Object.
ఉదాహరణ:
Account
Id
AccountNumber
Balance
CustomerId
ఈ Entityలో Methods:
Deposit()
Withdraw()
Transfer()
ముఖ్యమైన విషయం
Controllerలో ఇలా చేయకూడదు:
Balance = Balance - amount
అలా చేస్తే Business Rules బయటకు వెళ్తాయి.
సరైన విధానం:
Account.Withdraw(amount)
అంటే Accountకు సంబంధించిన అన్ని నియమాలు Account Entityలోనే ఉండాలి.
ఉదాహరణ (C#)
public class Account
{
public decimal Balance { get; private set; }
public void Deposit(decimal amount)
{
if(amount <= 0)
throw new Exception("Invalid amount");
Balance += amount;
}
public void Withdraw(decimal amount)
{
if(amount > Balance)
throw new Exception("Insufficient funds");
Balance -= amount;
}
}
ఇక్కడ Business Rule:
Accountలో ఉన్న Balance కంటే ఎక్కువ డబ్బు Withdraw చేయకూడదు.
ఈ Rule పూర్తిగా Entityలోనే అమలు చేయబడింది.
అందువల్ల Controller లేదా Serviceలో ఈ Logic రాయాల్సిన అవసరం ఉండదు.
Value Object అంటే ఏమిటి?
Value Object అనేది Identity లేని Object.
దాని విలువ (Value) మాత్రమే ముఖ్యం.
ఉదాహరణ:
Address
Street
City
State
ZipCode
రెండు Addressలు ఒకే Values కలిగి ఉంటే అవి సమానంగా పరిగణించబడతాయి.
ఉదాహరణ:
Address A
=
Address B
Value Objects లక్షణాలు
- Immutable (ఒకసారి సృష్టించిన తర్వాత మారవు)
- Identity ఉండదు
- Values ఆధారంగా Equality నిర్ణయించబడుతుంది
మరో ఉదాహరణ
Money
100 INR
కేవలం
decimal
వాడటం కంటే
Money అనే Value Object వాడటం ఉత్తమం.
ఎందుకంటే అది Currency, Validation మరియు ఇతర Business Rulesను కూడా కలిగి ఉండవచ్చు.
Aggregate అంటే ఏమిటి?
Aggregate అనేది పరస్పర సంబంధం ఉన్న Entities మరియు Value Objects సమూహం.
ఉదాహరణ:
Customer
↓
Accounts
↓
Transactions
ఇక్కడ Customer అనేది Aggregate Root.
మరొక ఉదాహరణ:
Customer
↓
Savings Account
↓
Current Account
↓
Transactions
ఇక్కడ:
- Savings Account
- Current Account
- Transactions
వాటిని నేరుగా Modify చేయకూడదు.
అన్ని మార్పులు తప్పనిసరిగా Aggregate Root ద్వారా జరగాలి.
దీనివల్ల Data Consistency కాపాడబడుతుంది మరియు Business Rules ఉల్లంఘించబడవు.
Repository Pattern
Repository Pattern యొక్క ఉద్దేశ్యం:
Database Implementationను Domain నుండి వేరు చేయడం.
ఉదాహరణకు ఇలా రాయకూడదు:
DbContext.Accounts.First()
దాని బదులుగా Repository Interface ఉపయోగించాలి.
IAccountRepository
ఉదాహరణ:
public interface IAccountRepository
{
Task<Account> GetById(Guid id);
Task Save(Account account);
}
ఈ Interfaceను Domain Layerలో నిర్వచిస్తారు.
దాని అసలు Implementation మాత్రం Infrastructure Layerలో ఉంటుంది.
దీని వల్ల:
- Domain Layerకు Database గురించి తెలియదు.
- SQL Server స్థానంలో మరో Database వచ్చినా Domain మారదు.
- Unit Testing చాలా సులభమవుతుంది.
- Loose Coupling ఏర్పడుతుంది.
- Maintainability పెరుగుతుంది.
ఇప్పటివరకు నేర్చుకున్నవి
ఈ భాగంలో మనం తెలుసుకున్నవి:
- Presentation Layer
- Application Layer
- Domain Layer
- Entity
- Value Object
- Aggregate
- Aggregate Root
- Repository Pattern
ఇవన్నీ కలిసి Domain-Driven Design (DDD) యొక్క బలమైన పునాది (Foundation)గా పనిచేస్తాయి.
