วัตถุ CLR แบบเก่าธรรมดากับวัตถุการถ่ายโอนข้อมูล


405

POCO = วัตถุ CLR แบบเก่า (หรือดีกว่า: คลาส)

DTO = วัตถุการถ่ายโอนข้อมูล

ในโพสต์นี้มีความแตกต่าง แต่บล็อกที่ฉันอ่านส่วนใหญ่อธิบาย POCO ตามวิธีที่ DTO กำหนดไว้: DTO เป็นคอนเทนเนอร์ข้อมูลแบบง่ายที่ใช้สำหรับย้ายข้อมูลระหว่างเลเยอร์ของแอปพลิเคชัน

POCO และ DTO เหมือนกันหรือไม่


5
"POCO = วัตถุ CLR แบบธรรมดา (หรือดีกว่า: คลาส) แบบเก่า" ดังนั้นวัตถุในลักษณะนี้ใน VB.NET ก็จะเป็น POCO ด้วยเช่นกันไม่ใช่ POVOs
J. Polfer

คำตอบ:


568

POCO เป็นไปตามกฎของ OOP ควร (แต่ไม่จำเป็นต้อง) มีสถานะและพฤติกรรม POCO มาจาก POJO ประกาศเกียรติคุณโดย Martin Fowler [ เรื่องเล็ก ๆ น้อย ๆ ที่นี่ ] เขาใช้คำว่า POJO เป็นวิธีที่จะทำให้มันดูเซ็กซี่ขึ้นกว่าที่จะปฏิเสธการใช้งาน EJB อย่างหนัก POCO ควรใช้ในบริบทเดียวกันใน. Net อย่าปล่อยให้กรอบกำหนดการออกแบบวัตถุของคุณ

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

นี่คือความแตกต่าง: POCO อธิบายวิธีการเขียนโปรแกรม ( การเขียนโปรแกรมเชิงวัตถุแบบเก่าที่ดี) ซึ่งDTO เป็นรูปแบบที่ใช้ในการ "ถ่ายโอนข้อมูล" โดยใช้วัตถุ

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

ในโดเมนที่มีความซับซ้อนตามสมควรคุณจะดีกว่าในการสร้าง POCO โดเมนแยกต่างหากและแปลเป็น DTO DDD (การออกแบบโดเมนขับเคลื่อน) กำหนดเลเยอร์ต่อต้านการทุจริต (ลิงก์อื่นที่นี่แต่สิ่งที่ดีที่สุดที่ต้องทำคือซื้อหนังสือ ) ซึ่งเป็นโครงสร้างที่ดีที่ทำให้การแยกชัดเจน


ฉันรู้ว่าฉันอ้างอิงมาร์ตินฟาวเลอร์มากที่นี่ แต่เขาบัญญัติศัพท์คำว่า POJO และเขียนหนังสือ PoEAA ซึ่งเป็นการอ้างอิงที่ชัดเจนสำหรับ DTO
Michael Meadows

ฉันไม่แน่ใจว่า DTO ไม่ควรมีพฤติกรรมหรือไม่ Judging โดยไดอะแกรมของ Martin Fowler DTO อาจมีพฤติกรรม
Beatles1692

39
@ Beatles1692 วิธีการอธิบายเป็นรหัสอนุกรม อาจเป็นคำที่กว้างเกินไปที่จะพูดว่า "ไม่มีพฤติกรรม" วิธีการเกี่ยวกับ "ไม่มีตรรกะทางธุรกิจ" รหัสซีเรียลไลซ์เซชั่นและวัตถุอ๊อพเจ็กในระดับต่ำเช่นรหัสแฮช, ความเท่าเทียมกันและ tostring ควรเป็นที่ยอมรับได้
Michael Meadows

1
@PositiveGuy แบบจำลองมีจุดประสงค์ที่แตกต่างจาก DTO DTO ควรสำหรับการถ่ายโอนข้อมูลจากโดเมนหนึ่งไปยังอีกโดเมนหนึ่ง (ไม่ว่าพวกเขาจะอยู่ในรันไทม์เดียวกันหรือไม่ก็ตาม) โมเดล "แสดง" มุมมองของโดเมนเช่นหน้าจอบริการหรือแหล่งข้อมูล แบบจำลองรวมถึงสถานะและพฤติกรรมที่เป็นตัวแทนของสิ่งที่พวกเขากำลังสร้างแบบจำลอง
Michael Meadows

