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

时间:2011-07-06 11:49:59

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

这是围绕我开始围绕DDD的系列的一部分:)

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

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

我的第一个想法是对文件系统的调用应该在人力资源系统的应用服务中(剥离了unnessaceryry代码):

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中说什么?存储库背后是什么?几乎任何你喜欢的东西。是的,你听到的是正确的。你可以有一个数据库,或者你可以拥有许多不同的数据库。你可以使用关系数据库或对象数据库。你可以有一个内存数据库,或一个包含内存项列表的单例。你可以有一个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);
    }
}

这种方式,可以说,销售代表仍然只对持久性负责。

我在这里或离开的地方是正确的吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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

希望这有帮助。

罗伯特