## Introduction
<!-- image of three layers -->

### business logic (domain model layer)
- handler
- API controller
- event listener
- service
- aggregate
### data source (data access layer)
- database
- raw query
- ORM or ODM
- cache data
- file
- TXT
- XML
- JSON
- web service
- API
### repository
- decouple the business logic and the data access layers
- encapsulate the logic required to access data sources
- (database) query syntax
- (file) read/save/delete and deserialize/serialize data
- (API) send request and parse response
## Pros & Cons
### pros
- improve maintainability and readability by swapping out the implementation details
- apply centrally managed, consistent access rules and logic
- migrating to a different persistence library, without affecting the calling code
- make code modular and testable
### cons
- add an extra layer of abstraction
- typically need to create a repository for each entity
## Implementation
### generic repository interface and class
<!-- interface sample code -->
```javascript=
// generic repository interface
public interface IRepository<T> {
IEnumerable<T> list();
T findById(int id);
void add(T item);
void update(T item);
void delete(T item);
}
```
<!-- class sample code -->
```javascript=
// generic repository class
public class OrderRepository implements IRepository<TOrder> {
private OrderDataContext context;
IEnumerable<TOrder> list() {}
TOrder findById(int id) {}
void add(TOrder order) {}
void update(TOrder order) {}
void delete(TOrder order) {}
}
```
### specific repository class (with expressive methods)
<!-- class sample code -->
```javascript=
// specific repository class
public class OrderRepository {
private OrderDataContext context;
TOrder[] listManyOrders(Predicate p) {}
TOrder findOneOrderById(int orderId) {}
void addOneOrder(TOrder order) {}
void updateOneOrder(TOrder order) {}
void deleteOneOrderById(int orderId) {}
}
```
## Questions
### generic repository or specific repository?
### is repository pattern essential?
## FAQ
### how to maintain atomic operations and consistency?
### what are the differences between repository pattern and DAO?
###
## Terminology
- repository pattern
- Data Access Object (DAO)
- Object Relational Mapping (ORM)
- Object Document Mapping (ODM)
- [entity](https://blog.jannikwempe.com/domain-driven-design-entities-value-objects#heading-entities)
- [value object](https://blog.jannikwempe.com/domain-driven-design-entities-value-objects#heading-value-objects-vos)
- model (domain model)
- aggregate pattern
- unit-of-work
## References
- [Design the infrastructure persistence layer | Mircosoft Learn](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design#the-repository-pattern)
- [The Repository Pattern | Mircosoft Learn](https://learn.microsoft.com/en-us/previous-versions/msp-n-p/ff649690(v=pandp.10))
- [How you shouldn’t use Repository pattern | Roman Kinyakin](https://viblo.asia/p/how-you-shouldnt-use-repository-pattern-MLzkOzYEepq)