รูปแบบ DAO และ Repository แตกต่างกันอย่างไร


423

อะไรคือความแตกต่างระหว่าง Data Access Objects (DAO) และรูปแบบ Repository ฉันกำลังพัฒนาแอปพลิเคชันที่ใช้ Enterprise Java Beans (EJB3), Hibernate ORM เป็นโครงสร้างพื้นฐานและ Domain-Driven Design (DDD) และ Test-Driven Development (TDD) เป็นเทคนิคการออกแบบ

คำตอบ:


472

DAOเป็นนามธรรมของการติดตาข้อมูล
Repositoryเป็นนามธรรมของคอลเลกชันของวัตถุ

DAOจะถูกพิจารณาว่าใกล้กับฐานข้อมูลมากขึ้น
Repositoryจะได้รับการพิจารณาให้ใกล้เคียงกับโดเมนมากขึ้นเท่านั้น

Repositoryสามารถใช้งานได้โดยใช้DAOแต่คุณจะไม่ทำสิ่งตรงกันข้าม

นอกจากนี้Repositoryโดยทั่วไปแล้วอินเตอร์เฟสที่แคบกว่าก็คือ มันควรจะเป็นเพียงคอลเลกชันของวัตถุด้วยGet(id), , Find(ISpecification)Add(Entity)

วิธีการเช่นUpdateนี้เหมาะสมในการDAOแต่ไม่Repository- เมื่อใช้ a Repositoryการเปลี่ยนแปลงเอนทิตีมักจะถูกติดตามโดย UnitOfWork แยกต่างหาก

ดูเหมือนเป็นเรื่องธรรมดาที่จะเห็นการใช้งานที่เรียกว่า a Repositoryนั้นมีมากกว่าDAOและฉันคิดว่ามีความสับสนเกี่ยวกับความแตกต่างระหว่างพวกเขา


27
คุณไม่ต้องการให้คลาส DAO ของคุณใช้IRepositoryอินเตอร์เฟสของคุณอย่างแท้จริง คุณต้องการให้ที่เก็บของคุณใช้ DAO ในการนำไปใช้ โปรดจำไว้ว่า DAO จะเป็นวัตถุต่อตารางในขณะที่พื้นที่เก็บข้อมูลมักจะต้องใช้หลาย DAO เพื่อสร้างเอนทิตีเดียว หากคุณพบว่าไม่ใช่ในกรณีของที่เก็บและเอนทิตีของคุณเพียงแค่ต้องเข้าถึงตารางเดียวนั่นหมายความว่าคุณมีแนวโน้มที่จะสร้างโดเมนแอนติโนมิก
quentin-starin

29
ฉันสังเกตเห็นใน. NET โลกโดยเฉพาะคำว่า "Repository" ใช้เพื่ออ้างถึงสิ่งที่เป็นหลัก DAO; "DAO" เป็นคำศัพท์ภาษาจาวามากกว่า
Wayne Molina

14
@Thurein DAO-s ไม่ได้อยู่ที่โต๊ะเท่านั้นรูปแบบนั้นเป็นเพียงการสรุปการเข้าถึงข้อมูลของคุณเท่านั้น - คุณสามารถนำไปใช้ได้ตามที่คุณต้องการ (ต่อโต๊ะหรือต่อกลุ่มหรือรุ่น) วิธีที่แนะนำคือการจัดรูปแบบ DAO ของคุณตามแบบจำลองโดเมนของคุณแทนที่จะคำนึงถึงความคงทนในการใช้งานเนื่องจากมันทำให้ง่ายขึ้น / ชัดเจนขึ้นในการใช้งานและให้ความยืดหยุ่นมากขึ้นเกี่ยวกับวิธีการคงอยู่ของคุณ DAO ที่เก็บข้อมูลของคุณในไฟล์ XML หรือรับจากคิวข้อความแทนที่จะมาจากฐานข้อมูล ... )
Stef

