ใช้เลเยอร์บริการด้วย MVC


13

หากคอนโทรลเลอร์มีไขมันมากเกินไปและการสร้างอินสแตนซ์ของโมเดลเริ่มเพิ่มขึ้นสามารถใช้เลเยอร์บริการได้

  • ถ้าฉันแค่ห่อตรรกะภายในคลาสบริการฉันจะได้รับบริการมากมายด้วยวิธีการหนึ่ง / สอง รู้สึกเหมือนมีกลิ่นรหัส มีแนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับเรื่องนี้หรือไม่?

  • บริการยกตัวอย่างแบบจำลองได้หรือไม่?

  • หากบริการทำให้โมเดลเป็นตัวอย่างแสดงว่าไม่สามารถทดสอบบริการได้ พวกเขาสามารถถูกครอบคลุมโดยการทดสอบการรวม?

คำตอบ:


25

ใน 'SOLID' ตัว 'I' ย่อมาจาก Interface Segregation แนวคิดทั้งหมดของหลักการนี้คือการแยกอินเทอร์เฟซขนาดใหญ่ให้เล็กลง ในบริการ MVC จะมีส่วนต่อประสานที่ตัวควบคุมจะต้องพึ่งพา คุณไม่ต้องการให้ผู้ควบคุมของคุณรู้เกี่ยวกับการใช้บริการนั้นอย่างเป็นรูปธรรม ดังนั้นการให้บริการที่มีหนึ่งหรือสองวิธีจึงเป็นเรื่องดี

โดยปกติบริการจะส่งกลับ DTO ในแอปพลิเคชันขนาดใหญ่หรือรุ่นโดเมนโดยตรงในแอปพลิเคชันขนาดเล็ก โดยปกติแล้ว DTO หมายถึงการทำงานที่มากขึ้น การไหลทั่วไปคือ:

  • บริการควบคุมการโทร
  • บริการส่งคืนวัตถุ (ไม่ว่าจะเป็น DTO, โมเดลโดเมนหรืออย่างอื่น)
  • คอนโทรลเลอร์แมปโมเดล DTO / โดเมนกับโมเดลมุมมอง

การทำแผนที่สามารถทำได้ด้วยตนเอง แต่นักพัฒนาส่วนใหญ่ต้องการใช้กรอบการแมปอัตโนมัติเช่น Automapper เพราะเราไม่ชอบเขียนรหัสการประปาและเราค่อนข้างขี้เกียจ :-)

http://en.wikipedia.org/wiki/Interface_segregation_principle

https://github.com/AutoMapper/AutoMapper

หนึ่งในหลาย ๆ การอภิปรายเกี่ยวกับ stackoverflow เกี่ยวกับการใช้ DTO และโมเดลโดเมน: /programming/2680071/dto-or-domain-model-object-in-the-view-layer


1
ฉันจะระมัดระวังในการใช้ผู้ทำแผนที่อัตโนมัติที่นี่uglybugger.org/software/post/…
แดเนีย

AutoMapper มาพร้อมกับฟังก์ชันการทดสอบหน่วยในตัวซึ่งช่วยให้คุณสามารถตรวจสอบรูทีนการแมปทั้งหมดด้วยบรรทัดเดียว ผู้เขียนโพสต์นี้ไม่ได้พูดถึงว่า
CodeART

แต่เขารู้เกี่ยวกับมันและใช้มัน ความเห็นเข้าไปในนี้เล็กน้อย
Daniel Little

2
ชั้นเรียนจำนวนมากที่มีเพียงหนึ่งหรือสองวิธีมักจะหมายความว่าพวกเขาจะไม่เหนียวเหนอะ ถ้ามีชั้นบริการควรจะผอมด้วยตรรกะจำนวนมากที่อยู่ในรูปแบบ ดูเหมือนว่าค่อนข้างไม่มีจุดหมายที่จะผูกมุมมองกับวัตถุที่โง่ซึ่งไม่มีอะไรมากไปกว่าถุงสมบัติ แบบจำลองใน MVC ควรเป็นรูปแบบโดเมนที่หลากหลายไม่ใช่ anemic one martinfowler.com/bliki/AnemicDomainModel.html
Andy

3

ใน MVC โมเดลไม่ใช่แค่ DTO หรือชุดผู้จัดการ / บริการ แต่มีไว้เพื่อแสดงแนวคิดที่แอปพลิเคชันของคุณกำลังสร้างแบบจำลอง คุณสามารถคิดว่านี่เป็นทั้งโดเมนหรือตรรกะทางธุรกิจรวมถึงสถานะและพฤติกรรม ตอนนี้เรารู้แล้วว่าจุดประสงค์ของคอนโทรลเลอร์นั้นชัดเจนขึ้น มันเป็นหน้าที่เพียงเพื่อแปลคำสั่งลงบนโมเดลและผลลัพธ์กลับไปยังมุมมอง ซึ่งมักจะทำในรูปแบบของ ViewModels ซึ่งแตกต่างกัน แต่มักจะสับสนกับ Model ใน MVC