2
โปรดทราบว่ารูปแบบโดเมน anemic ไม่จำเป็นต้องเลวร้ายโดยเฉพาะหากแอปของคุณส่วนใหญ่เป็น CRUD ชอบความเรียบง่ายมากกว่า Martin Fowler
Mariusz Jamro

50

มันอาจจะซ้ำซ้อนสำหรับฉันที่จะมีส่วนร่วมเนื่องจากฉันได้ระบุตำแหน่งของฉันในบทความบล็อกของฉันแล้ว แต่ย่อหน้าสุดท้ายของบทความนั้นสรุป:

ดังนั้นโดยสรุปเรียนรู้ที่จะรัก POCO และให้แน่ใจว่าคุณไม่กระจายข้อมูลที่ผิดเกี่ยวกับมันเป็นสิ่งเดียวกันกับ DTO DTOs เป็นคอนเทนเนอร์ข้อมูลแบบง่ายที่ใช้สำหรับย้ายข้อมูลระหว่างเลเยอร์ของแอปพลิเคชัน POCO เป็นออบเจ็กต์ทางธุรกิจเต็มรูปแบบที่มีความต้องการเพียงประการเดียวคือ Persistence Ignorant (ไม่มีวิธีรับหรือบันทึก) ท้ายที่สุดถ้าคุณยังไม่ได้ดูหนังสือของ Jimmy Nilsson ให้หยิบมันมาจากกองมหาวิทยาลัยในพื้นที่ของคุณ มันมีตัวอย่างใน C # และเป็นการอ่านที่ยอดเยี่ยม

BTW, Patrick ฉันอ่าน POCO เป็นบทความ Lifestyle และฉันเห็นด้วยอย่างยิ่งว่าเป็นบทความที่ยอดเยี่ยม ที่จริงแล้วเป็นส่วนหนึ่งของหนังสือ Jimmy Nilsson ที่ฉันแนะนำ ฉันไม่ทราบว่ามันมีให้ทางออนไลน์ หนังสือของเขาเป็นแหล่งข้อมูลที่ดีที่สุดที่ฉันพบใน POCO / DTO / Repository / และแนวทางการพัฒนา DDD อื่น ๆ


4
ลิงก์ไปยังบทความบล็อก: rlacovara.blogspot.com/2009/03/…
Jamie Ide

28

POCO เป็นเพียงวัตถุที่ไม่พึ่งพากรอบภายนอก มันเป็นธรรมดา

ไม่ว่า POCO จะมีพฤติกรรมหรือไม่ก็ตาม

DTO อาจเป็น POCO เช่นเดียวกับวัตถุโดเมน (ซึ่งโดยทั่วไปจะอุดมไปด้วยพฤติกรรม)

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

ในสถาปัตยกรรมสไตล์ Onion ทั่วไป (มักใช้ภายในวิธี DDD แบบกว้าง ๆ ) เลเยอร์โดเมนจะถูกวางไว้ที่กึ่งกลางดังนั้นวัตถุของมันไม่ควรที่จุดนี้จะมีการพึ่งพานอกเลเยอร์นั้น



6

ฉันคิดว่า DTO สามารถเป็น POCO ได้ DTO นั้นเกี่ยวกับการใช้งานของวัตถุในขณะที่ POCO เป็นรูปแบบของวัตถุมากขึ้น (แยกออกจากแนวคิดทางสถาปัตยกรรม)

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

ปรับปรุง Martin Fowler กล่าวว่าวิธีการนี้เป็นเส้นทางที่ต้องใช้งานมากและควรดำเนินการเฉพาะในกรณีที่มีความไม่ตรงกันอย่างมากระหว่างชั้นโดเมนและส่วนติดต่อผู้ใช้


