我目前正在尝试了解如何开发DDD类,而不对可能需要使用它们的实现进行任何假设。我设法开发了一个小型结构,由一个名为User
的用户对象组成,它实现了一个IUser
接口,因此我可以保留一个有效的抽象以便重用。
我现在想在具体的实现中使用这个用户对象,在我的例子中使用Symfony2。为了从Symfony安全层中受益,我的用户对象需要实现Symfony提供的UserInterface
接口。
如果我理解正确的模式,这将是一个很好的机会来实现一个名为UserAdapter
的适配器,这将允许我让我的用户类与Symfony一起工作。到目前为止这么好,这完全没问题。但这是我的问题:
假设我在我的DDD lib中添加了一个Comment
类,它具有$user
属性。为了将用户绑定到注释,我使用了例如setUser()
setter,它需要任何实现IUser
接口的东西。如果明天我想更改要在此上下文中使用的用户类,我只需要一个实现IUser
接口的新用户类。
但是在我的具体实现中,例如在Symfony控制器中,我使用的是UserAdapter
类的实例,它实现了Symfony UserInterface
接口。在我的setUser()
对象上调用Comment
setter时,界面不匹配。
我错过了什么?
我是否以错误的方式使用适配器模式,我应该在实现中使用不同的策略吗?
答案 0 :(得分:2)
我想到了两种解决方案。一种解决方案适用于继承,一种具有委托。
继承
在您的UserAdapter
课程中,从您的DDD User
课程延伸。还要在适配器中实现Symfony2 UserInterface
。现在使用父类中的属性实现UserInterface
中的方法。
团
与继承情况相同,UserAdapter
类必须实现Symfony2 UserInterface
。但是现在您创建了从适配器到具体用户类的关联。所以你的适配器“有一个”用户。为了避免没有用户的适配器,您可以在适配器构造函数中要求用户。然后,您可以使用setUser($userAdapter->getUser())
调用setUser方法。