【问题标题】:DDD: Repositories calling Application ServicesDDD:调用应用程序服务的存储库
【发布时间】:2011-09-29 13:35:35
【问题描述】:

这是围绕我了解 DDD 的系列文章的一部分 :)

接上一个问题,但不需要背景知识:System consuming WCF services from another system, when underlying databases have relationships

有一个文档系统和一个人力资源系统。人力资源系统需要保存一个文档以及与该文档相关的一些人力资源特定数据。

我的第一个想法是对文档系统的调用应该在人力资源系统的应用程序服务中(去掉多余的代码):

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

存储库是这样的:

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        _session.Save(hrDocument);
    }
}

但是 Jak Charlton 在 this article 中说:“存储库后面是什么?几乎任何你喜欢的东西。是的,你没听错。你可以有一个数据库,或者你可以有许多不同的数据库。你可以使用关系数据库“

所以现在我认为服务应该是这样的:

public class HRDocumentService
{
    public void SaveDocument(string filename, string employee)
    {
        HRDocument hrDocument = HRDocument.CreateDocument(documentLibraryId, employee);
        _hrDocumentRepository.Save(hrDocument);
    }
}

并像这样调用存储库中的文档库服务:

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        hrDocument.DocumentLibraryId = documentLibraryId;
        _session.Save(hrDocument);
    }
}

这样,可以说,存储库仍然只负责持久性。

我是在正确的路线上还是在正确的路线上?

【问题讨论】:

    标签: architecture service domain-driven-design repository-pattern ddd-repositories


    【解决方案1】:

    域服务位于存储库和实体之前,因此在 HRDocumentRepository 中使用 DocumentLibraryService 不是“符合 DDD”。

    你的第一个想法是正确的!

    但是逻辑本身(在持久化之前为实体分配一些值)在存储库中是完全有效的,只要您可以从存储库而不是服务获取信息。

    希望这会有所帮助。

    罗伯特

    【讨论】:

      【解决方案2】:

      似乎从其他系统访问应用程序服务的存储库是相当普遍的做法。 The Microsoft Application Architecture Guide 以“服务代理”的形式提倡这一点,上面的 Jak Charlton 引用也支持它。如果使用 NHibernate 进行数据访问,您可以通过实现 IUserType 来做到这一点,正如我在这篇文章中提到的:NHibernate: Lazy loading of IUserType。这不是一个通用的解决方案 - 例如,如果您要返回一个集合并且每个实体都必须为其子实体进行 WCF 调用,它的性能就会很差。当被问及集成系统时,人们通常会提倡消息传递和 CQRS,但即使是 Udi Dahan 本人也声称这不适用于绝大多数系统。

      【讨论】:

        猜你喜欢
        • 2016-10-15
        • 2021-10-12
        • 2018-09-15
        • 2013-02-19
        • 2022-06-17
        • 2018-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多