2012-03-22 81 views
0

记录事件目前,我有这样的结构:放置位置信息,并使用POEAA

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

说我加一个孩子“文件”对象的“项目”对象。我想为该项目自动创建一个表示更新的子注释对象。现在,这个注释的创建由'项目文件映射器'处理 - 在'uploadFile'方法中,新的注释被实例化和填充,并且调用“注释映射器”来保存该注释。该项目在询问其子女笔记时调用笔记映射器,以此类推文件。

或者说我删除了一个'project'对象 - 我想删除子注释和文件,所以在'projectProperty'方法'deleteProject'中,调用'projectNoteMapper'和'projectFileMapper '来处理删除这些文件。

我现在开始遇到其他情况,特别是自实施私人消息系统以来。我希望用户能够订阅项目和票据并接收有关更新的消息。我也想要实现用户行为的深层日志记录(包括存储序列化对象以用于制表)。

我明白我一直在做事情的方式不符合“单一责任原则” - 毕竟,映射器的目的只应该是在数据源和它们各自的对象之间映射信息,对吗?我的问题是 - 我应该实施的下一个'图层'是什么,我错过了什么?我已经阅读了“仓库”和“服务”。

回答

0

如果我明白你的问题,那么我认为可能会辅助性T清晰起来:

DataMappers都没有代表性,也没有对应的单表数据库。

在你的案例中,对于$projectMapper->remove($project)来说,删除不仅仅是项目本身,而是DB中的所有相关项目都会有很大的意义。 DataMapper制作多个查询没有任何问题。您只需执行随附的错误报告设置,即可知道何时出现问题。

是的,这在某些方面也违反了SRP(但仅当您将数据库中的每个更改视为修改DataMapper类的单独原因时)。

至于哪一个是发展模型层的下一个逻辑步骤:你会发现这个PoEEE entry相关。只需要保留Service layer不仅仅是顶级DataMapper和Domain Object上的API。它还包含服务,这与模块的其余部分有些独立。像邮件发件人和身份验证一样。

另外,为了清除该向上:

模型是不是一类的,但一个层,其中包含两个域对象[1][2]和DataMappers。

+0

感谢您的回复。 当谈到项目和项目文件的映射器时,每个都使用多个“资源” - 即多个表,或者在项目文件,系统目录以及数据库表的情况下。出于这个原因(两个对象之间的显着差异),我觉得他们都应该拥有自己的映射器。然后,这个问题正在协调... ...和您发布的链接(我也有这本书)似乎服务层就是这样。发布这个问题之后,我已经开始实施这个模式,并且这很好。谢谢 – tuespetre 2012-03-25 15:54:04