使用PoEAA将消息和日志事件放置在何处


Where to place message and log events using PoEAA

目前,我有一个这样的结构:

Domain Model <---> Data Mapper ---> Database

假设我将一个子"文件"对象添加到"项目"对象中。我想自动为该项目创建一个表示更新的子"注释"对象。现在,这个注释的创建由"项目文件映射器"处理——在"uploadFile"方法中,一个新注释被实例化和填充,并调用"注释映射器"来保存该注释。当被要求提供其子注释时,项目会调用注释映射器,依此类推。

或者说我删除了一个"project"对象——我也想删除子注释和文件,所以在"projectMapper"方法"deleteProject"中,会调用"projectNoteMapper"answers"projectFileMapper"来处理删除这些文件的操作。

我现在开始遇到其他例子,尤其是在实现私人消息系统之后。我希望用户能够订阅项目和门票,并接收有关更新的消息。我还想实现用户操作的深度日志记录(包括存储用于制表的序列化对象)

我知道我做事的方式不符合"单一责任原则"——毕竟,映射器的目的应该只是在数据源和它们各自的对象之间映射信息,对吧?我的问题是——我应该实现的下一个"层"是什么,我缺少什么?我读过关于"存储库"answers"服务"的文章。

如果我理解你的问题,那么我想可能会帮助你解决它:

DataMapper不是数据库中单个表的表示形式,也不对应于该表。

在项目的情况下,$projectMapper->remove( $project )不仅要删除项目本身,还要删除DB中所有相关的项,这将非常有意义。DataMapper进行多个查询并没有错。您只需要实现错误报告的附带设置,就可以知道何时/是否出现了问题。

是的,这在某些方面也违反了SRP(但前提是您将DB中的每个更改视为修改DataMapper类的单独原因)。

至于进化模型层的下一个逻辑步骤是什么:你会发现这个PoEEE条目是相关的。请记住,Service layer不仅仅是DataMapper和域对象之上的API。它还包含服务,这些服务在某种程度上独立于模块的其余部分。类似邮件发件人和身份验证。

此外,为了澄清这一点:

模型不是一个类,而是一个层,它包含域对象[1]<[2]>和数据映射器。