GO-DDD: Templat Desain Domain Digerakkan di Golang
Selamat datang di go-ddd , repositori implementasi/templat referensi yang menunjukkan pendekatan Domain Driven Design (DDD) di Golang. Proyek ini bertujuan untuk membantu pengembang dan arsitek memahami struktur DDD, terutama dalam konteks GO, dan bagaimana hal itu dapat menyebabkan basis kode yang lebih bersih, lebih dapat dipelihara, dan dapat diskalakan.
Ringkasan
Desain yang digerakkan domain adalah pola metodologi dan desain yang digunakan untuk membangun perangkat lunak perusahaan yang kompleks dengan menghubungkan implementasi ke model yang berkembang. go-ddd menampilkan ini dengan menyiapkan pasar sederhana di mana Sellers dapat menjual Products .
Mengapa DDD?
- Bahasa di mana -mana : Mempromosikan bahasa umum antara pengembang dan pemangku kepentingan.
- Isolasi logika domain : Logika domain terpisah dari lapisan infrastruktur dan aplikasi, mempromosikan prinsip -prinsip yang solid.
- Skalabilitas : Memungkinkan transisi arsitektur layanan mikro yang lebih mudah.
Struktur repositori

-
domain : Inti dari perangkat lunak, mewakili logika dan aturan bisnis.-
entities : Objek mendasar dalam sistem kami, seperti Product dan Seller . Berisi logika validasi dasar.
-
application : Berisi operasi spesifik kasus penggunaan yang berinteraksi dengan lapisan domain. -
infrastructure : Mendukung lapisan yang lebih tinggi dengan kemampuan teknis seperti akses basis data.-
db : Akses dan model database. -
repositories : Implementasi konkret dari kebutuhan penyimpanan kami.
-
interface : Lapisan eksternal yang berinteraksi dengan dunia luar, seperti titik akhir API.-
api/rest : Penangan atau pengontrol untuk mengelola permintaan dan tanggapan HTTP.
Prinsip lebih lanjut
- Domain
- Tidak boleh bergantung pada lapisan lain.
- Menyediakan infrastruktur dengan antarmuka, tetapi tidak boleh mengakses infrastruktur.
- Mengimplementasikan logika dan aturan bisnis.
- Mengeksekusi validasi pada entitas. Entitas yang divalidasi diteruskan ke lapisan infrastruktur.
- Lapisan domain menetapkan default entitas (misalnya UUID untuk ID atau Creation Timestamp). Jangan atur default di lapisan infrastruktur atau bahkan database!
- Jangan membocorkan objek domain ke dunia luar.
- Aplikasi
- Kode lem antara domain dan lapisan infrastruktur.
- Infrastruktur
- Repositori bertanggung jawab untuk menerjemahkan entitas domain ke model database dan mengambilnya. Tidak ada logika bisnis yang dieksekusi di sini.
- Mengimplementasikan antarmuka yang ditentukan oleh lapisan domain.
- Menerapkan logika kegigihan seperti mengakses database Postgres atau MySQL.
- Saat menulis ke penyimpanan, baca data tertulis sebelum mengembalikannya. Ini memastikan bahwa data ditulis dengan benar.
Praktik terbaik
- Jangan mengembalikan entitas yang divalidasi dari metode baca di repositori. Sebaliknya, kembalikan tipe entitas domain secara langsung.
- Validasi mungkin berubah di masa depan, dan Anda tidak ingin mengubah semua data di database Anda.
- Jika tidak, Anda tidak akan dapat membaca data dari database yang ditulis dengan logika validasi yang berbeda.
- Jangan menaruh nilai default (misalnya stempel waktu atau ID saat ini) di database. Atur mereka di lapisan domain (pabrik!) Karena beberapa alasan:
- Cukup berbahaya untuk memiliki dua sumber kebenaran.
- Lebih mudah untuk menguji lapisan domain.
- Basis data dapat diganti, dan Anda tidak ingin harus mengubah semua nilai default Anda.
- Selalu baca entitas setelah menulis di lapisan infrastruktur.
- Ini memastikan bahwa data ditulis dengan benar, dan kami tidak pernah beroperasi pada data basi.
-
find vs get :-
find metode dapat mengembalikan null atau daftar kosong. -
get metode harus mengembalikan nilai. Jika nilainya tidak ditemukan, lemparkan kesalahan.
- Penghapusan: Selalu gunakan penghapusan lunak. Buat kolom
deleted_at di database Anda dan atur ke cap waktu saat ini saat menghapus suatu entitas. Dengan cara ini, Anda selalu dapat mengembalikan entitas jika diperlukan.
Memulai
- Klon Repositori ini:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
Kontribusi
Kontribusi, masalah, dan permintaan fitur dipersilakan! Jangan ragu untuk memeriksa halaman masalah.
Lisensi
Didistribusikan di bawah lisensi MIT. Lihat lisensi untuk informasi lebih lanjut.