สมมติว่าฉันมีเอนทิตีต่าง ๆ ในแบบจำลองของฉัน (โดยใช้ EF), พูดว่าผู้ใช้ผลิตภัณฑ์ใบแจ้งหนี้และใบสั่ง
ฉันกำลังเขียนตัวควบคุมผู้ใช้ที่สามารถพิมพ์บทสรุปของเอนทิตีวัตถุในแอปพลิเคชันของฉันซึ่งเป็นรายการที่กำหนดไว้ล่วงหน้าในกรณีนี้ฉันบอกว่าสรุปของผู้ใช้และผลิตภัณฑ์สามารถสรุปได้
บทสรุปจะมีเพียง ID และคำอธิบายเท่านั้นดังนั้นฉันจึงสร้างอินเทอร์เฟซอย่างง่ายสำหรับสิ่งนี้:
public interface ISummarizableEntity {
public string ID { get; }
public string Description { get; }
}
จากนั้นสำหรับเอนทิตีที่มีปัญหาฉันสร้างคลาสบางส่วนที่ใช้อินเทอร์เฟซนี้:
public partial class User : ISummarizableEntity
{
public string ID
{
get{ return UserID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} {1} is from {2} and is {3} years old", FirstName, LastName, Country, Age); }
}
}
public partial class Product: ISummarizableEntity
{
public string ID
{
get{ return ProductID.ToString(); }
}
public string Description
{
get{ return String.Format("{0} weighs {1}{2} and belongs in the {3} department", ProductName, WeightValue, WeightUnit, Department); }
}
}
วิธีนี้ทำให้การควบคุมผู้ใช้ / มุมมองบางส่วนของฉันสามารถผูกกับคอลเลกชันของ ISummarizableEntity ใด ๆ และไม่จำเป็นต้องสนใจแหล่งข้อมูลเลย ฉันได้รับแจ้งว่าไม่ควรใช้อินเทอร์เฟซเป็นประเภทข้อมูล แต่ฉันไม่ได้รับข้อมูลมากไปกว่านั้น เท่าที่ฉันเห็นแม้ว่าอินเตอร์เฟสโดยปกติจะอธิบายพฤติกรรม แต่การใช้คุณสมบัติไม่ใช่รูปแบบการต่อต้านในตัวเองเนื่องจากคุณสมบัตินั้นเป็นเพียงน้ำตาล syntactic สำหรับผู้ได้รับ / setters อย่างไรก็ตาม
ฉันสามารถสร้างประเภทข้อมูลและแผนที่ที่เป็นรูปธรรมจากเอนทิตีไปยังสิ่งนั้น แต่ฉันไม่เห็นประโยชน์ ฉันสามารถทำให้เอนทิตีวัตถุสืบทอดมาจากคลาสนามธรรมและจากนั้นกำหนดคุณสมบัติ แต่จากนั้นฉันล็อกเอนทิตีเพื่อไม่ใช้เพิ่มเติมเนื่องจากเราไม่สามารถรับมรดกได้หลายอย่าง ฉันยังเปิดให้มีวัตถุใด ๆ ที่เป็น ISummarizableEntity ถ้าฉันต้องการ (เห็นได้ชัดว่าฉันจะเปลี่ยนชื่ออินเตอร์เฟซ)
วิธีการแก้ปัญหาที่ฉันใช้ในใจของฉันคือบำรุงรักษาขยายได้ทดสอบและมีประสิทธิภาพพอสมควร คุณเห็นรูปแบบการต่อต้านที่นี่ได้ไหม?
EntitySummary
กันโดยที่User
และProduct
แต่ละวิธีมีวิธีเช่นpublic EntitySummary GetSummary()
?