将log方法添加到每个setter

时间:2011-08-08 16:38:44

标签: c# .net design-patterns architecture entity-framework-4

我有5个使用实体框架加载的实体。他们来了: enter image description here
所有实体都继承自: enter image description here

(每个实体由具有上述属性的类表示.Al实体继承传输实体) 如您所见,某些实体中存在共同属性。但是属性WorkerId,WorkerPersonalId,VehicleId,VehicleNumber,SubcontractorId都有SET的特殊方法,所以为了封装更新的逻辑我创建了WorkerVehicleTransmission类与那些属性setter实现。现在每个传输都使用WorkerVehicleTransmission 现在我有了新的需求。我需要记录每个属性更改。为此,我有Log()方法。对于eaxmple,我需要当用户进行cargoStorage.Weight=8;时,将调用Log()来记录此更改。

重要问题:我需要找到一个解决方案,其中实体的创建(例如实体框架)不会记录。

如何整合新需求?

这个问题是我在这里问的例子的真正需要:how to solve this code duplication + add another method

1 个答案:

答案 0 :(得分:0)

首先,您可以将一个处理程序附加到Transmission基类中的PropertyChanged事件,这使您可以在任何子类中的属性发生更改时调用Log方法。

INotifyPropertyChanged.PropertyChanged Event

然而,当进行任何更改时,包括实体框架创建对象的时间,这将触发,因此只有一半。


修改

如果在Transmission类(布尔标志)中创建新属性,则可以在数据访问对象例程中使用它来设置是否应启用日志记录。

此标志仅在每个对象上的任何Entity Framework活动完成后设置,因此记录的唯一属性更改是与您的代码相关的属性。

不是一个优雅的解决方案,但我看不到任何其他方式。


修改

刚看了一下EntityObject基本成员,还有一个名为EntityState的属性(枚举)。

EntityObject.EntityState Property

当实体框架创建实体(未附加到对象上下文)并将其值更改为“已添加”,“已删除”,“已修改”或“未更改”后,此属性将设置为“已分离”被添加(取决于对象的状态)。

通过检查该值是否为“已分离”以外的任何值,您可以确定是否应启用日志记录。