J'ai ce modèle de domaine simple. L'utilisateur effectue une activité qui a durée et distance. Pour chaque activité, un ou plusieurs engins peuvent être affectés (chaussures pour courir). Après l'affectation, la durée et la distance sont ajoutées aux totaux sur l'engrenage.Modification de deux agrégats dans une seule transaction (DDD)
Les deux Activity et GearItem sont des racines agrégées. Lorsque j'attribue un élément à une activité, je dois ajouter l'identifiant de l'élément à l'activité et mettre à jour les totaux sur l'élément.
Comment orchestrer cette opération?
- Appel
GearItem.AssignUsage()
directement à partirActivity.AddItem()
? - Faites-le dans un service d'application en une seule transaction, en appelant
GearItem.AssignUsage()
juste aprèsActivity.AddItem()
(cela casse la règle d'une transaction par AR). - Utiliser l'événement de domaine (classe statique de Udi Dahan) - mais comment et où éviter un problème de transaction unique?
- Ou autre chose, beaucoup mieux?
GearItem AR, contient les totaux d'activités:
public class GearItem: Entity<GearItem>
{
...
public Usage AssignedUsage { get; private set; };
public void AssignUsage(Activity activity)
{
AssignedUsage = new Usage(AssignedUsage.Time + activity.Time,
AssignedUsage.Distance + activity.Distance, AssignedUsage.Uses + 1);
}
}
activité AR, contient les ID de GearItems assignés:
public class Activity: Entity<Activity>
{
...
private List<int> items = new List<int>();
public TimeSpan Time { get; }
public double Distance { get; }
public bool AddItem(GearItem item)
{
if (items.Contains(item.Id)) return false;
items.Add(item.Id);
return true;
}
}
objet de valeur d'utilisation:
public class Usage: ValueObject<Usage>
{
...
public TimeSpan Time { get; private set; }
public double Distance { get; private set; }
public int Uses { get; private set; }
}