หากคุณไม่มีโมเดลที่กำหนดไว้อย่างดีแล้วคุณอาจไปถึงจุดที่ตรรกะส่วนใหญ่นั้นอยู่ในตัวควบคุมแล้ว ณ จุดนี้เพื่อเริ่มลดขนาดของตัวควบคุมของคุณคุณสามารถเริ่มดึงตรรกะนี้กลับไปยังวัตถุผู้จัดการหรือบริการ บริการเหล่านี้มักจะส่งคืนและดำเนินการกับ DTO / Entity เช่นเดียวกับวัตถุ จากนั้นคอนโทรลเลอร์จะกลายเป็นเลเยอร์การแมประหว่างบริการเหล่านี้กับมุมมองโมเดล สำหรับเคล็ดลับที่ดีไม่กี่ในการทำแผนที่ดูได้ที่บทความนี้เพื่อนจะไม่ปล่อยให้เพื่อนใช้ AutoMapper

สำหรับคำถามของคุณคำถามแรกขึ้นอยู่กับการสมัครของคุณ คุณจะต้องทำการปรับโครงสร้างใหม่ตามวิธีที่ควรจะชัดเจนยิ่งขึ้นเมื่อคุณลบตรรกะออกจากคอนโทรลเลอร์ของคุณ สำหรับการทดสอบไม่มีปัญหาในการสร้างโมเดลในบริการอย่างไรก็ตามหากคุณพบว่าการทดสอบนั้นยากอาจเป็นสัญญาณที่คุณต้องแบ่งการบริการออกเป็นส่วนย่อย ๆ โดยมีความรับผิดชอบเพียงอย่างเดียว


3

ตัวควบคุมควรมีการเรียกไปยังตัวแบบ (ซึ่งเป็นตรรกะทางธุรกิจที่เกิดขึ้น) และตามการเรียกที่กำหนดข้อมูลสำหรับมุมมอง (วัตถุของข้อมูลหรือข้อความแสดงข้อผิดพลาด) ดังนั้นตัวควบคุมจะค่อนข้างเล็กแม้หน้าซับซ้อนมากหากตัวควบคุมยังคง มีขนาดใหญ่มากคุณควรคิดว่าบางทีหน้านั้นควรขยายเข้าไปในหน้าอื่น ๆ

รูปแบบยังคงมีขนาดใหญ่มาก ... วิธีแก้ปัญหาที่ฉันพบคือการมีตัวแปรภายในคอนโทรลเลอร์ที่บอกว่าจะโหลดรุ่นใดและสำหรับงานเฉพาะที่ฉันโหลดรุ่นเฉพาะ

พยายามที่จะเชื่อฟัง model-view-controller model ที่ทำความสะอาดดังนี้:

  • มุมมอง: แสดงข้อมูล
  • controller: รวบรวม userinput, ถามโมเดลสำหรับข้อมูลที่ร้องขอและส่งกลับไปยังมุมมอง
  • model: ทำปฏิกิริยากับฐานข้อมูลและดำเนินการทางตรรกะเพื่อเตรียมข้อมูล

-1

ฉันพบว่าบริการมีประโยชน์จริง ๆ ในการใช้ตรรกะที่อาจต้องใช้ตัวควบคุมมากกว่าหนึ่งตัวหรือนั่นไม่เฉพาะเจาะจงมากพอที่จะเป็นส่วนหนึ่งของตัวควบคุมนอกจากความจริงที่ว่ามันทำให้ตัวควบคุมของฉันไม่ใหญ่และอ่านยากเกินไป .

ฉันไม่เห็นด้วยกับ 'aaa' โดยส่วนตัวเมื่อเขาบอกว่า "model (ซึ่ง bussiness logic แฮปปี้เกิดขึ้น)" เพราะนั่นคือเหตุผลทั้งหมดที่คุณมีคอนโทรลเลอร์ในแบบจำลองความคิดเห็นของฉันจำเป็นต้องเป็น abstractors ข้อมูลง่าย ๆ เพื่อให้คอนโทรลเลอร์สามารถทำงานได้ตามต้องการ บริการอีกครั้งไม่ควรเกี่ยวข้องกับงานการลบข้อมูล ...

แค่พูดว่า


1
หากโมเดลของคุณเป็นเพียงแค่คุณได้ตกอยู่ในโมเดลโดเมนโลหิตจาง antipattern martinfowler.com/bliki/AnemicDomainModel.html
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.