Php 编程到接口和观察者模式
首先是一个小的介绍,帮助您理解我的来历:我不知道如何命名这个问题,或者像它一样,或者像存储库一样跟踪工作单元的更改 我有两个接口,Php 编程到接口和观察者模式,php,oop,design-patterns,architecture,domain-driven-design,Php,Oop,Design Patterns,Architecture,Domain Driven Design,首先是一个小的介绍,帮助您理解我的来历:我不知道如何命名这个问题,或者像它一样,或者像存储库一样跟踪工作单元的更改 我有两个接口,ChangeListener和ChangeSubject,它们是耦合的: interface ChangeListener { public function onSubjectChanged(ChangeSubject $subject, array $data); } interface ChangeSubject { public functio
ChangeListener
和ChangeSubject
,它们是耦合的:
interface ChangeListener
{
public function onSubjectChanged(ChangeSubject $subject, array $data);
}
interface ChangeSubject
{
public function addChangeListener(ChangeListener $listener);
}
我还有一个存储库和一个工作单元(WIP,我将省略一些部分):
现在,在我对UnitOfWork
的实现中,让我们称之为Book
,更准确地说,在方法hydrateChange
中,我将更改通知存储库,这很容易:
$repository->onSubjectChanged($this, $newHydration);
现在的问题是,在存储库中,我需要知道书的id。但是存储库的处理方法接收到一个ChangeSubject
,它没有id(书的有id)
如何正确设计这样一个系统
如果PHP有泛型,这是可能的。一个我不喜欢的黑客解决方案是使用instanceof
您误解了其中一些概念。如果你做到了以下几点,你应该回到正轨:
- 不要在域对象中实现工作单元。工作单元只是跟踪更改的技术助手。因此,工作单元引用业务对象,例如,要注意“ID为32的图书已更改”,但它与业务对象不同
- 为聚合类型创建具体的存储库。一个
BookRepository
应该包含GetById(BookId)
、GetByAuthor(Author)
等方法。注意:在使用泛型的语言中,可能有机会提取泛型部分,但在PHP中,最好使用具体的聚合类型,如Book
我建议您进一步了解工作单元和存储库模式。在尝试使用它们之前,请确保您完全理解它们。还要确保您了解不同的存储库变体(例如,命令式存储库与集合式存储库),以便为您的项目做出明智的决策。您误解了一些概念。如果你做到了以下几点,你应该回到正轨:
- 不要在域对象中实现工作单元。工作单元只是跟踪更改的技术助手。因此,工作单元引用业务对象,例如,要注意“ID为32的图书已更改”,但它与业务对象不同
- 为聚合类型创建具体的存储库。一个
BookRepository
应该包含GetById(BookId)
、GetByAuthor(Author)
等方法。注意:在使用泛型的语言中,可能有机会提取泛型部分,但在PHP中,最好使用具体的聚合类型,如Book
我建议您进一步了解工作单元和存储库模式。在尝试使用它们之前,请确保您完全理解它们。还要确保您了解不同的存储库变体(例如,命令样式存储库与集合样式存储库),以便为您的项目做出明智的决策。在这种情况下,您将在某个地方使用instanceof
。为什么要将UnitOfWork和业务对象结合起来?业务对象不应该意识到与持久性相关的问题。@SebastianKeßler您在哪里看到业务对象和持久性之间的依赖关系?它是依赖项反转,持久性作为一个ChangeListener从外部注入,但也可能有其他的,比如跟踪谁做了什么的安全服务(安全方面的会计)<如果PHP支持泛型,则不需要使用code>instanceof
。很难理解这与DDD有什么关系…@AlexeyZimarev问题还被标记为设计模式
和oop
。我标记了它ddd
,因为所涉及的类也是一个UOW和一个存储库。这意味着使用PHP进行DDD的人可能会遇到这种情况。当然,DDD不仅仅是在这种情况下说明的,它是无处不在的语言,它是有界的上下文,等等。你误解了什么是工作单元。UoW是一组更改,其中应存储所有内容或任何内容。在DB世界中,它可以由事务表示。在这个场景中,您将在某处使用instanceof
。为什么要将UnitOfWork和业务对象结合起来?业务对象不应该意识到与持久性相关的问题。@SebastianKeßler您在哪里看到业务对象和持久性之间的依赖关系?它是依赖项反转,持久性作为一个ChangeListener从外部注入,但也可能有其他的,比如跟踪谁做了什么的安全服务(安全方面的会计)<如果PHP支持泛型,则不需要使用code>instanceof。很难理解这与DDD有什么关系…@AlexeyZimarev问题还被标记为设计模式
和oop
。我标记了它ddd
,因为所涉及的类也是一个UOW和一个存储库。这意味着使用PHP进行DDD的人可能会遇到这种情况。当然,DDD不仅仅是在这种情况下说明的,它是无处不在的语言,它是有界的上下文,等等。你误解了什么是工作单元。UoW是一组更改,其中应存储所有内容或任何内容。在DB世界中,它可以由事务表示。是的,关于你的第一个要点:我确实把它们混在一起了。关于第二个:是的,我在图书库中有这些方法。对我来说,准确跟踪哪本书的哪些字段被修改是非常重要的
$repository->onSubjectChanged($this, $newHydration);