2
@David Landman ลิงก์ที่คุณรวมไว้เป็นรูปแบบ Local DTO ซึ่งเป็นเวลาที่ DTO ใช้สำหรับสถานะการโอนภายในขอบเขตระบบของคุณ ในกรณีเหล่านี้คุณควรระวังให้ดีเนื่องจากในระบบของคุณคุณควรมีโดเมนที่กำหนดไว้อย่างดีที่สามารถแบ่งปันได้ เมื่อถ่ายโอนสถานะข้ามขอบเขตของระบบ DTO นั้นยากที่จะหลีกเลี่ยงและเหมาะสมในทุกกรณี
Michael Meadows

@Michal Meadows ใช่แล้วลิงค์จะพูดถึงปัญหาบางอย่างที่แตกต่างกันไป แต่ฉันคิดว่าในกรณีของการถ่ายโอนสถานะข้ามขอบเขตของระบบคุณควรใช้บริการการแปลเพื่อแมป POCO จากบริบทหนึ่งไปยัง POCO จากบริบทอื่น หรือคุณกำลังพูดถึงขอบเขตในระดับระบบหรือไม่?
Davy Landman

1

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


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

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

5
** ความหมาย: บริการบนเว็บแสดงสถานะถุงวัตถุโดยใช้ WSDL พรอกซีถูกสร้างขึ้นจากสิ่งเหล่านี้ สิ่งเหล่านี้ไม่รวมถึงพฤติกรรม หากใช้บริการบนเว็บความสัมพันธ์เพียงอย่างเดียวระหว่างวัตถุของคุณกับวัตถุโดเมนที่เปิดเผยคือมีสถานะสาธารณะเดียวกันที่สร้างขึ้นตามการตรวจสอบ
Michael Meadows

7
@ จอห์นฉันคิดว่าคุณทำปฏิกิริยามากเกินไป ฉันกำลังบอกว่าคุณพูดถูก แต่ข้อความของคุณทำให้เข้าใจผิด "ในกรณีนี้ POCO และ DTO เทียบเท่ากัน" ความหมายนั่นไม่เป็นความจริง POCO สามารถใช้เป็น DTO และในทางกลับกัน แต่นั่นไม่ได้หมายความว่าพวกเขาเทียบเท่า ... ไม่มากไปกว่ารถยนต์และรถกระบะที่เทียบได้แม้ว่าพวกเขาทั้งสองจะสามารถนำคุณไปที่ร้านขายของชำได้ พวกเขามีฟังก์ชั่นที่ทับซ้อนกัน แต่คุณยากที่จะหาคนที่จะบอกคุณว่ามีความเข้าใจเทียบเท่ากับ F350 แม้ในบริบทของการเดินทางร้านขายของชำ
Michael Meadows

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

1

นี่คือกฎทั่วไป: DTO == ความชั่วร้ายและตัวบ่งชี้ของซอฟต์แวร์ที่มีการออกแบบเกิน POCO == ดี รูปแบบ 'องค์กร' ได้ทำลายสมองของผู้คนจำนวนมากในโลก Java EE โปรดอย่าทำผิดซ้ำอีกในที่ดิน. NET


7
กรุณาอธิบายเพิ่มเติมหน่อยได้ไหม? ต้องใช้ DTO เมื่อส่งคืนข้อมูลจากบริการบนเว็บเพื่อหลีกเลี่ยงการใช้งานและข้อมูลเฉพาะของแพลตฟอร์มในสัญญา
จอห์นแซนเดอ

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

9
ผมคิดว่า @drscroogemcduck ว่าบางทีคุณอาจไม่ชอบ DTOs เพราะพวกเขากำลังใช้เป็นรีสอร์ทแห่งแรกแทนที่จะเป็นที่พึ่งสุดท้าย แต่พวกเขาไม่ได้โดยเนื้อแท้ความชั่วร้าย ... ไม่มากดังนั้นกว่าที่น่าอับอายเดี่ยวหรือโรงงานรูปแบบ สิ่งที่ชั่วร้ายคือสถาปนิกที่ผลักโครงร่างของนักพัฒนาที่บังคับให้พวกเขาทำ DTO สำหรับทุกสิ่ง สำหรับสิ่งที่พวกเขาทำการถ่ายโอนข้อมูล DTOs (ถ้าทำอย่างรอบคอบ) นั้นเหมาะสมอย่างยิ่ง
Michael Meadows

