使DDD接口适应具体实现

时间:2014-01-03 15:37:25

标签: php symfony design-patterns domain-driven-design adapter

我目前正在尝试了解如何开发DDD类,而不对可能需要使用它们的实现进行任何假设。我设法开发了一个小型结构,由一个名为User的用户对象组成,它实现了一个IUser接口,因此我可以保留一个有效的抽象以便重用。

我现在想在具体的实现中使用这个用户对象,在我的例子中使用Symfony2。为了从Symfony安全层中受益,我的用户对象需要实现Symfony提供的UserInterface接口。

如果我理解正确的模式,这将是一个很好的机会来实现一个名为UserAdapter的适配器,这将允许我让我的用户类与Symfony一起工作。到目前为止这么好,这完全没问题。但这是我的问题:

假设我在我的DDD lib中添加了一个Comment类,它具有$user属性。为了将用户绑定到注释,我使用了例如setUser() setter,它需要任何实现IUser接口的东西。如果明天我想更改要在此上下文中使用的用户类,我只需要一个实现IUser接口的新用户类。

但是在我的具体实现中,例如在Symfony控制器中,我使用的是UserAdapter类的实例,它实现了Symfony UserInterface接口。在我的setUser()对象上调用Comment setter时,界面不匹配。

我错过了什么?

我是否以错误的方式使用适配器模式,我应该在实现中使用不同的策略吗?

1 个答案:

答案 0 :(得分:2)

我想到了两种解决方案。一种解决方案适用于继承,一种具有委托。

  1. 继承

    在您的UserAdapter课程中,从您的DDD User课程延伸。还要在适配器中实现Symfony2 UserInterface。现在使用父类中的属性实现UserInterface中的方法。

  2. 与继承情况相同,UserAdapter类必须实现Symfony2 UserInterface。但是现在您创建了从适配器到具体用户类的关联。所以你的适配器“有一个”用户。为了避免没有用户的适配器,您可以在适配器构造函数中要求用户。然后,您可以使用setUser($userAdapter->getUser())调用setUser方法。