逻辑在哪里可以删除域驱动设计(DDD)中的从属对象?

时间:2009-07-22 05:26:39

标签: design-patterns repository domain-driven-design

删除/不删除依赖对象的逻辑在哪里属于DDD?

例如,其中一个类别包含产品:

class Category
{
    IList<Products> products;
}

规则可能是除非没有产品,否则无法删除该类别。

逻辑属于哪里,在删除之前检查此类别下没有产品?

  • 域类 - 它似乎是业务逻辑,所以我猜测它属于域层。
  • 存储库类 - 存储库层处理持久性,它有一般的CRUD方法,包括一个用于删除,逻辑属于该层吗?
  • 另一种解决方案?

2 个答案:

答案 0 :(得分:2)

重要的是要记住,像大多数关于软件设计的想法一样,DDD是一套指导方针,而不是硬性规则和快速规则,所以不要过分担心你所做的事情是不是真正的DDD。像大多数软件场景一样,答案是“它取决于。”

在这种情况下,请考虑使用Specification

Category category; // some category you're working with.
ICategoryRepository _categoryRepository; // some repository.

ISpecification readyForRemoval = new ReadyForRemovalSpecification();

if (readyForRemoval.IsSatisfiedBy(category)
{
  _categoryRepository.Remove(category);
}

public class ReadyForRemovalSpecification : ISpecification<Category>
{
  public bool IsSatisfiedBy(Category category)
  {
    return (category.HasProducts == false);
    // return category.Products.Count = 0; // whatever...
  }
}

答案 1 :(得分:0)

通常,聚合根将管理子实体的生命周期。