我正在一个涉及Workspace的项目的持久层上工作,每个持久化层可能包含零个,一个或多个Document。 (我正在尝试遵循Domain-Driven-Design principles,但我的问题可能与此没有直接关系。)

问题1:我应该分开坚持吗?也就是说,您是否以可以


就像在没有持久性的情况下(可能使用Factory方法Workspaces.newWorkspace(...))那样,在内存中创建实体和值,并且
调用单独的persist()方法(可能在存储库中)以保持持久性?


还是应该使用我的工厂方法Workspaces.newWorkspace()创建一个持久化的实体(一旦事务关闭,这个持久化的实体)?

如果对这个问题的回答是“分离,伙计!”然后我想知道如何以一种优雅的方式完成此任务。我的第一种方法是(使用Scala伪代码):

class Workspace(title: String, documents: List[Document], id: Option[Long]) {
  def add(d: Document) =  // ...
  def remove(d: Document) = // ...
}


但是,如果一个工作区可以包含许多文档,那么这样做是不好的(受RAM限制)。在"How not to inject services into entities"之后,我的下一个方法是:

class Workspace(title: String, docSupplier: DocSupplier, id: Option[Long]) {
  def add(d: Document) = docSupplier.add(d)
  def remove(d: Document) = docSupplier.remove(d)
}


这样,工作空间工厂可以创建如下新的工作空间:

class Workspaces {
  def newWorkspace(title: String) = new Workspace(title,
    // A supplier that maintains a simple `List[Document]`
    new DocSupplier() {
      def add(d: Document) = list.add(d)
      def remove(d: Document) = list.remove(d)
    }, id)
}


另外,我的存储库可以重建从数据库中获取的工作空间,如下所示:

class WorkspaceRepository {
  def findById(id: Long) = // ... calls `createDoc()`

  def createDoc(...) = new Workspace(title,
    // A supplier that remembers changes so they can be persisted in `persist()`
    new DocSupplier() {
      def add(d: Document) = changes.rememberAdd(d)
      def remove(d: Document) = changes.rememberRemove(d)
    }, id)
}


问题2:这是这样做的方法吗? h,这是很多代码,还有很多样板!

最佳答案

我应该分开坚持吗?


是的,只是您描述的方式。


  或者我的工厂方法Workspaces.newWorkspace()应该创建一个
  持久实体(交易后将持久存在)
  关闭)?


不可以,因为持久化瞬态实体应该是显式操作,例如添加新的工作区时。工厂处理对象实例的创建,存储库处理持久性。正如pabrantes所指出的,“工作单位”模式可以与存储库结合使用。


  但是,如果一个工作区可以包含许多文档,那是不好的
  (受RAM限制)。


这是DDD中的常见情况-在达到持久性无知时,您必须考虑技术限制。首先要考虑的是Workspace实体是否完全需要引用Document实例的集合。 Workspace是否需要强制执行不变式?有交易界限吗?对象引用只是one of the ways of representing relationships。另一种方法是使用存储库。因此,您没有提供Document类上的Workspace集合,而是提供了一种存储库方法,该方法允许检索与特定工作空间关联的文档。鉴于文档的数量可能很大,因此存储库也可以支持分页和过滤。

另请参阅Effective Aggregate Design by Vaughn Vernon,以深入了解这些问题。

关于java - 如何在DDD中实现持久性无知?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13836582/

10-13 06:30