我认为这完全取决于用例。
当您拥有带有大量属性的简单模型时,可以实现INPC。简单地说,我的意思是该模型看起来很像POCO。
如果您的模型更复杂并且生活在交互式模型域中-模型引用模型,订阅其他模型的事件-将模型事件实现为INPC就是一场噩梦。
使自己处于一些必须与其他模型进行协作的模型实体的位置。您有各种活动要订阅。所有这些都实现为INPC。想象一下您拥有的那些事件处理程序。大量的if子句和/或switch子句。
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属性的值可能会更改”。