3

我有两个班A和B。

我将 B 注入 A ( Dependency Injection)。

现在我想了解 B 类中的属性何时发生变化。

在不违反原则和模式的情况下,最好的做法是什么?

我要使用EventHandlers吗?

4

2 回答 2

3

最常见的方式是实现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);
于 2013-06-08T17:22:01.153 回答
0

我认为使用 INotifyPropertyChanged 接口是一种便于 UI 编程(wpf-MVVM)的事件处理,以这种方式使用事件处理违反了两个原则:

1)简单性。如果你有很多类,你的代码会在一段时间后成为事件的spageti。

2)conserns分离,事件操作的职责可以分配给另一个特定的类。

如果你关心原则,你最好看看观察者模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会得到通知和自动更新。

另外,如果你有很多依赖对象,我的建议是你最好给我们一个IOC 容器(例如:spring.net 或 prism,...)来进行依赖注入,因此,你当然可以利用容器的解决方案,例如在 Prism 中,您可以从 EventAggregator 中受益,或者 spring.net 有一个 xml 基础事件聚合器

于 2013-06-08T19:09:12.823 回答