21
@ ฉันไม่เห็นด้วย DAO ส่งคืนข้อมูลตามคำจำกัดความที่สูงมาก ( วัตถุเข้าถึงข้อมูล ) ที่เก็บตามคำจำกัดความส่งคืนวัตถุโดเมน มันควรจะมีเหตุผลว่าที่เก็บจะใช้ DAO และไม่ใช่วิธีอื่น ๆ เพราะใน OOP เราจะรวบรวมวัตถุโดเมนจากวัตถุข้อมูลหนึ่งหรือมากกว่าและไม่ใช่วิธีอื่น
หมดเวลา Danila

6
เหตุใด Repository จึงเป็นแนวคิด "อ่านอย่างเดียว" ในขณะที่ DAO คือ "อ่านและเขียน"
Dennis

121

ตกลงคิดว่าฉันสามารถอธิบายได้ดีกว่าสิ่งที่ฉันได้แสดงความคิดเห็น :) โดยพื้นฐานแล้วคุณสามารถเห็นทั้งสองอย่างนี้เหมือนกันแม้ว่า DAO จะมีรูปแบบที่ยืดหยุ่นมากกว่า Repository หากคุณต้องการใช้ทั้งสองอย่างคุณจะใช้ Repository ใน DAO-s ของคุณ ฉันจะอธิบายแต่ละข้อด้านล่าง:

พื้นที่เก็บข้อมูล:

มันเป็นที่เก็บของวัตถุชนิดหนึ่ง - มันช่วยให้คุณสามารถค้นหาวัตถุชนิดใดชนิดหนึ่งโดยเฉพาะรวมถึงเก็บมัน โดยปกติจะจัดการกับวัตถุประเภทเดียวเท่านั้น เช่นAppleRepositoryจะช่วยให้คุณทำหรือAppleRepository.findAll(criteria) AppleRepository.save(juicyApple)โปรดทราบว่าที่เก็บกำลังใช้คำว่าโดเมนโมเดล (ไม่ใช่คำศัพท์ DB - ไม่มีอะไรเกี่ยวข้องกับวิธีการเก็บข้อมูลไว้ที่ใด)

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

DAO - วัตถุการเข้าถึงข้อมูล (ในคำอื่น ๆ - วัตถุที่ใช้ในการเข้าถึงข้อมูล)

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

เช่นคุณสามารถมี UserDao ที่เปิดเผยวิธีการเช่น

Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)

ทั้งหมดที่เกี่ยวข้องกับผู้ใช้ (และความปลอดภัย) และสามารถระบุได้ภายใต้ DAO เดียวกัน นี่ไม่ใช่กรณีสำหรับพื้นที่เก็บข้อมูล

ในที่สุด

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


หากฉันได้รับสิทธิ์เช่นฉันมีบางอย่างเช่นCarDescriptionที่มีเช่นlanguage_idเป็นกุญแจสำคัญในต่างประเทศ - เพื่อเรียกคืนว่าฉันควรทำสิ่งนี้: CarRepository.getAll(new Criteria(carOwner.id, language.id));ซึ่งจะให้รถยนต์ทุกคันของภาษาในภาษาเฉพาะ - เป็นวิธีที่เหมาะสมที่จะทำมัน ?
displayname

@StefanFalk ดูที่ Spring Data มันช่วยให้คุณโทรได้ดีกว่ามาก เช่นที่สามารถเขียนได้เช่นกันCarRepository.findByLanguageId(language.id)และคุณไม่จำเป็นต้องเขียนรหัสคุณเพียงแค่กำหนดส่วนต่อประสานด้วยวิธีการที่มีชื่อนั้นและ Spring Data ดูแลการสร้างการใช้งานคลาสเริ่มต้นสำหรับคุณ สิ่งที่สวยเรียบร้อย;)
เตฟ

