2017-07-07 2 views
0

J'utilise plusieurs racines agrégées dans un contexte délimité par DDD.Données de requête sur plusieurs référentiels dans DDD

Par exemple

public class OrderAggregate 
{ 
    public int ID {get;set;} 
    public string Order_Name {get;set;} 
    public int Created_By_UserID {get;set;} 
} 

public class UserAggregate 
{ 
    public int ID {get;set;} 
    public string Username {get;set;} 
    public string First_Name {get;set;} 
    public string Last_Name {get;set;} 
} 

J'utilise la base relationnelle SQL pour les objets de domaine persiste. Chaque racine agrégée correspond à un référentiel.

Dans le cas où je voudrais trouver une commande qui a été créée par John Doe (seach à travers plusieurs agrégats), qu'est-ce qui pourrait être un DDD?

  • ajouter First_Name et Last_Name en OrderAggregate afin d'ajouter la méthode FindByUserFirstLastName dans OrderRespository, mais qui pourrait soulever la question de la cohérence des données entre deux racines globales

  • créer une requête SQL brute et l'accès DB directement pour recherche étendue « dépôts » accross

  • utilisation « Finders » afin de se joindre à des entités directement de DB

  • répliquées cessai de données ry pour la requête à remplir une nouvelle racine globale telle que


public class QueryOrderAggregate 
{ 
    public int ID { get; set; } 
    public string Order_Name { get; set; } 
    public int Created_By_UserID { get; set; } 
    public string First_Name { get; set; } 
    public string Last_Name { get; set; } 
} 
+2

Ne laissez pas le modèle de base de données dicter votre modèle de domaine – MJK

+0

Vous avez deux contextes bornées: Commande et UserManagemeNT –

+0

@ConstantinGALBENU non, qui est juste une interprétation erronée – mko

Répondre

0

Au cas où je voudrais trouver un ordre qui a été créé par John Doe (seach accross plusieurs agrégats) que serait un moyen DDD d'aller?

presque de la même façon qu'il va de pair avec l'accès à un agrégat ...

Vous créez un référentiel qui fournit un (quel que soit le nom de ce point de vue/rapport est dans votre domaine). Il utilise probablement l'ID utilisateur comme clé pour identifier le rapport. Dans l'implémentation du référentiel, l'implémentation peut faire ce qui est logique - une jointure SQL est un point de départ raisonnable.

Le View/Report est essentiellement un type de valeur; il est immuable, et peut fournir des données, mais il ne dispose pas de méthodes, ni d'accès direct aux racines agrégées. Par exemple, la vue peut inclure l'ID de la commande, mais pour obtenir la racine de l'agrégat de commande, vous devez appeler une méthode sur ce référentiel.

Une vue qui s'étend sur plusieurs agrégats est parfaitement acceptable, car vous ne pouvez pas modifier quoi que ce soit en utilisant la vue. Les changements à l'état sous-jacent passent toujours par les racines agrégées, qui fournissent les garanties de cohérence.

La vue est une représentation d'un instantané périmé de vos données. Les consommateurs ne devraient pas s'attendre à une mise à jour magique - si vous voulez quelque chose de plus récent, retournez dans le dépôt pour une nouvelle copie.