也许这是一个带有微不足道的答案的问题但是它让我疯了几天,所以我想听听答案。我最近查找了很多与为我自己的项目构建自定义数据映射器(而不是使用ORM)相关的信息,并在stackoverflow或其他网站上读取了几个线程。
对我来说,拥有AuthorCollection
个对象似乎非常有说服力,这些对象基本上只是Author
个实例或BookCollection
个对象的容器,它们包含多个Book
个实例。但为什么需要单个Author
对象的映射器?我能想到的所有获取标准(除了要求具有指定BookID
或AuthorID
的对象的标准)将返回多个Book
或Author
个实例,因此{{1} }或BookCollection
个实例。那么为什么要使用单个对象的映射器呢?如果适当集合的映射器更通用,而您不必确定您的条件只返回一个结果?
提前感谢您的帮助。
答案 0 :(得分:2)
您无需为Author
和AuthorCollection
创建两个地图制作工具。如果您的计划不需要AuthorMapper
和AuthorCollectionMapper
,以便顺利运作并拥有干净的来源,请务必做您最满意的事情。
注意:选择此路线意味着您应该格外小心,注意SRP违规行为。
这完全取决于你想要做什么。为了这篇文章,让我们调用AuthorMapper
项数据映射器和AuthorCollectionMapper
集合数据映射器。
通常,项目映射器不会像其集合映射器那样复杂。项目管理器通常只能通过主键 获取,因此会限制结果,使得映射器可以通过其他特定于集合的内容进行清理和整洁。
我提出的这些“特定于集合的事物”的一个主要部分是条件 1 以及它们如何在查询中实现。通常在集合映射器中,您可能拥有比项目数据映射器中通常更高级,更长,更乏味的查询。虽然完全可以将您的平均商品数据映射器查询(SELECT ... WHERE id = :id
)与复杂的收集映射器查询 无 使用臭味条件 2 ,它变得更加复杂,并且仍然困扰数据库执行冗长的查询,只需要一个简单的通用查询。
此外,尽管您指出使用项目映射器我们实际上只能通过主键获取,但通常使用项目映射器来完成其他事情时会更加简单。项目映射器的save()
和remove()
方法可以处理(使用正确的实现)作业,而不是尝试使用集合映射器来保存/删除项目。而且,与此同时,很明显有时在整个使用集合映射器的save()
和remove()
方法时,集合映射器可能希望使用项映射器方法。
在回答下面的问题时,您可能需要多次设置从数据库中删除行集合的条件。例如,您可能有一个垃圾邮件标记,在设置时隐藏帖子但在三十天内自毁。我就是这种情况你很可能有垃圾邮件标志的条件和一个时间范围。另一个可能是在删除答案后30天删除答案中的所有评论。我提到了30天,因为至少保留这些数据一段时间是明智的,以防有人想要他们的评论,或者事实证明带有垃圾邮件标志的行实际上并不是垃圾邮件。
<子> 1。这里的条件是指集合实例上设置的属性,集合映射器的查询知道如何处理。如果您还没有,请查看@tereško's answer here。
<子> 2。这种情况不同,是指"evil if"人所说的。如果你不理解他们的邪恶,我建议你看一些清洁代码会谈。 This one具体而言,但都很棒。