0

คลาส DTO ใช้ในการซีเรียลไลซ์ / ดีซีเรียลไลซ์ข้อมูลจากแหล่งต่าง ๆ เมื่อคุณต้องการแยกแยะวัตถุจากแหล่งที่มาไม่สำคัญว่าจะเป็นแหล่งข้อมูลภายนอกใด: บริการไฟล์ฐานข้อมูล ฯลฯ คุณอาจต้องการใช้เพียงบางส่วนเท่านั้น แต่คุณต้องการวิธีที่ง่ายในการจัดลำดับข้อมูลให้กับ วัตถุ. หลังจากนั้นคุณคัดลอกข้อมูลนั้นไปยัง XModel ที่คุณต้องการใช้ Serializer เป็นเทคโนโลยีที่สวยงามในการโหลดวัตถุ DTO ทำไม? คุณต้องการเพียงหนึ่งฟังก์ชั่นในการโหลด (ดีซีเรียลไลซ์) วัตถุ


0

TL; DR:

DTO อธิบายถึงรูปแบบของการถ่ายโอนสถานะ POCO ไม่ได้อธิบายอะไรเลย เป็นอีกวิธีหนึ่งในการพูดว่า "object" ใน OOP มันมาจาก POJO (Java) ประกาศเกียรติคุณจาก Martin Fowler ผู้อธิบายเพียงแค่ว่ามันเป็นชื่อที่นักเล่น 'วัตถุ' เพราะ 'วัตถุ' ไม่ได้เซ็กซี่มาก

DTO เป็นรูปแบบวัตถุที่ใช้ในการถ่ายโอนสถานะระหว่างชั้นของความกังวล พวกเขาสามารถมีพฤติกรรม (เช่นในทางเทคนิคสามารถเป็น poco) ตราบใดที่พฤติกรรมนั้นไม่เปลี่ยนแปลงสถานะ ตัวอย่างเช่นมันอาจมีวิธีการที่ทำให้เป็นอันดับของตัวเอง

POCO เป็นวัตถุธรรมดา แต่สิ่งที่มีความหมายโดย 'ธรรมดา' คือมันไม่พิเศษ มันหมายความว่ามันเป็นวัตถุ CLR ที่ไม่มีรูปแบบโดยนัย ศัพท์ทั่วไป มันไม่ได้ทำงานกับกรอบอื่น ๆ ดังนั้นถ้า POCO ของคุณมี[JsonProperty]หรือ EF ตกแต่งอยู่ทั่วทุกแห่งมันก็เป็นคุณสมบัติเช่นกันดังนั้นฉันจะยืนยันว่าไม่ใช่ POCO

นี่คือตัวอย่างของรูปแบบวัตถุชนิดต่าง ๆ เพื่อเปรียบเทียบ:

  • ดูโมเดล : ใช้เพื่อสร้างโมเดลข้อมูลสำหรับมุมมอง มักจะมีคำอธิบายประกอบข้อมูลเพื่อช่วยในการผูกและการตรวจสอบ ใน MVVM มันยังทำหน้าที่เป็นตัวควบคุม มันเป็นมากกว่า DTO
  • วัตถุค่า : ใช้เพื่อแสดงค่า
  • Aggregate Root : ใช้เพื่อจัดการสถานะและค่าคงที่
  • ตัวจัดการ : ใช้เพื่อตอบกลับเหตุการณ์ / ข้อความ
  • คุณสมบัติ : ใช้เป็นของประดับตกแต่งเพื่อจัดการกับข้อกังวลข้าม
  • บริการ : ใช้เพื่อทำงานที่ซับซ้อน
  • Controller : ใช้สำหรับควบคุมการไหลของคำร้องขอและการตอบกลับ
  • Factory : ใช้เพื่อกำหนดค่าและ / หรือรวบรวมวัตถุที่ซับซ้อนเพื่อใช้เมื่อตัวสร้างไม่ดีพอ นอกจากนี้ยังใช้ในการตัดสินใจว่าจะต้องสร้างวัตถุใดในรันไทม์
  • Repository / DAO : ใช้เพื่อเข้าถึงข้อมูล

