2009-07-22 3 views
4

Wo gehört die Logik zum Löschen/Nicht-Löschen von abhängigen Objekten in DDD?Wo liegt die Logik zum Löschen abhängiger Objekte im domänenbasierten Design (DDD)?

Zum Beispiel hat man eine Kategorie, die Produkte enthält:

class Category 
{ 
    IList<Products> products; 
} 

Eine Regel könnte sein, dass eine Kategorie nicht gelöscht werden kann, wenn es keine Produkte hat.

Wohin gehört die Logik, die vor dem Löschen nach Produkten dieser Kategorie sucht?

  • Domain-Klassen - Es scheint, Business-Logik zu sein, so würde ich vermuten, dass es in der Domain-Ebene gehören.
  • Repository-Klassen - Die Repository-Schicht behandelt Persistenz, hat die allgemeinen CRUD-Methoden, einschließlich einer zum Löschen, gehört die Logik in diese Schicht?
  • Eine andere Lösung?
  • Antwort

    2

    Es ist wichtig, daran zu denken, dass DDD wie die meisten Ideen zum Softwaredesign eine Reihe von Richtlinien ist, keine harten und schnellen Regeln, also mach dir keine Sorgen darüber, ob du wirklich DDD machst . Wie bei den meisten Softwareszenarien lautet die Antwort: "Es kommt darauf an."

    Verwenden Sie in diesem Szenario eine 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

    "zurück! Kategorie.HasProducts;" vielleicht? –

    +1

    @Bryan Watts, OT & FYI: Wenn ich Code schreibe, der gelesen werden soll und nicht ausgeführt wird, bevorzuge ich oft "x == false" anstelle von "! X". Ich denke, es fließt besser, es als "Kategorie hat Produkte gleich falsch" als als "nicht Kategorie hat Produkte" zu lesen. Nur eine persönliche Vorliebe. In einem realen Szenario würde ich! Category.HasProducts verwenden. –

    +0

    @KevinSwiber Ich weiß, das ist ein alter Post, aber wo der Code, den Sie bereitgestellt haben, sollte lokalisiert werden (d. H. Die Frage)? Domänenschicht oder Serviceschicht? Vielen Dank –

    0

    Üblicherweise wird das Aggregat Wurzel wird Lebensdauer der Kinder Einheiten verwalten.