Architecture DDD:调用应用程序服务的存储库

Architecture DDD:调用应用程序服务的存储库,architecture,service,domain-driven-design,repository-pattern,ddd-repositories,Architecture,Service,Domain Driven Design,Repository Pattern,Ddd Repositories,这是一个以我为中心的系列文章的一部分,让我了解DDD:) 以下是前一个问题,但不需要背景知识: 有文件系统和人力资源系统。人力资源系统需要保存一份文档以及一些与文档相关的人力资源特定数据 我的第一个想法是调用文档系统应该在人力资源系统的应用服务中(去掉不必要的代码): 存储库是这样的: public class HRDocumentRepository { public long Save(HRDocument hrDocument) { _session.Sav

这是一个以我为中心的系列文章的一部分,让我了解DDD:)

以下是前一个问题,但不需要背景知识:

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

我的第一个想法是调用文档系统应该在人力资源系统的应用服务中(去掉不必要的代码):

存储库是这样的:

public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        _session.Save(hrDocument);
    }
}
public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        hrDocument.DocumentLibraryId = documentLibraryId;
        _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)
    {
        _session.Save(hrDocument);
    }
}
public class HRDocumentRepository
{
    public long Save(HRDocument hrDocument)
    {
        long documentLibraryId = _documentLibraryService.SaveDocument(filename);
        hrDocument.DocumentLibraryId = documentLibraryId;
        _session.Save(hrDocument);
    }
}
这样的话,可以说,repsository仍然只对持久性负责


我在这里是正确的还是不正确的?

域服务位于存储库和实体前面,因此在HRDocumentRepository中使用DocumentLibrary服务不符合DDD标准

你的第一个想法是正确的

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

希望这有帮助


Robert

似乎存储库从其他系统访问应用程序服务是一种被广泛接受的做法。它以“服务代理”的形式提倡这一点,上面的Jak Charlton引述也支持这一点。如果使用NHibernate进行数据访问,您可以通过实现IUserType来实现这一点,正如我在这篇文章中提到的:。它不是Universalal解决方案—例如,如果您返回一个集合,并且每个实体都必须为其子实体发出WCF调用,则该解决方案的性能会很差。当询问集成系统时,人们通常主张使用消息传递和CQR,但就连Udi Dahan本人也声称这不适用于绝大多数系统