【问题标题】:Adapting DDD interfaces to a concrete implementation使 DDD 接口适应具体实现
【发布时间】:2014-01-03 15:37:25
【问题描述】:

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

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

如果我正确理解了这个模式,这将是一个很好的机会来实现一个名为UserAdapter 的适配器,它可以让我的用户类与 Symfony 一起工作。到目前为止一切顺利,这工作得很好。但这是我的问题:

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

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

我错过了什么?

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

【问题讨论】:

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


    【解决方案1】:

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

    1. 继承

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

    2. 代表团

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

    【讨论】:

    • 我想到了第二种解决方案,它在理论上很好,因为它使用组合,但我也试图避免最终开发人员的复杂性。通过使用委托,我迫使他们对业务对象的组成方式做出假设,除非我为我的Comment 对象开发了一些其他适配器,该适配器将用作正确设置用户的中间层。使用继承,如果我开发类似 Symfony 的对象,每个对象都扩展它们的等效 DDD 库,那会是一个好的解决方案吗?它确保在 Symfony 应用程序上下文中可用的对象确实是 Symfony 兼容的。
    • 只有当你计划从 Symfony2 应用程序中的另一个 DDD User 类继承时,继承才会成为问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2019-02-26
    • 2011-01-20
    相关资源
    最近更新 更多