2016-08-17 83 views
1

我们有工厂来创建复杂的对象。 (对于makin的东西)PHP设计模式工厂,仓库和...?

我们有找到它们的仓库。 (for findin'stuff)

我们有什么更新它们? (For changin'stuff up)


看起来像是在拼图中缺失的一块?我不认为它属于存储库,因为这打破了单一的责任......

+1

是不是“更新”一个对象本身执行的操作吗?或者,您的意思是“更新”,如“将现有对象的已更改状态保存回数据存储区”一样? – David

+0

您会更新对象,然后将更新的对象传回存储库;无论你的repo是在内存中还是在数据库中,你仍然要做'$ repo-> save($ object)' – CD001

+1

我们有存储库来保存对象(复杂与否) 。持久性包括查找,但也存储(新的或更新的)对象(以后有东西可以找到)。 – axiac

回答

1

更新实体(以及数据库)属于存储库。存储库本身是数据库本身和程序之间的一个层。

因此,每个数据库操作都属于存储库。此外,存储库不能与数据库通信,它也可以具有XML,CSV或API作为数据源。但这并不重要,因为您正在与存储库进行通信。版本库处理之后的所有内容。

你可以用另一个更改存储库,你的程序可以毫无问题地工作,因为这些存储库都实现了相同的接口。你不再喜欢那个MySQL数据库,那个老式的CSV好多了?只需更换已使用的Repository即可完成。

查找存储库的条目不超过SELECT语句,那么为什么不用UPDATEDELETE呢?

MSDN

进一步阅读上找到web.archive.org

+0

不同意。如果你采用这种逻辑“每个数据库操作因此属于存储库”。你不能缩放。 – AndrewMcLagan

+0

为什么你不能缩放?每个实体都有自己的存储库,因此您可以扩展实体数量,从而扩大您将使用的存储库数量。 – KhorneHoly

+0

想一想。抽象数据库交互不是库的唯一原因。它们是“取物的对象”......这也是为什么工厂模式存在“用于创建复杂事物的对象”。他们都可以从抽象数据库逻辑中获益...并非如你所说的唯一原因... – AndrewMcLagan

1

一个很好的解释和例子,我认为这取决于方法。

以DDD为例,您所说的是真实的。版本库应该负责添加,查找和删除,因为它对集合起作用,但是为什么它应该能够更新单个对象呢?

可以做些什么?我想我只会复制其他人说的话,所以我只会发布链接回答:approach to removing save/update from repository

+0

关于' - > save($ object)''的有趣说明'...如果我们打算用书架类比去做,虽然你可以从书架上取出书本,但你可以拿出TipEx做一些修改,然后将它添加回当你完成了书架。 – CD001

+1

它并不真正更新。你说的是从收集中删除它,然后添加新的基本;-)例如,这个ID呢?它过分复杂的情况。 – mmmm

+0

对象知道它自己的id,但不会改变 - 但是,如果回购是坐在数据库之上并自动保持集合的状态,它可能会全部掉下来。 – CD001