1

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

继上一个问题之后,但不需要背景知识:当底层数据库有关系时,系统使用另一个系统的 WCF 服务

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

我的第一个想法是对 Document System 的调用应该在 HR System 的 Application Service 中(去掉多余的代码):

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 在这篇文章中说: “存储库后面是什么?几乎任何你喜欢的东西。是的,你没听错。你可以有一个数据库,或者你可以有许多不同的数据库。你可以使用关系数据库或对象数据库. 你可以有一个内存数据库,或者一个包含内存项列表的单例。你可以有一个 REST 层,或者一组 SOA 服务,或者一个文件系统,或者一个内存缓存……”

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

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);
    }
}

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

我是在正确的路线上还是离开了?

4

2 回答 2

3

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

于 2011-09-03T13:34:00.143 回答
0

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

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

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

希望这可以帮助。

罗伯特

于 2011-07-07T08:08:46.833 回答