2
ความสวยงามของ Spring Data คือคุณไม่จำเป็นต้องเขียนแบบสอบถามคุณเพียงสร้างอินเทอร์เฟซ (เช่น TodoRepository ในตัวอย่างของคุณซึ่งมีวิธีการfindById) และคุณจะทำจริง สิ่งที่ Spring Data ทำก็คือมันจะพบอินเทอร์เฟซทั้งหมดที่คุณสร้างขึ้นซึ่งขยายอินเทอร์เฟซ Repository และสร้างคลาสให้คุณ คุณจะไม่เห็นคลาสเหล่านั้นและคุณจะไม่สามารถสร้างอินสแตนซ์ใหม่ได้ แต่คุณไม่จำเป็นต้องทำเช่นนั้นเพราะคุณสามารถป้อนอัตโนมัติอินเทอร์เฟซและให้ Spring ค้นหาวัตถุที่เก็บข้อมูลนั้น
Stef

1
ในที่สุดคุณไม่จำเป็นต้องใช้ Spring Data คุณสามารถเขียนวิธีการสืบค้นด้วยตัวเองได้ (ใช้ Criteria API และอื่น ๆ ) แต่คุณต้องทำให้ชีวิตของคุณซับซ้อนขึ้น ... คุณอาจบอกว่า คุณจะมีความยืดหยุ่นมากกว่านี้ แต่นั่นก็ไม่เป็นความจริงเหมือนกับว่าคุณต้องการคลั่งไคล้กับการสืบค้นของคุณ Spring Data ช่วยให้คุณทำเช่นนั้นได้สองวิธี: คำอธิบายประกอบ @Query หรือหากไม่ได้ผลคุณสามารถ สร้างที่เก็บข้อมูลแบบกำหนดเองซึ่งเป็นส่วนเสริมที่ให้พลังงานแก่คุณเหมือนกับว่าคุณเขียนการใช้งานของคุณเองตั้งแต่เริ่มต้น
Stef

2
"Aggregated root" เป็นคำที่มักจะเชื่อมต่อกับรูปแบบที่เก็บ ฉันไม่รู้ว่าคุณจะใช้สิ่งนี้อย่างไรกับคำจำกัดความของที่เก็บของคุณ
Christian Strempfer

90

รูปแบบ DAO และ Repository เป็นวิธีการใช้ Data Access Layer (DAL) ดังนั้นเริ่มต้นด้วย DAL ก่อน

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

จนถึงตอนนี้เรายังไม่ได้พูดคุยเกี่ยวกับการใช้งานเฉพาะ: เพียงหลักการทั่วไปที่วางตรรกะการเข้าถึงฐานข้อมูลในโมดูลแยกต่างหาก

ตอนนี้เราจะใช้หลักการนี้ได้อย่างไร โดยเฉพาะอย่างยิ่งกับกรอบงานเช่นไฮเบอร์เนตคือรูปแบบ DAO

รูปแบบ DAO เป็นวิธีหนึ่งในการสร้าง DAL โดยทั่วไปนิติบุคคลแต่ละโดเมนจะมี DAO ของตนเอง ยกตัวอย่างเช่นUserและUserDao, AppointmentและAppointmentDaoฯลฯ ตัวอย่างของ DAO กับ Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html

จากนั้นรูปแบบ Repository คืออะไร? เช่นเดียวกับ DAO รูปแบบของที่เก็บก็เป็นวิธีที่ทำให้ DAL ประสบความสำเร็จเช่นกัน จุดหลักในรูปแบบ Repository คือจากมุมมองของลูกค้า / ผู้ใช้นั้นควรมีลักษณะหรือมีพฤติกรรมเป็นคอลเลกชัน Collection collection = new SomeCollection()อะไรคือความหมายโดยทำตัวเหมือนคอลเลกชันไม่ได้ว่ามันจะต้องมีการยกตัวอย่างเช่น แต่ก็หมายความว่าควรสนับสนุนการดำเนินการเช่นเพิ่มลบออกมี ฯลฯ นี่คือสาระสำคัญของรูปแบบ Repository

