ฉันคิดว่ามันทั้งหมดขึ้นอยู่กับกรณีการใช้งาน
เมื่อคุณมีโมเดลที่เรียบง่ายพร้อมคุณสมบัติมากมายคุณสามารถให้มันใช้งาน INPC ได้ โดยง่ายผมหมายถึงว่ารุ่นนี้มีลักษณะค่อนข้างเหมือนPOCO
หากโมเดลของคุณซับซ้อนและอยู่ในโดเมนโมเดลอินเทอร์แอคทีฟ - โมเดลอ้างอิงโมเดลการสมัครกิจกรรมของโมเดลอื่น - การใช้โมเดลเหตุการณ์ดำเนินการเนื่องจาก INPC เป็นฝันร้าย
ร่วมงานกับคุณในตำแหน่งของเอนทิตี้ของโมเดลที่ต้องร่วมมือกับโมเดลอื่น คุณมีกิจกรรมต่าง ๆ เพื่อสมัครสมาชิก ทั้งหมดถูกนำมาใช้เป็น INPC ลองนึกภาพตัวจัดการเหตุการณ์เหล่านั้นที่คุณมี น้ำตกขนาดใหญ่หนึ่งแห่งถ้าคำสั่งและ / หรือสลับ clausses
ปัญหาอื่นกับ INPC คุณควรออกแบบแอพของคุณให้เป็นนามธรรม โดยทั่วไปจะใช้อินเทอร์เฟซ
ลองมาดูการใช้งาน 2 อย่างที่แตกต่างกันของสิ่งที่เป็นนามธรรม:
public class ConnectionStateChangedEventArgs : EventArgs
{
public bool IsConnected {get;set;}
}
interface IConnectionManagerINPC : INotifyPropertyChanged
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
bool IsConnected {get;}
}
interface IConnectionManager
{
string Name {get;}
int ConnectionsLimit {get;}
/*
A few more properties
*/
event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
bool IsConnected {get;}
}
ตอนนี้ดูทั้งคู่ IConnectionManagerINPC บอกอะไรคุณ คุณสมบัติบางอย่างอาจมีการเปลี่ยนแปลง คุณไม่รู้ว่าใครในพวกเขา ในความเป็นจริงการออกแบบคือการเปลี่ยนแปลง IsConnected เท่านั้นเนื่องจากส่วนที่เหลือเป็นแบบอ่านอย่างเดียว
ในทางตรงกันข้ามความตั้งใจของ IConnectionManager นั้นชัดเจน: "ฉันสามารถบอกคุณได้ว่ามูลค่าของทรัพย์สิน IsConnected ของฉันอาจมีการเปลี่ยนแปลง"