ในแอปพลิเคชันของฉันฉันได้แยกสิ่งต่าง ๆ ออกเสมอโดยมีโมเดลที่แตกต่างกันสำหรับฐานข้อมูล (Entity Framework) และ MVC ฉันได้แยกสิ่งเหล่านี้ออกเป็นโครงการต่าง ๆ เช่นกัน:
- Example.Entities - มีเอนทิตีของฉันสำหรับ EF และบริบท DB สำหรับเข้าถึงพวกเขา
- Example.Models - มีรุ่น MVC
- ตัวอย่างเว็บ - โปรแกรมประยุกต์บนเว็บ ขึ้นอยู่กับทั้งสองโดเมนและตัวอย่าง
แทนที่จะถือการอ้างอิงไปยังวัตถุอื่น ๆ เช่นเอนทิตีโดเมนทำรุ่น MVC เก็บ ID เป็นจำนวนเต็ม
เมื่อมีการร้องขอ GET สำหรับเพจตัวควบคุม MVC จะดำเนินการค้นหาฐานข้อมูลซึ่งส่งคืนเอนทิตี ฉันได้เขียนวิธี "ตัวแปลง" ที่ใช้เอนทิตีโดเมนและแปลงเป็นรูปแบบ MVC มีวิธีการอื่น ๆ ที่ทำตรงกันข้าม (จากรูปแบบ MVC ไปยังเอนทิตีโดเมน) โมเดลจะถูกส่งผ่านไปยังมุมมองและทำให้กับไคลเอ็นต์
เมื่อมีคำขอ POST เข้ามาคอนโทรลเลอร์ MVC จะได้รับรุ่น MVC เมธอดตัวแปลงแปลงสิ่งนี้เป็นเอนทิตีโดเมน วิธีนี้ยังทำการตรวจสอบความถูกต้องใด ๆ ที่ไม่สามารถแสดงเป็นคุณลักษณะได้และตรวจสอบให้แน่ใจว่าหากนิติบุคคลมีอยู่แล้วว่าเรากำลังอัปเดตมากกว่าที่จะได้รับสิ่งใหม่ วิธีการมักจะมีลักษณะเช่นนี้:
public class PersonConverter
{
public MyDatabaseContext _db;
public PersonEntity Convert(PersonModel source)
{
PersonEntity destination = _db.People.Find(source.ID);
if(destination == null)
destination = new PersonEntity();
destination.Name = source.Name;
destination.Organisation = _db.Organisations.Find(source.OrganisationID);
//etc
return destination;
}
public PersonModel Convert(PersonEntity source)
{
PersonModel destination = new PersonModel()
{
Name = source.Name,
OrganisationID = source.Organisation.ID,
//etc
};
return destination;
}
}
ด้วยการใช้วิธีการเหล่านี้ฉันจะลบความซ้ำซ้อนที่อาจเกิดขึ้นในแต่ละคอนโทรลเลอร์ การใช้ยาชื่อสามัญสามารถขจัดสิ่งซ้ำซ้อนได้อีก
การทำสิ่งต่าง ๆ ด้วยวิธีนี้มีประโยชน์หลายประการ:
- คุณสามารถปรับแต่งแบบจำลองเพื่อมุมมองหรือการกระทำที่เฉพาะเจาะจง สมมติว่าคุณมีแบบฟอร์มการลงทะเบียนสำหรับบุคคลที่เมื่อส่งให้สร้างเอนทิตีที่แตกต่างกันมากมาย (บุคคลองค์กรที่อยู่) หากไม่มีรุ่น MVC แยกกันจะเป็นเรื่องยากมาก
- ถ้าฉันต้องการส่งผ่านข้อมูลเพิ่มเติมไปยังมุมมองมากกว่าที่จะมีให้ในเอนทิตี้หรือรวมสองเอนทิตี้เข้าไว้ในโมเดลเดียวโมเดลฐานข้อมูลอันมีค่าของฉันจะไม่แตะต้องเลย
- หากคุณเป็นอนุกรมรุ่น MVC เป็น JSON หรือ XML คุณจะได้รับรูปแบบทันทีที่ถูกทำให้เป็นอนุกรมไม่ใช่เอนทิตีอื่น ๆ ทุกตัวที่เชื่อมโยงกับโมเดลนี้