พื้นหลัง:
ฉันกำลังออกแบบแอปพลิเคชันเซิร์ฟเวอร์และสร้าง dll แยกต่างหากสำหรับระบบย่อยที่แตกต่างกัน เพื่อให้สิ่งต่าง ๆ ง่ายขึ้นสมมติว่าฉันมีระบบย่อยสองระบบ: 1) Users
2)Projects
ส่วนต่อประสานสาธารณะของผู้ใช้มีวิธีการดังนี้:
IEnumerable<User> GetUser(int id);
และส่วนต่อประสานสาธารณะของโครงการมีวิธีการดังนี้:
IEnumerable<User> GetProjectUsers(int projectId);
ตัวอย่างเช่นเมื่อเราต้องการแสดงผู้ใช้สำหรับโครงการบางอย่างเราสามารถเรียกGetProjectUsers
และจะให้วัตถุกลับมาพร้อมข้อมูลที่เพียงพอที่จะแสดงใน DataGrid หรือคล้ายกัน
ปัญหา:
ตามหลักแล้วProjects
ระบบย่อยไม่ควรเก็บข้อมูลผู้ใช้และควรเก็บรหัสผู้ใช้ที่เข้าร่วมในโครงการ ในการให้บริการGetProjectUsers
จำเป็นต้องมีการเรียกGetUser
ใช้Users
ระบบสำหรับแต่ละ id ผู้ใช้ที่เก็บไว้ในฐานข้อมูลของตัวเอง อย่างไรก็ตามสิ่งนี้ต้องการการGetUser
เรียกที่แยกจากกันจำนวนมากทำให้เกิดคิวรี่ SQL แยกต่างหากมากมายภายในUser
ระบบย่อย ฉันไม่ได้ทดสอบสิ่งนี้จริงๆ แต่การมีการออกแบบช่างพูดนี้จะส่งผลกระทบต่อความสามารถในการขยายระบบ
ถ้าฉันแยกระบบย่อยออกจากกันฉันสามารถเก็บข้อมูลทั้งหมดไว้ใน schema เดียวที่สามารถเข้าถึงได้โดยทั้งสองระบบและProjects
สามารถทำได้เพียงJOIN
เพื่อให้ผู้ใช้โครงการทั้งหมดได้รับแบบสอบถามเดียว Projects
จะต้องรู้วิธีการสร้างUser
วัตถุจากผลการสืบค้นด้วย แต่นี่เป็นการแยกการแยกซึ่งมีข้อดีหลายประการ
คำถาม:
ทุกคนสามารถแนะนำวิธีการแยกออกจากกันในขณะที่หลีกเลี่ยงการGetUser
โทรบุคคลเหล่านี้ในระหว่างGetProjectUsers
หรือไม่
ตัวอย่างเช่นสิ่งหนึ่งที่ฉันคิดว่าเป็นสำหรับผู้ใช้ในการให้ความสามารถแก่ระบบภายนอกในการ "แท็ก" ผู้ใช้ที่มีคู่ค่าป้ายกำกับและเพื่อขอผู้ใช้ด้วยค่าที่แน่นอนเช่น:
void AddUserTag(int userId, string tag, string value);
IEnumerable<User> GetUsersByTag(string tag, string value);
จากนั้นระบบโปรเจ็กต์สามารถแท็กผู้ใช้แต่ละรายเมื่อพวกเขาถูกเพิ่มในโครงการ:
AddUserTag(userId,"project id", myProjectId.ToString());
และในระหว่าง GetProjectUsers มันสามารถร้องขอผู้ใช้โครงการทั้งหมดในการโทรครั้งเดียว:
var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString());
ส่วนที่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้คือ: ใช่ผู้ใช้ไม่เชื่อเรื่องโครงการ แต่จริงๆแล้วข้อมูลเกี่ยวกับการเป็นสมาชิกโครงการจะถูกเก็บไว้ในระบบผู้ใช้ไม่ใช่โครงการ ฉันไม่รู้สึกเป็นธรรมชาติดังนั้นฉันจึงพยายามตรวจสอบว่ามีข้อเสียอย่างใหญ่หลวงที่ฉันพลาดไปหรือไม่