何时更新审计字段?DDD

use*_*767 6 domain-driven-design auditing aggregateroot

我有一个会议对象:

Meeting{id, name, time, CreatedBy, UpdatedBy}

和a

MeetingAssignee{id, MeetingID, EmployeeId, CreatedBy, UpdatedBy)

Meeting,作为Aggregate root,有一个方法AssignEmployee.

当我调用AssignEmployee时,我正要将当前用户传递给Meeting对象,以便它可以相应地更新其审计字段.

但这似乎不对 - 是吗?显然,我可以公开审计字段并在以后更改它们 - 也许是在服务级别?

什么是每个人更新这些字段的首选方法?

请注意:我们没有使用Nhibernate,而是一个自定义的ORM,没有任何自动化的东西.

谢谢.

Aug*_*sto 5

审计和日志记录很有趣,因为它们通常在应用程序的任何地方都需要,而且它们都是要求(日志记录OP 人员的要求)。

在不了解您的模型的情况下,并且由于审计必须是一项要求,我会将当前用户传递给AssignEmployee,而不是在那里写一行AuditBlahBlahBlah,我会添加一个事件(可能是 MeetingUpdated 或 AssigneeAdded ......你会发现一个好名字)并且该事件被分派到进行审计的类。通过这种方式,Meeting 类对审计一无所知,并且出于审计目的而调度业务事件(在我看来,这是非常 DDD 式的)。

我想知道其他人会怎么说(希望我能学到新东西!)


Arn*_*psa 5

考虑使用领域事件。

域模型中所有有趣的事情都应该引发一个事件,大声喊出刚刚发生的事情。从外部,只需附加将它们转储到数据库或其他地方的日志处理程序。

这样 - 你不需要用某种 IAuditService 来弄乱你的域。

更好的是 - 域模型可以使用事件作为一种在自身内部进行通信的方式。
为了说明为什么这是一个好主意 - 想象一下我们正在描述早晨、日出和鲜花的域模型。

告诉所有的花应该开放是太阳的责任吗?并不真地。太阳只需要足够明亮(以引发事件),光必须传播到地球(必须有某种基础设施使事件成为可能),花朵必须在接收光时做出反应(其他领域模型应该处理事件)。

另一个类比 - 驾驶员有责任查看交通灯的颜色。