Saya bekerja dalam arsitektur, ia akan menawarkan api sisanya untuk klien web dan aplikasi seluler. Saya menggunakan Spring (pegas mvc, pegas data jpa, ... dll). Model domain dikodekan dengan spesifikasi JPA.
Saya mencoba menerapkan beberapa konsep arsitektur bersih ( https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html ). Tidak semua, karena saya akan mempertahankan model domain jpa.
Aliran aktual melalui lapisan adalah ini:
Ujung depan <--> Layanan API -> Layanan -> Repositori -> DB
- Ujung depan : klien web, aplikasi seluler
- Layanan API : Rest Controllers, di sini saya menggunakan konverter dan dto dan layanan panggilan
- Layanan : Antarmuka dengan implementasi dan mengandung logika bisnis
- Repositori : Antarmuka repositori dengan implementasi otomatis (dilakukan oleh pegas data jpa) yang mengendalikan operasi CRUD dan mungkin beberapa kueri sql
Keraguan saya: Haruskah saya menggunakan lapisan ekstra antara layanan dan repositori?
Saya merencanakan aliran baru ini:
Ujung depan <--> Layanan API -> Layanan -> Kegigihan -> Repositori -> DB
Mengapa menggunakan lapisan kegigihan ini? Seperti yang dikatakan dalam artikel arsitektur bersih saya ingin memiliki implementasi layanan (logika bisnis atau kasus penggunaan) yang mengakses lapisan ketekunan agnostik. Dan tidak akan diperlukan perubahan jika saya memutuskan untuk menggunakan pola "akses data" yang lain, misalnya jika saya memutuskan untuk berhenti menggunakan repositori.
class ProductServiceImpl implements ProductService {
ProductRepository productRepository;
void save(Product product) {
// do business logic
productRepository.save(product)
}
}
Jadi saya berpikir menggunakan lapisan ketekunan seperti ini:
class ProductServiceImpl implements ProductService {
ProductPersistence productPersistence;
void save(Product product) {
// do business logic
productPersistence.save(product)
}
}
dan implementasi dari layer persistence seperti ini:
class ProductPersistenceImpl implements ProductPersistence {
ProductRepository productRepository;
void save(Product product) {
productRepository.save(product)
}
}
Jadi saya hanya perlu mengubah implementasi layer persistence, meninggalkan layanan tanpa perubahan. Ditambah dengan fakta bahwa Repositori terkait dengan framework.
Bagaimana menurut anda? Terima kasih.