ในทางปฏิบัติเช่นในกรณีของการใช้ Hibernate รูปแบบที่เก็บจะรับรู้ด้วย DAO นั่นคืออินสแตนซ์ของ DAL ที่สามารถเป็นได้ทั้งอินสแตนซ์ของรูปแบบ DAO และรูปแบบ Repository

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


5
"ถ้า DAO มีชุดของการดำเนินการที่เหมือนคอลเลกชันอยู่แล้วอะไรคือสิ่งที่จำเป็นสำหรับเลเยอร์พิเศษที่อยู่ด้านบนของมัน" สมมติว่าคุณกำลังสร้างโมเดลร้านขายสัตว์เลี้ยงและคุณมีตาราง 'PetType' ที่มีสัตว์ต่าง ๆ และคุณลักษณะ (ชื่อ: "Cat", ประเภท: "Mammal" ฯลฯ ) อ้างอิงโดยตาราง 'Pet' ของสัตว์เลี้ยงที่เป็นรูปธรรมคุณ มีในร้าน (ชื่อ: "Katniss", พันธุ์: "Calico", ฯลฯ ) หากคุณต้องการเพิ่มประเภทของสัตว์ที่ไม่ได้อยู่ในฐานข้อมูลคุณสามารถใช้พื้นที่เก็บข้อมูลเพื่อจัดกลุ่มการเรียก DAO สองสายแยกกัน (หนึ่งรายการเพื่อสร้าง PetType และอีกประเภทสำหรับ Pet) ในวิธีหนึ่งโดยหลีกเลี่ยงการเชื่อมต่อใน DAO
Matt

1
คำอธิบายที่ยอดเยี่ยมครับ!
พอล - เซบาสเตียน Manole

74

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

วัตถุประสงค์ของ DAO คือการซ่อนรายละเอียดการใช้งานของกลไกการเข้าถึงข้อมูล รูปแบบพื้นที่เก็บข้อมูลแตกต่างกันอย่างไร เท่าที่ฉันสามารถบอกได้ การบอกว่า Repository นั้นแตกต่างจาก DAO เพราะคุณกำลังจัดการ / ส่งคืนชุดของวัตถุที่ไม่ถูกต้อง DAOs ยังสามารถส่งคืนคอลเลกชันของวัตถุ

ทุกอย่างที่ฉันได้อ่านเกี่ยวกับรูปแบบพื้นที่เก็บข้อมูลนั้นขึ้นอยู่กับความแตกต่างนี้: การออกแบบ DAO ไม่ดีเทียบกับการออกแบบ DAO ที่ดี (รูปแบบการออกแบบพื้นที่เก็บข้อมูล aka)


5
ใช่เห็นด้วยโดยสิ้นเชิงพวกเขาเป็นหลักเดียวกัน DAO ฟังดูเกี่ยวข้องกับ DB มากกว่า แต่ก็ไม่ใช่ เหมือนกับ Repository เป็นเพียงนามธรรมที่ใช้ในการซ่อนตำแหน่งและวิธีการเก็บข้อมูล
Stef

+1 สำหรับคำสั่งนี้ ตรงไปตรงนี้ดูเหมือนความแตกต่างทางความหมายไม่ใช่ความแตกต่างทางเทคนิค วลี Data Access Object ไม่ได้อ้างอิงถึง "ฐานข้อมูล" เลย
Sudhakar Chavali

1
จุดเมื่อเปรียบเทียบที่เก็บข้อมูลและคอลเล็กชันไม่ใช่ว่าพวกเขากำลังจัดการ / ส่งคืนคอลเลกชันของวัตถุ แต่ที่เก็บนั้นทำตัวราวกับว่าพวกเขา เป็นคอลเลกชันของตัวเอง ตัวอย่างเช่นใน Java ที่หมายถึงที่เก็บไม่มีวิธีการอัปเดตเพราะเมื่อคุณแก้ไขวัตถุในคอลเลกชันมันจะถูกปรับปรุงโดยอัตโนมัติ (เพราะคอลเลกชัน Java เก็บเฉพาะการอ้างอิงกับวัตถุ)
Christoph Böhme

