DDD:在哪里生成实体的 url slug?

Posted

技术标签:

【中文标题】DDD:在哪里生成实体的 url slug?【英文标题】:DDD: where to generate url slug of an entity? 【发布时间】:2015-05-14 16:28:31 【问题描述】:

你如何处理 DDD 中的 url slug 生成?

在构造函数内部?但是依赖其他服务的实体不好。

作为构造函数参数传递?我认为蛞蝓不应该在那里,因为它们不是业务需求。是吗?

还是只有一个二传手?

【问题讨论】:

slug 看起来不像是来自您的底层业务领域的真正概念,而是为 Web 应用程序提供漂亮 URL 的东西。因此,slug 生成是另一层或有界上下文的一部分,不属于核心域。 您将如何处理?我们有课程,我希望课程的标题是 url 而不是 id。 url 可能会因标题而异,如果它太长或出于其他原因,所以我认为最好将其保存在数据库中。所以你的意思是有界上下文,我应该把它保存在单独的表上? 是的,单独的表可能是最好的主意。最后,slug 只是一个演示问题,如果你曾经在课程系统中添加一个移动应用程序,那么 slug 在这里没有任何意义。 谢谢。还没有机会玩它。 我知道这很难,但我认为 url slugifier 作为服务在域层之外,今天你可能会使用外部包来生成它,明天你可能会使用外部 API,我不会将此逻辑放在域中。因此,就像@AlexanderLanger 所说,我将创建一个带有 url slug 的分隔实体,以及对所有者实体(id 和类型)的引用。因此,您可以为任何类型的实体(图像、视频)存储 url slug。将属性放在实体中是很强大的,就像它是实体的部分,独立于用于使用所述实体的应用程序。 【参考方案1】:

看起来 URL slug 是您的域模型的一部分,尽管起初它似乎是一个基础架构问题。

如果您将其建模为实体的属性,我认为在构造函数参数中传递它没有问题。将它作为具有公共设置器的属性当然更好,任何人都可以随时对其进行修改。

创建一个ISlugGenerator 接口并将其注入适当的层(ApplicationService 或 DomainService,请参阅here 了解更多信息),以生成 URL 字符串并将其在构造函​​数中传递给实体。

在表示层中实现ISlugGenerator,它实际上保存了要通过 URL 访问的页面/路由。


您可能会争辩说,URL 在域模型中确实没有位置,因为它只是一些与实体相关的信息,但不用于任何决策过程。

那么,请考虑一下电子商务应用程序中的产品描述或产品图片。这是同样的事情。您肯定有这些属性的验证逻辑,并且此验证应该是域的一部分,但您可能不会根据它们做出任何其他决定。

那么,您不应该从 Product 实体中删除 Description 和 Image 吗?实际上,没有。即使图像可能是一个 URL,就像您问题中的 slug 一样。

产品将在其构造函数中将 imageUrl 作为字符串参数接收,或者通过实体中的方法进行设置。但是 imageUrl 会由一些 ImageUploadService 生成,它的接口会在 Application Layer 中定义并在一些 Infrastructure Layer 中实现。

【讨论】:

以上是关于DDD:在哪里生成实体的 url slug?的主要内容,如果未能解决你的问题,请参考以下文章

用于生成 slug 的 Java 代码/库(用于漂亮的 URL)

如何创建 URL slug 扩展?

生成 SEO 友好的 URL(slug)[关闭]

生成 SEO 友好的 URL(slug)的最成熟的方式/lib 是啥?

创建用户后无法为“page_slug”生成 URL

如何将 slug 添加到 asp.net 核心网站中的所有链接生成?