วันนี้ฉันมีการสนทนาที่ร้อนแรงเกี่ยวกับแอปพลิเคชัน MVC ของเรา เรามีเว็บไซต์ที่เขียนใน MVC ( ASP.NET ) และโดยปกติจะเป็นไปตามรูปแบบของการทำอะไรบางอย่างในมุมมอง -> กดคอนโทรลเลอร์ -> คอนโทรลเลอร์สร้างโมเดล (เรียกผู้จัดการที่รับข้อมูลสร้างโมเดลใน วิธีการควบคุมเอง) -> โมเดลไปที่ดู -> ล้างและทำซ้ำ
เขาบอกว่ารหัสของเราอยู่คู่กันแน่นเกินไป ตัวอย่างเช่นหากเราต้องการแอพพลิเคชันเดสก์ท็อปเช่นกันเราจะไม่สามารถใช้รหัสที่มีอยู่ของเราได้
วิธีแก้ปัญหาและแนวทางปฏิบัติที่ดีที่สุดที่เขากล่าวคือสร้าง API จากนั้นสร้างเว็บไซต์ของคุณบน API ของคุณจากนั้นสร้างแอปพลิเคชันเดสก์ท็อปแอพมือถือและอื่น ๆ นั้นง่ายมาก
ดูเหมือนว่าเป็นความคิดที่ไม่ดีสำหรับฉันด้วยเหตุผลหลายประการ
อย่างไรก็ตามฉันไม่สามารถหาสิ่งใดได้โดยใช้ Google ซึ่งอาจพูดถึงการฝึกฝนนี้ ใครบ้างมีข้อมูลเกี่ยวกับข้อดีข้อเสียทำไมคุณควรทำไมคุณไม่ควรหรืออ่านเพิ่มเติม
เหตุผลบางอย่างที่ฉันคิดว่ามันเป็นความคิดที่ไม่ดี:
มันเป็นนามธรรมเกินไปที่จะเรียกใช้แบ็กเอนด์ของคุณจาก API คุณกำลังพยายามทำให้ยืดหยุ่นเกินไปซึ่งจะทำให้ไม่สามารถจัดการได้
ทุกสิ่งที่สร้างขึ้นใน MVC ดูเหมือนไร้ประโยชน์เช่นบทบาทและการรับรองความถูกต้อง ตัวอย่างเช่น [อนุญาต] คุณสมบัติและความปลอดภัย; คุณจะต้องม้วนตัวเอง
การเรียก API ทั้งหมดของคุณจะต้องมีข้อมูลความปลอดภัยแนบมาและคุณจะต้องพัฒนาระบบโทเค็นและอะไรก็ตาม
คุณจะต้องเขียนการเรียก API ที่สมบูรณ์สำหรับทุกฟังก์ชั่นเดียวที่โปรแกรมของคุณจะทำ ค่อนข้างทุกวิธีที่คุณต้องการใช้งานจะต้องมีการเรียกใช้จาก API การรับ / อัปเดต / ลบสำหรับผู้ใช้ทุกคนรวมถึงชุดตัวเลือกสำหรับการดำเนินการอื่น ๆ เช่นอัปเดตชื่อผู้ใช้เพิ่มผู้ใช้ไปยังกลุ่ม ฯลฯ ฯลฯ และผู้ใช้แต่ละรายจะเป็นการเรียก API ที่แตกต่างกัน
คุณสูญเสียเครื่องมือทุกชนิดเช่นอินเทอร์เฟซและคลาสนามธรรมเมื่อพูดถึง API สิ่งต่าง ๆ เช่นWCFได้รับการสนับสนุนอย่างมากสำหรับอินเตอร์เฟส
คุณมีวิธีที่สร้างผู้ใช้หรือทำงานบางอย่าง หากคุณต้องการสร้างผู้ใช้ 50 คนคุณสามารถเรียกได้ 50 ครั้ง เมื่อคุณตัดสินใจที่จะทำวิธีนี้ในฐานะที่เป็น API เว็บเซิร์ฟเวอร์ในพื้นที่ของคุณสามารถเชื่อมต่อกับมันได้และไม่มีปัญหา - ไคลเอนต์เดสก์ท็อปของคุณสามารถเข้าถึงได้เช่นกัน แต่ทันใดนั้นการสร้างผู้ใช้จำนวนมากของคุณ ไม่ดี ดังนั้นคุณต้องสร้างวิธีการแบบกลุ่ม แต่จริงๆแล้วคุณแค่สร้างมันขึ้นมาเพื่อลูกค้าเดสก์ทอป ด้วยวิธีนี้คุณต้อง a) แก้ไข API ของคุณตามสิ่งที่รวมเข้ากับมันและคุณไม่สามารถรวมเข้ากับมันได้โดยตรง b) ทำงานได้มากขึ้นเพื่อสร้างฟังก์ชั่นพิเศษ
YAGNI นอกจากว่าคุณกำลังวางแผนที่จะเขียนแอพพลิเคชั่นที่ทำงานเหมือนกันสองแอปพลิเคชั่นหนึ่งเว็บและแอพพลิเคชั่น Windows หนึ่งแอปพลิเคชันมันเป็นงานพัฒนาพิเศษจำนวนมาก
การแก้จุดบกพร่องนั้นยากกว่ามากเมื่อคุณไม่สามารถก้าวจากต้นจนจบ
การดำเนินการอิสระจำนวนมากที่ต้องการการกลับไปกลับมาเช่นบางรหัสอาจได้รับผู้ใช้ปัจจุบันตรวจสอบผู้ใช้ในบทบาทผู้ดูแลระบบรับ บริษัท ที่ผู้ใช้เป็นเจ้าของรับรายชื่อสมาชิกส่งพวกเขาทั้งหมด อีเมล์. ซึ่งจะต้องใช้การเรียก API จำนวนมากหรือการเขียนวิธีการเฉพาะตามที่คุณต้องการซึ่งประโยชน์เฉพาะของวิธีการนั้นจะเป็นความเร็ว แต่ข้อเสียก็จะไม่ยืดหยุ่น
อาจมีสาเหตุเพิ่มเติมบางอย่างเหล่านี้เป็นเพียงด้านบนของหัวของฉัน
ดูเหมือนว่าฉันจะชอบยกเว้นว่าคุณต้องการแอพพลิเคชั่นสองตัวที่เหมือนกันจริงๆแล้วมันก็ไม่คุ้มค่า ฉันไม่เคยเห็นแอปพลิเคชัน ASP.NET ที่สร้างขึ้นเช่นนี้คุณต้องเขียนแอปพลิเคชันสองตัวแยกต่างหาก (API และรหัสของคุณ) และเวอร์ชันควบคุมทั้งสองแอปพลิเคชันเช่นกัน (หากหน้าผู้ใช้ของคุณได้รับฟิลด์ใหม่ ต้องอัปเดต API และรหัสการบริโภคของคุณไปพร้อม ๆ กันเพื่อให้แน่ใจว่าไม่มีผลร้ายใด ๆ
แก้ไข: คำตอบที่ยอดเยี่ยมเริ่มต้นจากการได้รับแนวคิดที่ดีว่าสิ่งนี้หมายความว่าอย่างไร เพื่อขยายคำถามของฉันคุณจะจัดโครงสร้างแอป MVC เพื่อติดตามโครงสร้าง API นี้อย่างไร
ตัวอย่างเช่นคุณมีเว็บไซต์ที่แสดงข้อมูลเกี่ยวกับผู้ใช้ ภายใต้ MVC คุณมี:
มุมมอง - (CS) HTML เพจที่แสดงตัวควบคุม UserViewModel - เรียกใช้ GetUser () และสร้าง UserViewModel ที่ส่งผ่านไปยังคลาส view Manager (เรียงลำดับ API ของคุณ) ที่มีเมธอด GetUser
คอนโทรลเลอร์ใช้ GetUser () แต่คุณต้องการแอพเดสก์ท็อปด้วย นี่หมายความว่า GetUser ของคุณต้องได้รับการเปิดเผยผ่าน API บางประเภท คุณอาจต้องการการเชื่อมต่อ TCP, WCF หรือ Remoting คุณต้องการแอพมือถือที่จะสงบเนื่องจากการเชื่อมต่อแบบไม่ต่อเนื่องไม่สม่ำเสมอ
ดังนั้นคุณจะเขียน API สำหรับแต่ละบริการเว็บ WCF ที่มีวิธี GetUser () และรหัสเพียงreturn new UserManager().GetUser()
? และวิธี mvc 4 web api ที่ทำสิ่งเดียวกัน? ในขณะที่โทรหา GetUser ต่อไปโดยตรงในวิธีการควบคุม MVC ของคุณ
หรือคุณจะเลือกโซลูชันที่เหมาะกับทั้งสาม (บริการ web api REST) และสร้างทุกอย่างในนั้นดังนั้นแอปทั้งสามจึงทำการเรียก API (ตัว mvc ไปยังเครื่องท้องถิ่น)
และนี่เป็นเพียงสถานการณ์ที่สมบูรณ์แบบทางทฤษฎีหรือไม่ ฉันสามารถเห็นค่าโสหุ้ยจำนวนมากในการพัฒนาวิธีนี้โดยเฉพาะถ้าคุณต้องพัฒนาในวิธีที่จะช่วยให้คุณดำเนินการในลักษณะที่สงบ ฉันคิดว่าบางสิ่งนี้ได้รับการครอบคลุมในการตอบกลับ
แก้ไข 2: หลังจากอ่านเนื้อหาเพิ่มเติมฉันได้ใส่ความคิดเห็นไว้ด้านล่างซึ่งฉันคิดว่าอาจอธิบายได้ คำถามนี้เป็นคำถามหลอกลวงที่ฉันคิดว่า หากคุณเขียน back-end ของคุณเนื่องจาก API ทำให้ฉันสับสนคิดว่าควรมีบริการเว็บเดียวที่ทุกอย่าง (แอพ mvc, แอพเดสก์ท็อป, แอพมือถือ) โทรทำสิ่งต่างๆ
ข้อสรุปที่ฉันได้มาคือสิ่งที่คุณควรทำจริงๆคือตรวจสอบให้แน่ใจว่าเลเยอร์ตรรกะทางธุรกิจของคุณถูกแยกออกอย่างถูกต้อง เมื่อดูที่รหัสของฉันฉันทำสิ่งนี้ไปแล้ว - ผู้ควบคุมจะโทรหาGetUser()
ผู้จัดการจากนั้นสร้างโมเดลมุมมองจากมันเพื่อแสดงผลด้วยมุมมอง ดังนั้นชั้นตรรกะทางธุรกิจคือ API หากคุณต้องการโทรจากแอพเดสก์ท็อปคุณจะต้องเขียนบางอย่างเช่นบริการ WCF เพื่ออำนวยความสะดวกในการโทร แม้เพียงแค่มีวิธี WCF เรียกว่าGetUser()
ที่มีรหัสreturn MyBusinessLayer.GetUser()
จะเพียงพอ ดังนั้น API จึงเป็นตรรกะทางธุรกิจและ WCF / web api เป็นต้นเป็นเพียงส่วนหนึ่งของรหัสเพื่อให้แอปพลิเคชันภายนอกเรียกมันได้
ดังนั้นจึงมีค่าใช้จ่ายบางส่วนที่คุณต้องห่อเลเยอร์ตรรกะทางธุรกิจของคุณใน API ที่แตกต่างกันขึ้นอยู่กับสิ่งที่คุณต้องการและคุณจะต้องเขียนวิธีการ API สำหรับการดำเนินการแต่ละอย่างที่คุณต้องการให้แอพอื่น ๆ ของคุณทำ สังคายนาวิธีการตรวจสอบ แต่ส่วนใหญ่มันเหมือนกัน ติดตรรกะทางธุรกิจของคุณในโครงการแยกต่างหาก (ห้องสมุดคลาส) และคุณอาจจะไม่มีปัญหา!
หวังว่าการตีความนี้ถูกต้อง ขอบคุณสำหรับการอภิปราย / ความคิดเห็นทั้งหมดที่ได้สร้างขึ้น