4

问题:

我正在从 XML 提要中提取第三方数据。我需要获取这些数据并将其转换为实体。

讨论要点:

我的问题是在这种情况下如何使用服务和存储库。因此,例如,我可以创建一个从提要中提取数据的服务,然后将该服务注入到存储库中,然后可以使用它来提取数据并将其转换为实体。但我不确定这是否是正确的方法?

存储库可以具有提取数据然后将其映射到实体的逻辑,但我认为存储库不应该处理该逻辑?还是应该?

从 DDD 关注点分离的角度来看,应该如何最好地构建它?

4

4 回答 4

5

我可以创建一个从提要中提取数据的服务,然后将该服务注入到存储库中。

这在 DDD 中不会被视为域服务,因为它与域无关。这纯粹是技术基础设施问题。

我的问题是在这种情况下如何使用服务和存储库。

听起来您在这里可能有两个不同的问题。存储库显然根据有界上下文提供了对数据的访问,但我敢打赌,在 XML 数据和存储库之间还有一些额外的数据操作/转换......

在 DDD 术语中,这将被视为一个反腐败层。您无法控制外部数据源,并且希望防止此外部数据的格式破坏您精心设计的域模型的完整性。

可以将反腐败层注入存储库 - 只要其目的明确定义即可。这不会被视为域服务,因为它与域无关,它是由外部数据源的性质驱动的纯粹制造。

于 2013-06-16T11:57:20.020 回答
4

不。

除了证明对持久性的无知之外,存储库不应该有任何领域逻辑。

但是存储库本身可以在数据实体和域实体之间进行任何类型的转换。它还可以使用任意数量的表或数据库来构建请求的域实体。

  • 如果它是仅由存储库使用的“服务”:
  • 如果它是属于域的服务:
于 2013-06-14T13:08:12.077 回答
1

服务不应该被注入到存储库中,而是相反。

如果您的存储库与您的数据库没有紧密耦合(就像大多数实现似乎那样),您可以:

  1. 从 XML 获取数据的存储库;
  2. 将数据转换为实体的服务;
  3. 另一个存储新实体的存储库;

另一种方法:获取数据在服务层转换为实体,然后将实体传递到存储库进行持久化。

于 2013-06-13T20:46:53.530 回答
1

下载提要的东西不是 DDD 服务。这是一个 DAO。是的,存储库可以使用构建聚合所需的任何 DAO。在大多数情况下,DAO 是您的 ORM 公开的东西,例如 NHibernate 中的 ISession 或实体框架中的 DbSet,但它可以是任何东西。XML 提要阅读器。亚马逊 S3 API。文件阅读器...

于 2013-06-15T15:41:24.310 回答