ฉันกำลังพยายามออกแบบแอปพลิเคชันที่มีโดเมนธุรกิจที่ซับซ้อนและข้อกำหนดเพื่อสนับสนุน REST API (ไม่ใช่ REST อย่างเคร่งครัด แต่มุ่งเน้นไปที่ทรัพยากร) ฉันมีปัญหาบางอย่างในการหาวิธีเปิดเผยโมเดลโดเมนในลักษณะที่เน้นทรัพยากร
ใน DDD ลูกค้าของโมเดลโดเมนจำเป็นต้องผ่านเลเยอร์ 'Application Services' ขั้นตอนเพื่อเข้าถึงฟังก์ชันการทำงานทางธุรกิจใด ๆ ที่ใช้งานโดย Entities และ Domain Services ตัวอย่างเช่นมีแอปพลิเคชันบริการที่มีสองวิธีในการอัปเดตเอนทิตีผู้ใช้:
userService.ChangeName(name);
userService.ChangeEmail(email);
API ของ Application Service นี้แสดงคำสั่ง (คำกริยาขั้นตอน) ไม่ใช่สถานะ
แต่ถ้าเราต้องจัดหา RESTful API สำหรับแอปพลิเคชันเดียวกันนั่นก็คือโมเดลทรัพยากรของผู้ใช้ซึ่งมีลักษณะดังนี้:
{
name:"name",
email:"email@mail.com"
}
API ของทรัพยากรที่มุ่งเน้น exposes รัฐไม่ได้คำสั่ง สิ่งนี้ทำให้เกิดข้อกังวลต่อไปนี้:
การดำเนินการอัปเดตแต่ละครั้งกับ REST API สามารถแมปกับการเรียกขั้นตอนบริการแอปพลิเคชันอย่างน้อยหนึ่งรายการขึ้นอยู่กับคุณสมบัติที่จะถูกอัพเดตบนโมเดลรีซอร์ส
การดำเนินการอัปเดตแต่ละครั้งจะดูเหมือน atomic ไปยังไคลเอนต์ REST API แต่ไม่ได้ดำเนินการเช่นนั้น การเรียกใช้บริการแอปพลิเคชันแต่ละครั้งได้รับการออกแบบเป็นธุรกรรมแยกต่างหาก การอัพเดตหนึ่งฟิลด์ในโมเดลรีซอร์สสามารถเปลี่ยนกฎการตรวจสอบสำหรับฟิลด์อื่น ดังนั้นเราจำเป็นต้องตรวจสอบความถูกต้องของเขตข้อมูลโมเดลทรัพยากรทั้งหมดด้วยกันเพื่อให้แน่ใจว่าการเรียกใช้บริการแอปพลิเคชันทั้งหมดนั้นถูกต้องก่อนที่จะเริ่มสร้าง การตรวจสอบความถูกต้องของชุดคำสั่งพร้อมกันนั้นมีความสำคัญน้อยกว่าการทำทีละครั้ง เราจะทำเช่นนั้นกับลูกค้าที่ไม่ทราบว่ามีคำสั่งแต่ละรายการได้อย่างไร
การเรียกใช้เมธอดบริการแอปพลิเคชันในลำดับที่ต่างกันอาจมีผลกระทบที่แตกต่างกันในขณะที่ REST API ทำให้ดูเหมือนไม่มีความแตกต่าง (ภายในทรัพยากรเดียว)
ฉันสามารถคิดประเด็นที่คล้ายกันขึ้นมาได้ แต่โดยพื้นฐานแล้วสิ่งเหล่านี้ล้วนเกิดจากสิ่งเดียวกัน หลังจากการเรียกใช้บริการแอปพลิเคชันแต่ละครั้งสถานะของระบบจะเปลี่ยนไป กฎของการเปลี่ยนแปลงที่ถูกต้องคืออะไรชุดของการกระทำที่เอนทิตีสามารถทำการเปลี่ยนแปลงต่อไปได้ API ที่มุ่งเน้นทรัพยากรพยายามทำให้ดูเหมือนเป็นปฏิบัติการแบบอะตอมมิกทั้งหมด แต่ความซับซ้อนของการข้ามช่องว่างนี้ต้องไปที่ใดที่หนึ่งและมันดูใหญ่มาก
นอกจากนี้หาก UI มีการมุ่งเน้นคำสั่งมากกว่าซึ่งมักเป็นกรณีนี้เราจะต้องแมประหว่างคำสั่งและทรัพยากรในฝั่งไคลเอ็นต์และจากนั้นกลับมาที่ฝั่ง API
คำถาม:
- ความซับซ้อนทั้งหมดนี้ควรได้รับการจัดการโดยเลเยอร์การทำแผนที่ REST-to-AppService (หนา) หรือไม่
- หรือฉันขาดอะไรบางอย่างที่ฉันเข้าใจใน DDD / REST?
- REST สามารถใช้งานได้จริงหรือไม่สำหรับการแสดงการทำงานของแบบจำลองโดเมนในระดับที่ค่อนข้างซับซ้อน (ค่อนข้างต่ำ)