17

พื้นที่เก็บข้อมูลเป็นโดเมนที่เป็นนามธรรมมากกว่าคำที่เป็นส่วนหนึ่งของการออกแบบโดเมนขับเคลื่อนมันเป็นส่วนหนึ่งของการออกแบบโดเมนของคุณและภาษาทั่วไป DAO เป็นนามธรรมทางเทคนิคสำหรับเทคโนโลยีการเข้าถึงข้อมูลที่เก็บเป็นกังวลเฉพาะกับการจัดการข้อมูลที่มีอยู่และโรงงานเพื่อสร้าง ข้อมูล.

ตรวจสอบลิงก์เหล่านี้:

http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html


6

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


5

DAO ให้สิ่งที่เป็นนามธรรมในไฟล์ฐานข้อมูล / ข้อมูลหรือกลไกการคงอยู่อื่น ๆ เพื่อให้สามารถจัดการเลเยอร์การคงอยู่ได้โดยไม่ทราบรายละเอียดการใช้งาน

โดยที่ในคลาส Repository คลาส DAO หลายคลาสสามารถใช้ภายในวิธีการ Repository เดียวเพื่อให้การดำเนินการเสร็จสิ้นจาก "มุมมองแอพ" ดังนั้นแทนที่จะใช้ DAO หลายตัวที่ Domain layer ให้ใช้ repository เพื่อทำให้เสร็จ Repository เป็นเลเยอร์ซึ่งอาจมีแอปพลิเคชั่นบางอย่างเช่น: หากข้อมูลมีอยู่ในแคชในหน่วยความจำให้ทำการดึงจากแคชมิฉะนั้นให้ดึงข้อมูลจากเครือข่ายและเก็บไว้ในแคชในหน่วยความจำสำหรับการเรียกใช้ครั้งต่อไป


3

พื้นที่เก็บข้อมูลไม่มีอะไรนอกจาก DAO ที่ออกแบบมาอย่างดี

ORM เป็นศูนย์กลางของตาราง แต่ไม่ใช่ DAO

ไม่จำเป็นต้องใช้ DAO หลายแห่งในที่เก็บเนื่องจาก DAO สามารถทำสิ่งเดียวกันกับที่เก็บ ORM / เอนทิตีหรือผู้ให้บริการ DAL ใด ๆ ไม่ว่าจะอยู่ที่ไหนและอย่างไรรถยังคงอยู่ 1 ตาราง 2 ตาราง n ตารางครึ่งตาราง a บริการเว็บตารางและบริการบนเว็บเป็นต้นบริการใช้ DAO / แหล่งเก็บข้อมูลหลายแห่ง

DAO ของฉันเองสมมติว่า CarDao จัดการกับ Car DTO เท่านั้นฉันหมายถึงใช้ Car DTO ในอินพุตเท่านั้นและส่งคืนรถ DTO หรือคอลเล็กชั่น DTO ในรถยนต์

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


ก่อนอื่นจาก "ที่เก็บ ORM / เอนทิตี"? คุณหมายถึงเอนทิตีของ ORM ไม่มีสิ่งเช่นที่เก็บของ ORMs อันดับที่สองของ ORM ทั้งหมดมักจะจัดการกับเอนทิตีเท่านั้นเช่น แบบจำลองโดเมน DAO จัดการกับตารางโดยตรงและเข้าถึงข้อมูลที่เป็นนามธรรม พวกเขากลับนิติบุคคลเช่นกัน ที่เก็บข้อมูลเป็นสิ่งที่เป็นนามธรรมที่สูงที่สุดซึ่งนำเสนออินเตอร์เฟสการรวบรวมเพื่อรับเอนทิตี DAO สามารถเป็นที่เก็บได้เช่น ทำให้เอนจิ้นการจัดเก็บข้อมูลที่แท้จริงนำเสนออินเทอร์เฟซนั้นและเสนอมุมมองคอลเลกชันของ (แคช) เอนทิตี DAO สามารถใช้ ORM เพื่อเชื่อมต่อกับฐานข้อมูลและมอบหมายเอนทิตี้ของผู้รับมอบสิทธิ์
พอล - เซบาสเตียน Manole