สิ่งเหล่านี้ล้วนเป็นแค่วัตถุ แต่สังเกตว่าส่วนใหญ่มักจะเชื่อมโยงกับลวดลาย ดังนั้นคุณสามารถเรียกพวกเขาว่า "วัตถุ" หรือคุณอาจเจาะจงเจาะจงมากขึ้นเกี่ยวกับเจตนาของมันและเรียกมันตามสิ่งที่มันเป็น นี่คือสาเหตุที่เรามีรูปแบบการออกแบบ เพื่ออธิบายแนวคิดที่ซับซ้อนในงานไม่กี่ DTO เป็นรูปแบบ รูทรวมเป็นรูปแบบ View Model เป็นรูปแบบ (เช่น MVC & MVVM) POCO ไม่ใช่รูปแบบ

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

  • DTO คือ POCO
  • POCO ไม่ใช่ DTO
  • รูปแบบการดูเป็น POCO
  • POCO ไม่ใช่ View Model

ประเด็นในการสร้างความแตกต่างระหว่างทั้งสองคือการรักษารูปแบบที่ชัดเจนและสอดคล้องกันในความพยายามที่จะไม่ข้ามความกังวลและนำไปสู่การมีเพศสัมพันธ์แน่น ตัวอย่างเช่นถ้าคุณมีออบเจ็กต์ธุรกิจที่มีวิธีการเปลี่ยนแปลงสถานะ แต่ตกแต่งด้วยนรกด้วยการตกแต่งของ EF สำหรับการบันทึกไปยัง SQL Server และ JsonProperty เพื่อให้สามารถส่งกลับไปยังจุดปลายทาง API ได้ วัตถุนั้นจะทนต่อการเปลี่ยนแปลงและมีแนวโน้มว่าจะถูกทิ้งให้เกลื่อนไปด้วยคุณสมบัติต่างๆ (เช่น UserId, UserPk, UserKey, UserGuid, ที่บางคนถูกทำเครื่องหมายว่าไม่ถูกบันทึกลงในฐานข้อมูลและอื่น ๆ ที่ทำเครื่องหมายว่าไม่ JSON ที่จุดสิ้นสุด API)

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


-13

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

ฉันหวังว่าคำศัพท์โง่ ๆ จะหายไปจากคำศัพท์ของเรา


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

9
downvoted สำหรับความจริงที่ไม่ถูกต้องและทัศนคติที่เย้ยหยัน
joedotnot

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

ฉันยอมรับว่า DTO เป็นแบบจำลองหน้าที่ ViewModels มีพฤติกรรมและเป็นสิ่งที่คุณผูกไว้ใน MVVM อย่างไรก็ตามฉันเขียนแอปที่รุ่นของฉันฉลาดกว่า (โดยทั่วไปคือ VM แต่ฉันไม่ต้องการเรียกพวกเขามากกว่า) และพวกเขา "ยอมรับ" วัตถุ DTO สิ่งนี้ทำให้ฉันมีตัวเลือกเพิ่มเติมด้วยกรอบงาน ดังนั้นจาก CRUD (หรือแม้กระทั่ง EF) ฉันจะส่งวัตถุผ่านบริการ WCF และรับวัตถุ DTO และแค็ปซูลมัน (เพิ่ม OnProp Change ฯลฯ ) ViewModels ของฉันดำเนินการห่อหุ้มเพิ่มเติมและอาจยอมรับ "รุ่น" สองรายการ (หรือรายการ) คำจำกัดความที่เข้มงวดคือ VMs
SQLMason

"คุณโอนรุ่นระหว่างโดเมนบริการและแอพ" ทำไมคิดว่ารูปแบบคำนั้นเหมาะสมและเหมาะสมกว่าคำว่า DTO สำหรับพฤติกรรมนี้ที่คุณอธิบาย
caa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.