Tôi đang làm việc trong một kiến trúc, nó sẽ cung cấp một api còn lại cho ứng dụng web và ứng dụng di động. Tôi đang sử dụng Spring (spring mvc, spring data jpa, ... vv). Mô hình miền được mã hóa với đặc tả JPA.
Tôi đang cố gắng áp dụng một số khái niệm về kiến trúc sạch ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-arch architecture.html ). Không phải tất cả, bởi vì tôi sẽ giữ mô hình miền jpa.
Dòng chảy thực tế qua các lớp là thế này:
Giao diện người dùng <-> Dịch vụ API -> Dịch vụ -> Kho lưu trữ -> DB
- Giao diện người dùng : ứng dụng web, ứng dụng di động
- Dịch vụ API : Bộ điều khiển nghỉ, ở đây tôi sử dụng bộ chuyển đổi và dịch vụ cuộc gọi và cuộc gọi
- Dịch vụ : Giao diện với các triển khai và chúng chứa logic nghiệp vụ
- Kho lưu trữ : Các giao diện kho lưu trữ với việc triển khai tự động (được thực hiện bởi dữ liệu mùa xuân jpa) có hoạt động CRUD và có thể một số truy vấn sql
Tôi nghi ngờ: Tôi có nên sử dụng một lớp bổ sung giữa dịch vụ và kho lưu trữ không?
Tôi đang lên kế hoạch cho luồng mới này:
Giao diện người dùng <-> Dịch vụ API -> Dịch vụ -> Kiên trì -> Kho lưu trữ -> DB
Tại sao phải sử dụng lớp kiên trì này? Như đã nói trong bài viết kiến trúc sạch, tôi muốn có một triển khai dịch vụ (logic nghiệp vụ hoặc trường hợp sử dụng) truy cập vào lớp kiên trì bất khả tri. Và không cần thay đổi nếu tôi quyết định sử dụng một mẫu "truy cập dữ liệu" khác, ví dụ nếu tôi quyết định ngừng sử dụng kho lưu trữ.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Vì vậy, tôi nghĩ rằng sử dụng một lớp kiên trì như thế này:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
và thực hiện lớp kiên trì như thế này:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Vì vậy, tôi chỉ cần thay đổi việc triển khai lớp kiên trì, rời khỏi dịch vụ mà không thay đổi. Kết hợp với thực tế là Kho lưu trữ có liên quan với khung.
Bạn nghĩ sao? Cảm ơn.