3
เห็นด้วยกับ @brokenthorn จุดที่สำคัญที่สุดในความคิดเห็นของเขาคือ "ที่เก็บข้อมูลเป็นสิ่งที่เป็นนามธรรมที่สูงที่สุด" และสิ่งที่เป็นนามธรรมนี้เป็นสิ่งจำเป็นเมื่อคุณต้องการปกป้องรหัสโดเมนของคุณจากเทคโนโลยีฐานข้อมูลพื้นฐาน แนวคิดของไดรเวอร์ ORM / Adapter / DB มักจะรั่วไหลไปยัง DAO หากคุณมีแอปพลิเคชั่นที่รองรับเทคโนโลยีฐานข้อมูลมากกว่าหนึ่งหรือหากคุณไม่ต้องการให้แอปของคุณถูกล็อกไปยังฐานข้อมูลการใช้ DAO โดยตรงจากตัวแบบโดเมนนั้นเป็นแบบไม่ต้องทำ
Subhash Bhushan

2

ลองค้นหาว่า DAO หรือรูปแบบพื้นที่เก็บข้อมูลสามารถใช้ได้กับสถานการณ์ต่อไปนี้มากที่สุด: ลองจินตนาการว่าคุณต้องการให้ API การเข้าถึงข้อมูลที่สม่ำเสมอสำหรับกลไกถาวรกับแหล่งข้อมูลประเภทต่างๆเช่น RDBMS, LDAP, OODB, ที่เก็บ XML และ ไฟล์แบน

โปรดอ้างถึงลิงก์ต่อไปนี้เช่นกันหากสนใจ:

http://www.codeinsanity.com/2008/08/repository-pattern.html

http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/

http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx

http://en.wikipedia.org/wiki/Domain-driven_design

http://msdn.microsoft.com/en-us/magazine/dd419654.aspx


0

ในประโยคที่ง่ายมาก: ความแตกต่างที่สำคัญคือที่เก็บเป็นตัวแทนของคอลเลกชันในขณะที่ DAO อยู่ใกล้กับฐานข้อมูลมากขึ้นมักจะเป็นศูนย์กลางของตาราง


DAO ยังสามารถแสดงคอลเล็กชัน / วัตถุ ...
Yousha Aleayoub

0

ในเฟรมเวิร์กสปริงมีคำอธิบายประกอบที่เรียกว่าที่เก็บและในคำอธิบายของคำอธิบายประกอบนี้มีข้อมูลที่เป็นประโยชน์เกี่ยวกับที่เก็บซึ่งฉันคิดว่ามันมีประโยชน์สำหรับการสนทนานี้

บ่งชี้ว่าคลาสที่ทำหมายเหตุประกอบไว้เป็น "Repository" ซึ่ง แต่เดิมกำหนดโดย Domain-Driven Design (Evans, 2003) เป็น "กลไกสำหรับการห่อหุ้มหน่วยความจำการดึงและพฤติกรรมการค้นหาซึ่งจำลองชุดของวัตถุ"

ทีมที่ใช้รูปแบบ Java EE แบบดั้งเดิมเช่น "Data Access Object" อาจนำไปใช้กับคลาส DAO ได้เช่นกัน แต่ควรระมัดระวังในการทำความเข้าใจความแตกต่างระหว่าง Data Access Object และที่เก็บแบบ DDD ก่อนที่จะทำเช่นนั้น คำอธิบายประกอบนี้เป็นกฎตายตัวทั่วไปและแต่ละทีมอาจ จำกัด ความหมายและใช้ตามความเหมาะสม

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

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