หากมีสายงานธุรกิจซ้อนกันเป็นชั้นๆ แบบนี้ จะเป็นการแบ่งงานที่เหมาะสมหรือไม่ :
การเข้าถึงข้อมูล
เรียกใช้ขั้นตอนที่เก็บไว้ เท่านั้น โดยแมปคุณสมบัติของ DTO เข้ากับแฮช tablse ซึ่งใช้เพื่อเติมคอลเลกชันพารามิเตอร์ของคำสั่ง ADO.NET
ประกอบเฉพาะโดยอ้างอิงถึง SqlDataClient
- ตรรกะที่สำคัญที่เกี่ยวข้องกับสิ่งที่หมายถึงว่างเปล่า เป็นโมฆะ และว่างเปล่าในโค้ดการแมป แต่อย่างอื่นไม่มีการตรวจสอบหรือตรรกะเฉพาะโดเมนอื่นๆ
สิ่งที่เรียกว่าตรรกะทางธุรกิจ
แยกชุดผลลัพธ์หลายชุดออกเป็น DataTable แต่ละชุด เช่น
โมฆะสาธารณะ ReturnNthRecordSetFromStoredProcFoo ()
ผ่านไปยังการเข้าถึงข้อมูลสำหรับชุดข้อมูล เช่น
โมฆะสาธารณะ ReturnDataSet (ชื่อสตริง) { กลับ (PersonController ใหม่) GetAnotherDataSet (ชื่อ);}
จับคู่หนึ่งแถวของ DataTable กับ DTO หนึ่งรายการ
- ตรรกะที่สำคัญที่เกี่ยวข้องกับสิ่งที่หมายถึงว่างเปล่า เป็นโมฆะ และว่างเปล่าในโค้ดการแมป
- เก็บอ็อบเจ็กต์ธุรกรรม แม้ว่าจะใช้เพื่อห่อการเรียกโพรซีเจอร์ที่เก็บไว้เดี่ยวเท่านั้น
- ไม่มีการอ้างอิงถึง SqlDataClient ดังนั้นจึงไม่สามารถใช้ SqlDataReaders เพื่อเติม DTO ได้
- ไม่มีการอ้างอิงถึง System.Web.UI
- กฎการอนุญาต แต่ไม่มีตรรกะเฉพาะโดเมน
ส่วนติดต่อผู้ใช้
- การเชื่อมโยงข้อมูล 2 ทางของ DTO กับแบบฟอร์ม ASP.NET
- การตรวจสอบความถูกต้องของคุณสมบัติของการควบคุม โดยทั่วไปไม่มีการตรวจสอบความถูกต้องโดยตรงกับ DTO
- "คอลเลกชัน" ถูกนำทางโดยการผูกชุดข้อมูลกับกริด ในความเป็นจริงการพยายามทำอะไรก็ตามกับคอลเลกชันนั้นต้องการให้ UI วนซ้ำ DataRows ใน DataTables และรู้ว่าชื่อคอลัมน์ที่เหมาะสมคืออะไร (ซึ่งโดยทั่วไปจะคล้ายกับ DTO เท่านั้น)
ดังนั้น คำถามสุดท้ายคือ สำหรับแอปพลิเคชันนี้ Data Access Layer ควรถือว่าหน้าที่ของสิ่งที่เรียกว่าชั้นธุรกิจถูกรวมเข้าด้วยกันหรือไม่ นี่เป็นสองชั้นอยู่แล้วไม่ใช่หรือ (เกือบหนึ่งชั้น! ) การสมัครยกเว้นความไม่สะดวกในการประกอบเพิ่มเติม?
ข้อมูลเพิ่มเติม: ตกลง ฉันรู้แล้วว่าแอปพลิเคชันเซิร์ฟเวอร์จะเป็นเครื่องเดียว อาจจะเป็นตลอดไป เนื่องจากเป็นแอปอินทราเน็ตที่มีจำนวนผู้ใช้น้อย ดังนั้นฉันจึงรู้ว่าไม่ควรออกแบบสำหรับระดับแอปพลิเคชันที่แยกจากกัน นอกจากนี้ มันอาจจะรองรับเพียง UI เดียวเท่านั้นและจะถูกทิ้งทั้งหมดหากจำเป็นต้องรองรับอย่างอื่นที่ไม่ใช่ ASP.NET ซึ่งเป็นอีกเหตุผลหนึ่งที่อ้างถึงบ่อยครั้งสำหรับเทียร์/เลเยอร์