2012-11-14 23 views
3

我正在研究涉及版本控制实体的项目,以便用户修改整个历史记录。根据服务有一个存储库可以吗?

基本上,这个想法是当一个实体被创建时,其内容的版本1也被保存在一个存档表中。无论何时修改实体,都会存储增量版本。

将实体的状态保存到归档表由ArchiveService处理。

当实体被持久化时,ArchiveService需要被调用,以创建第1版,所以最合理的方式似乎是从存储库调用它,从而通过服务作为一个依赖到仓库:

public class Repository { 
    private ArchiveService archiveService; 

    public Repository(ArchiveService service) { 
     this.archiveService = service; 
    } 

    public void add(Entity entity) { 
     // ... (persist the entity) 

     this.archiveService.createVersion(entity); 
    } 
} 

这是一个很好的做法,还是有任何缺点? 到目前为止,我所看到的服务取决于存储库,而不是其他方式。

回答

3

如果按照描述对其进行建模,您可以隐式地将领域知识隐藏在存储库中,而存储库本身不属于域的一部分。我不认为这会是一个好主意。

您可以使用Domain Events对其进行建模,即EntityCreated。事件监听器可以选择事件并创建相应的归档条目。

更新回答这个自小在评论一个问题:

从概念上讲,库封装在数据存储持久 对象的集合,并在他们所执行的操作,提供了 持久层的更多面向对象的视图。 - Martin Fowler

除了正式的定义:一个仓库知道如何存储和检索的对象。为了能够实现这一点,它需要知道持久化机制或者至少在下面的数据访问层。

另一方面,领域模型不应该依赖于外部的任何东西。在体系结构(它比传统分层方法更适合于DDD)中,存储库将是适配器之一。

您的域只知道其存储库的接口,实际的实现是在外面。这样你只有内向的依赖关系。基本上这是面向对象的,而具有向下指向级联依赖关系的分层架构更多的是一种程序方法。

+0

我一直认为存储库是域的一部分。你有这样的来源吗? – Benjamin

+0

@Benjamin我在最新的答案中详细阐述了这一点。 –

+0

谢谢,这有助于很多。 – Benjamin

2

正在归档属于您无处不在的语言的域概念吗?如果是,则应在域图层中定义ArchiveService。否则,它可以在基础架构层中定义,并且IRepository的每个实现将选择是否存档。

在任何情况下,根据ArchiveService(或任何其他服务),我没有发现存储库有任何问题。您可以立即拨打repository.add(entity)拨打archiveService.createVersion(entity)的所有代码,但这不会很方便。

+0

是的,它是无处不在的语言和领域模型的一部分,我们希望能够搜索和显示档案,查看谁做了什么,等等。 – Benjamin

相关问题