我有两个班A和B。
我将 B 注入 A ( Dependency Injection
)。
现在我想了解 B 类中的属性何时发生变化。
在不违反原则和模式的情况下,最好的做法是什么?
我要使用EventHandlers
吗?
我有两个班A和B。
我将 B 注入 A ( Dependency Injection
)。
现在我想了解 B 类中的属性何时发生变化。
在不违反原则和模式的情况下,最好的做法是什么?
我要使用EventHandlers
吗?
最常见的方式是实现INotifyPropertyChanged 接口
该接口定义了一个成员:
event PropertyChangedEventHandler PropertyChanged
像这样使用:
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
如果您使用 .Net 4.5,则可以使用CallerMemberNameAttribute,因此您不必手动(或通过其他方式)指定属性名称:
// This method is called by the Set accessor of each property.
// The CallerMemberName attribute that is applied to the optional propertyName
// parameter causes the property name of the caller to be substituted as an argument.
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
上述代码的来源是我链接到的文档。
如果您使用.Net 4.0或更早版本,您仍然可以使用强类型属性名称而不是手动输入字符串,但是您需要实现这样的方法,然后您可以使用表达式调用它:
OnPropertyChanged(() => this.SomeProperty);
我认为使用 INotifyPropertyChanged 接口是一种便于 UI 编程(wpf-MVVM)的事件处理,以这种方式使用事件处理违反了两个原则:
1)简单性。如果你有很多类,你的代码会在一段时间后成为事件的spageti。
2)conserns分离,事件操作的职责可以分配给另一个特定的类。
如果你关心原则,你最好看看观察者模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会得到通知和自动更新。
另外,如果你有很多依赖对象,我的建议是你最好给我们一个IOC 容器(例如:spring.net 或 prism,...)来进行依赖注入,因此,你当然可以利用容器的解决方案,例如在 Prism 中,您可以从 EventAggregator 中受益,或者 spring.net 有一个 xml 基础事件聚合器