DDD在存储库中使用服务

时间:2013-06-13 17:05:34

标签: service architecture domain-driven-design repository

问题:

我从XML Feed中提取第三方数据。我需要获取该数据并将其转换为实体。

讨论要点:

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

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

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

4 个答案:

答案 0 :(得分:4)

  

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

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

  

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

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

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

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

答案 1 :(得分:3)

没有。

存储库不应该具有任何域逻辑,除非提出持久性无知。

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

  • 如果它只是存储库使用的“服务”:
  • 如果是属于域名的服务:

答案 2 :(得分:1)

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

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

  1. 从XML获取数据的存储库;
  2. 将数据转换为实体的服务;
  3. 另一个保存新实体的存储库;
  4. 另一种方法:获取数据转换为服务层中的实体,然后将实体传递到存储库以实现持久性。

答案 3 :(得分:1)

下载Feed的内容不是DDD服务。这是一个DAO。是的,Repository可以使用构建Aggregate所需的任何DAO。在大多数情况下,DAO是您的ORM公开的东西,如NHibernate中的ISession或Entity Framework中的DbSet,但它可以是任何东西。 XML提要阅读器。 Amazon S3 API。文件阅读器......