ให้ฉันเริ่มต้นด้วยการขอโทษเป็นครั้งแรกสำหรับความยาวของโพสต์ แต่ฉันต้องการที่จะถ่ายทอดรายละเอียดมากขึ้นล่วงหน้าดังนั้นฉันไม่ได้ใช้เวลาของคุณในการแสดงความคิดเห็น
ฉันกำลังออกแบบแอพพลิเคชั่นตามแนวทาง DDD และสงสัยว่าฉันสามารถทำตามแนวทางใดได้บ้างเพื่อพิจารณาว่ารูทการรวมควรมี AR อื่นหรือไม่ถ้าพวกมันควรจะแยกจากกัน
นำกรณีของแอพพลิเคชั่นนาฬิกาเวลาแบบเรียบง่ายที่ช่วยให้พนักงานสามารถบันทึกนาฬิกาเข้าหรือออกได้ทั้งวัน UI อนุญาตให้พวกเขาป้อน ID พนักงานและ PIN ซึ่งได้รับการตรวจสอบแล้วและสถานะปัจจุบันของพนักงานที่ดึงมา หากพนักงานมีการโอเวอร์คล็อกในขณะนี้ UI จะแสดงปุ่ม "Clock Out" และในทางกลับกันหากไม่มีการโอเวอร์คล็อกปุ่มจะอ่าน "Clock In" การกระทำที่ทำโดยปุ่มจะสอดคล้องกับสถานะของพนักงานเช่นกัน
แอปพลิเคชันเป็นเว็บไคลเอ็นต์ที่เรียกใช้เซิร์ฟเวอร์แบ็คเอนด์ที่เปิดเผยผ่านส่วนต่อประสานบริการ RESTful การผ่านครั้งแรกของฉันในการสร้าง URL ที่ใช้งานง่ายและอ่านได้ทำให้เกิดจุดปลายสองจุดต่อไปนี้:
http://myhost/employees/{id}/clockin
http://myhost/employees/{id}/clockout
หมายเหตุ: สิ่งเหล่านี้จะใช้หลังจากรหัสพนักงานและ PIN ได้รับการตรวจสอบแล้วและมีการส่ง "โทเค็น" ที่แสดงถึง "ผู้ใช้" ในส่วนหัว นี่เป็นเพราะมี "โหมดผู้จัดการ" ที่ช่วยให้ผู้จัดการหรือหัวหน้างานสามารถเข้า - ออกหรือพนักงานคนอื่น แต่เพื่อประโยชน์ของการสนทนานี้ฉันพยายามทำให้มันง่าย
บนเซิร์ฟเวอร์ฉันมี ApplicationService ที่ให้บริการ API แนวคิดแรกของฉันสำหรับวิธี ClockIn เป็นดังนี้:
public void ClockIn(String id)
{
var employee = EmployeeRepository.FindById(id);
if (employee == null) throw SomeException();
employee.ClockIn();
EmployeeRepository.Save();
}
สิ่งนี้จะดูตรงไปตรงมาจนกว่าเราจะทราบว่าข้อมูลบัตรลงเวลาของพนักงานนั้นได้รับการปรับปรุงเป็นรายการธุรกรรม ซึ่งหมายความว่าทุกครั้งที่ฉันเรียก ClockIn หรือ ClockOut ฉันไม่ได้เปลี่ยนสถานะของพนักงานโดยตรง แต่ฉันจะเพิ่มรายการใหม่ลงใน TimeSheet ของพนักงานแทน สถานะปัจจุบันของพนักงาน (สัญญาณนาฬิกาในหรือไม่) มาจากรายการล่าสุดใน TimeSheet
ดังนั้นถ้าฉันไปด้วยรหัสที่แสดงด้านบนที่เก็บของฉันต้องยอมรับว่าคุณสมบัติที่คงอยู่ของพนักงานไม่เปลี่ยนแปลง แต่มีการเพิ่มรายการใหม่ลงใน TimeSheet ของพนักงานและทำการแทรกลงในแหล่งข้อมูล
ในทางกลับกัน (และนี่คือคำถามสุดท้ายของการโพสต์), TimeSheet ดูเหมือนว่าเป็น Aggregate Root และมีตัวตน (ID พนักงานและระยะเวลา) และฉันสามารถใช้ตรรกะเดียวกันกับ TimeSheet ได้อย่างง่ายดาย (employeeId)
ฉันพบว่าตัวเองกำลังถกเถียงถึงข้อดีของทั้งสองวิธีและตามที่ระบุไว้ในย่อหน้าเปิดสงสัยว่าเกณฑ์ที่ฉันควรจะประเมินเพื่อกำหนดวิธีการที่เหมาะสำหรับปัญหา