พื้นที่เก็บข้อมูลจำเป็นต้องใช้อีกต่อไปใน ASP.net 5 และ EF7 หรือไม่


9

ฉันโพสต์คำถามเกี่ยวกับ GitHub ให้กับทีม EF ฉันได้รับคำตอบว่าจะเป็นการดีกว่าถ้าถามคำถามนี้ที่นี่ดังนั้นฉันจะคัดลอกและวางไว้ที่นี่เนื่องจากเราเป็นลิงก์เพื่อให้คนอื่นเห็นการตอบกลับใน GitHub ไม่กี่ครั้ง

คำถาม: ฉันกำลังทำการวิจัยและมีคนชี้ให้เห็นว่า Line 24 ของ DBContext Class กล่าว

DbContext เป็นการรวมกันของรูปแบบของหน่วยงานและที่เก็บข้อมูล

นี่หมายความว่าเราไม่จำเป็นต้องแยก EF ออกจากพื้นที่เก็บข้อมูลแล้วใช้และส่วนต่อประสานเพื่อแทรกเข้าไปในคอนโทรลเลอร์

โพสต์ต้นฉบับบน Github: https://github.com/aspnet/EntityFramework/issues/4899

เหตุผลที่ฉันถามนี่คือฉันดูเหมือนจะเข้าไปในจุดที่ฉันเพิ่มวิธีการมากมายในพื้นที่เก็บข้อมูลเช่น GetById, GetByName, GetWithIncludesABC, GetWithIncludes123 ฯลฯ และดูเหมือนจะทำให้ repo สกปรกในใจ


1
คุณคิดอย่างไรกับคำตอบที่ rowanmiller ให้ ดูเหมือนว่าเหมาะสมกับฉันอย่างสมบูรณ์
Robert Harvey

@RobertHarvey ใช่มันเป็นคำตอบที่ดี แต่ฉันต้องการที่จะดูว่าคนอื่น ๆ รู้สึกอย่างไรเกี่ยวกับหัวข้อก่อนที่ฉันจะตัดสินใจที่จะเก็บข้อมูลหรือไม่
Loren.Dorez

โปรดดูที่lostechies.com/jimmybogard/2009/09/11/wither-the-repositoryที่ Bogard โต้แย้งในทำนองเดียวกัน
mcknz

ใช้เวลาของฉันเกี่ยวกับเหตุผลที่ EF (และ ORMs อื่น ๆ ) ไม่ได้เก็บ
Eric King

พื้นที่เก็บข้อมูลจะไม่มีวิธีเช่น GetWithIncludesABC รูปแบบพื้นที่เก็บข้อมูลเป็นนามธรรมโดยทั่วไปตารางฐานข้อมูลเป็นคอลเลกชัน โดยทั่วไปแล้วเป็นไปได้ที่จะสืบค้นการรวบรวม (เช่นโดย LINQ) และที่เก็บจะแปลงแบบสอบถามเป็น SQL สิ่งที่คุณกำลังพูดถึงฟังดูคล้ายกับ Data Gateway มากกว่า
Mr Cochese

คำตอบ:


12

หากคุณกำลังเพิ่มวิธีการในพื้นที่เก็บข้อมูลเช่น

GetById 
GetByName 
GetWithIncludesABC
GetWithIncludes123

ถ้าอย่างนั้นคุณก็ควรย้ายไปที่Service Layerและปล่อยให้ Service Layer ใช้ EF โดยตรง EF มีฟังก์ชั่นการใช้งานคล้ายกับวิธีการด้านบน

Service Layer จะเปิดเผยเมธอดของ Domain Business และใช้CRUDเพื่อนำไปใช้งาน ตัวอย่างเช่นคุณอาจมีวิธีการที่เรียกว่าTransferMoney(A, B)โดยที่ A และ B กำลังตรวจสอบบัญชี สิ่งนี้ช่วยให้คุณสามารถพูดภาษาของโดเมนธุรกิจของคุณได้ในขณะที่ Service Layer จัดการ CRUD ให้คุณ

เหตุผลที่น่าสนใจเพียงอย่างเดียวที่ฉันคิดว่าคุณอาจต้องการที่จะมี Repository Layer แยกต่างหากคือเพื่อให้คุณสามารถจำลองเลเยอร์พื้นที่เก็บข้อมูลนั้นหรือแทนที่แหล่งข้อมูลอื่นเพื่อการทดสอบ


อย่างไรก็ตามคุณสามารถเยาะเย้ย dbset ... msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
S1r-Lanzelot

4

Robert Harvey กล่าวในคำตอบของเขา:

เหตุผลที่น่าสนใจเพียงอย่างเดียวที่ฉันคิดว่าคุณอาจต้องการที่จะมี Repository Layer แยกต่างหากคือเพื่อให้คุณสามารถจำลองเลเยอร์พื้นที่เก็บข้อมูลนั้นหรือแทนที่แหล่งข้อมูลอื่นเพื่อการทดสอบ

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

ถ้าคุณใช้ EF query API นอก "repository" เช่นเดียวกับใน object service ของบางประเภทฉันจะบอกว่าคุณทำลายรูปแบบ

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

โดยทั่วไป Entity Framework เกิดขึ้นแทนที่วัตถุ Gatewayในรูปแบบที่เก็บ ฉันไม่คิดว่ามันเป็นที่เก็บข้อมูล


พื้นที่เก็บข้อมูลแตกต่างจากมุมมองเลเยอร์บริการอย่างไร จากสิ่งที่ฉันสามารถค้นหาถ้าฉันกลับ IQueryable แล้วฉันเป็นหลัก Repository ถ้าฉันกลับ IEnumerable แล้ว im ใช้ชั้นบริการ ถูกต้องหรือไม่ เลเยอร์บริการและรูปแบบพื้นที่เก็บข้อมูลคล้ายกันหรือไม่
Loren.Dorez

@ Loren.Dorez: บริการชั้นมีวิธีการธุรกิจโดเมนเฉพาะเช่นและTransferFunds() BuildWidget()พื้นที่เก็บข้อมูลมีวิธีการ CRUD
Robert Harvey

ดังนั้นทั้งชั้นบริการและพื้นที่เก็บข้อมูลจะเข้าถึง DBContext โดยตรงหรือไม่ ดังนั้นคุณจะใส่ CRUD ใน Repo และ Get Method และวิธีอื่น ๆ ใน Service Layer หรือไม่ ฉันเข้าใจเรื่องนี้ถูกต้องไหม?
Loren.Dorez

Service Layer อาจเข้าถึงที่เก็บถ้าคุณมีหนึ่งแทนที่ EF โดยตรง
Robert Harvey

@RobertHarvey คุณสามารถแสดงตัวอย่างให้ฉันโดยใช้ Get Methds ด้านบนได้ไหม เหมือนตอนนี้ฉันสับสนเล็กน้อย
Loren.Dorez

1

ดูเหมือนว่าที่เก็บข้อมูลไม่จำเป็น - Microsoft ในแอปพลิเคชัน microservices แบ็กเอนด์ตัวอย่างไม่ได้ใช้

https://github.com/Microsoft/BikeSharing360_BackendServices

แอป BikeSharing ตัวอย่างถูกแสดงบน Connect (); เหตุการณ์ (ฉันคิดว่ามันสามารถใช้เป็นแม่แบบสำหรับโครงการ API):

https://blogs.msdn.microsoft.com/visualstudio/2016/12/14/connectdemos-2016-bikesharing360-on-github/

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