Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让parents类了解注入类中的更改_C#_Design Patterns_Dependency Injection - Fatal编程技术网

C# 如何让parents类了解注入类中的更改

C# 如何让parents类了解注入类中的更改,c#,design-patterns,dependency-injection,C#,Design Patterns,Dependency Injection,我有两个班A和B 我将B注入A(依赖项注入) 现在我想了解B类中的属性何时发生了变化 在不违反原则和模式的情况下,这样做的最佳实践是什么 我应该使用事件处理程序吗?最常用的方法是实现 接口定义了一个成员: event PropertyChangedEventHandler PropertyChanged 这样使用: if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop

我有两个班A和B

我将B注入A(
依赖项注入

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

在不违反原则和模式的情况下,这样做的最佳实践是什么


我应该使用
事件处理程序吗?

最常用的方法是实现

接口定义了一个成员:

event PropertyChangedEventHandler PropertyChanged
这样使用:

if (PropertyChanged != null)
{
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
如果使用.Net 4.5,则可以使用,因此不必手动(或通过其他方式)指定属性的名称:

以上代码的源代码是我链接到的文档

如果使用.Net 4.0或更早版本,仍然可以使用强类型属性名,而不是手动键入字符串,但需要实现一个方法,然后可以使用表达式调用它:

OnPropertyChanged(() => this.SomeProperty);

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

1) 简单性。如果你有很多类,那么你的代码在一段时间后就会变成一堆事件

2) 将conserns分离,事件操纵的职责可以分配给另一个specefic类

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


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

我不认为“依赖注入”是描述您所说内容的正确术语。您是否询问策略模式?我不认为依赖注入可用于有状态对象。尽管有时需要,但通常状态对象是作为变量传递的,而不是注入的。请参考此问题了解更多信息。谢谢。PropertyChangedEventHandler应在A类或B类中定义?第二个问题是,是否完全违反了原则?类B应该实现INotifyPropertyChanged接口(从而实现PropertyChanged事件)。类A应该附加到类B公开的PropertyChanged事件。一般来说,这个想法是好的。然而,我强烈反对在代码中使用INotifyPropertyChanged。该界面属于“视图模型”层。在“模型”层中,您应该将您的事件命名为更具体的事件,即SomethingSpecificOccessed。这样做的原因是该接口用于特定目的:在运行时成员发现时进行数据绑定。“只有”一个属性发生了变化。模型中的更改(语义上)远比属性更改重要。属性更改只是一个结果…@dzendras:“该接口属于‘视图模型’层”和“该接口用于特定目的:数据绑定”:不,它不是,它只是一个可以在适当的地方使用的接口(但数据绑定到视图模型确实是一个非常常见的用例)。“模型中的更改(语义上)远比属性更改重要。”:这并不意味着您不应该使用INotifyPropertyChanged。(但是,在某些情况下,自定义接口或不同的模式更可取。例如,如果需要“Property ies Changed”事件)。你是对的,但我坚持认为在模型层中使用InotifyProperty Changed会使代码膨胀。假设一个应用程序的结构不是“仅仅”那样:UI->ViewModel/Controller->Business Logic->Repository/WCF。相反,该模型包含状态,由多个服务(可能使用线程)组成,并用INPC替换有意义的事件。想象一下客户端代码看起来有多糟糕。如果propertyName==“Foo”DoSth();如果propertyName==“Bar”dothelse(),则为else;等等。太糟糕了。我一点也不同意。并没有说A是将B视为普通B还是将B视为接口。如果存在接口,则第一点无效。如果不是观察者模式的特定实现,那么.NET中的事件是什么?你对这件事的判断太严厉了。然而,你的动机是好的,你的建议听起来也不错。是的,我同意你的看法。谢谢,我改了。复杂性呢?我认为,在流行的fraworks中,事件处理的解决方案的存在是为了减少它的缺点
OnPropertyChanged(() => this.SomeProperty);