2009-07-22 1 views
4

Где логика для удаления/не удаления зависимых объектов принадлежит DDD?Где находится логика Reisde для удаления зависимых объектов в доменном дизайне (DDD)?

Например один имеет категорию, которая содержит продукты:

class Category 
{ 
    IList<Products> products; 
} 

Правила может быть, что категория не может быть удалена, если он не имеет никаких продуктов.

В чем заключается логика, которая проверяет отсутствие продуктов под этой категорией перед удалением?

  • Классы доменов. Представляется, что это бизнес-логика, поэтому я бы предположил, что она принадлежит доменному слою.
  • Классы хранилища. Уровень репозитория обрабатывает постоянство, он имеет общие методы CRUD, в том числе один для удаления, содержит ли логика в этом слое?
  • Другое решение?

ответ

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... 
    } 
} 
+0

«возврат! Категория. Продукция»; возможно? –

+1

@Bryan Watts, OT & FYI: При написании кода, который предназначен для чтения, а не для выполнения, я часто предпочитаю использовать «x == false» вместо «! X». Я думаю, что он лучше читает его, поскольку «категория имеет продукты равными ложным», чем «нет категории имеет продукты». Просто личное предпочтение. В реальном сценарии я бы использовал! Category.HasProducts. –

+0

@KevinSwiber Я знаю, что это старый пост, но где должен быть расположен код, который вы указали (т. Е. Вопрос)? доменного уровня или уровня обслуживания? благодаря –

0

Как правило, совокупный корень будет управлять временем жизни дочерних объектов.

Смежные вопросы