Mempartisi sumber daya REST API ke dalam area berdasarkan domain bisnis


8

Dalam aplikasi utama REST API yang mencakup beberapa domain terkait, apakah lebih masuk akal untuk membagi sumber daya menjadi 'area' berdasarkan domain bisnis tempat mereka berada atau lebih baik mempertahankan model tunggal?

Misalnya, ada sub-domain 'Penjualan' dan 'Persediaan'. Pengguna sistem biasanya hanya peduli pada satu domain saja, tetapi pengecualian dimungkinkan. Ada konsep 'Item' yang ada di kedua domain sehingga kami dapat mengimplementasikan sumber daya 'item' dengan dua cara berbeda.

  1. memiliki sumber daya yang berbeda untuk mewakili konsep di setiap domain, setiap sumber daya hanya memegang data yang relevan:

    / sales / items /: id

    / inventaris / item /: id

  2. memiliki sumber daya tunggal dengan semua data yang akan digunakan dalam semua konteks:

    / items /: id

Ada juga banyak sumber daya yang hanya dimiliki oleh salah satu domain.

pro 'daerah'

  • lebih mudah untuk memahami API untuk pengguna yang hanya peduli pada satu domain
  • lebih mudah untuk mengimplementasikan sumber daya (lebih sedikit barang untuk dibaca / diperbarui sekaligus)
  • sumber daya dapat lebih khusus / dioptimalkan untuk setiap domain tertentu
  • kemampuan untuk mengontrol akses ke sumber daya di tingkat yang lebih terperinci

pro dari satu model tunggal

  • tidak ada sumber rangkap untuk konsep yang dimiliki lebih dari satu domain
  • jika pengguna perlu bekerja dengan banyak domain, ia hanya perlu menggunakan API tunggal yang mencakup semua kebutuhannya

Apakah pemartisian API seperti yang dijelaskan di atas merupakan cara yang valid untuk mengurangi kompleksitas kontrak dan implementasi API? Saya belum melihatnya disebutkan di mana pun.

Apakah ada hal lain yang perlu dipertimbangkan untuk membuat keputusan yang mendukung kedua pendekatan tersebut?

Jawaban:


6

Saya pikir ini sangat cocok untuk pola Bounded Context dari Domain Driven Design.

Model besar tidak skala dengan baik, lebih baik untuk membaginya menjadi model yang lebih kecil (konteks terikat) dan secara eksplisit menyatakan hubungan mereka (entitas umum, interaksi antara konteks terikat dll.)

Dalam hal ini Anda akan memiliki dua konteks terbatas (penjualan dan inventaris) dengan satu sumber daya bersama (item). Interpretasi barang dalam konteks penjualan mungkin sedikit berbeda dari dalam konteks inventaris dan itu sama sekali tidak masalah.

Untuk menggunakan pola ini, Anda harus:

  • mengidentifikasi batas-batas konteks yang berbeda (yang sebagian Anda lakukan dengan membuat subroot / penjualan / dan / inventaris /)
  • mengidentifikasi sumber daya bersama (item) dan secara eksplisit menggambarkan apa interpretasi sumber daya dalam konteks terikat yang berbeda
  • mengidentifikasi interaksi antara konteks terbatas (yang mungkin di luar cakupan pertanyaan ini)

Catatan aktif

pro dari satu model tunggal: tidak ada sumber daya duplikat untuk konsep yang dimiliki lebih dari satu domain

Dari sudut pandang REST, sumber daya tidak digandakan. Satu sumber dapat diidentifikasi oleh banyak URI, masing-masing dapat memiliki representasi yang berbeda (cocok untuk konteks terbatas yang diberikan).


Pendekatan ini memang tampak lebih unggul secara keseluruhan. Hanya ingin memastikan saya tidak mengabaikan manfaat dari alternatif tersebut.
astreltsov

0

Saya pikir aturannya adalah sebagai berikut.

Jika suatu item itu sendiri tidak terpikirkan tanpa terkait dengan penjualan atau inventaris, Anda harus memilih opsi 1.

Jika suatu barang bisa ada tanpa ada kaitannya dengan penjualan / inventaris atau hubungan ini tidak terlalu kuat dalam arsitektur Anda, Anda bisa memilih opsi 2.


Saya membuat contoh sedikit lebih jelas. 'Item' memang ada di kedua domain, itulah masalahnya. Tetapi ada juga konsep yang hanya ada di salah satu domain.
astreltsov

@ Nah, dalam hal ini saya memilih pemisahan.
Vladislav Rastrusny
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.