Oui, le change tracking est typiquement le genre de truc pour lequel
on peut s'appuyer sur l'AOP.
Romain
Il y a plusieurs raisons de s'en passer.
- C'est galère à implémenter
- Ya des frameworks (genre NHibernate) qui gèrent ca très bien pour
toi à l'exterieur des objets du domaines
- Un objet métier bien encapsulé n'a pas de Setters, mais des méthodes
qui représentent les verbes du domaine.
jeremie / thinkbeforecoding
A mon avis, évite d'implémenter IsDirty sur tes entités....
Il y a plusieurs raisons de s'en passer.
- C'est galère à implémenter
- Ya des frameworks (genre NHibernate) qui gèrent ca très bien pour
toi à l'exterieur des objets du domaines
- Un objet métier bien encapsulé n'a pas de Setters, mais des méthodes
qui représentent les verbes du domaine.
J'avoue que stocker une pile de commandes au lieu de l'entité semble un peu barbare.
Pour ma part, j'ai rarement eu besoin de revenir dans le temps pour retrouver l'état de mon entité à un instant T. Mais il est vrai que je fais souvent transiter des DTO avec trop d'information sans raison, au lieu de ne faire transiter que le delta.
Je pense que réaliser un framework qui est capable de calculer le delta entre 2 entités, ou de merger le delta, ne doit pas être si compliqué que cela (à la automapper).
Si on admet que l'entité que l'on voit est déjà obsolète (ce que nous dit bien Udi à propos de Data staleness), et si l'ont veut faire l'analogie avec SVN, on peut alors considérer que tu travailles avec une "working copy" de ton entité, et qu'elle possède une référence vers son état précédent:
Je m'explique :
La commande ne contient que les parametres d'entrée. Le changement
impliqué dépendra de plusieurs parametres :
Etat actuel de l'aggregat,
Contenu de la commande,
Logique métier actuelle.
Si le code métier est redéployé, la suite de commande risque de mener
à un état actuel différent (et les divergences risquent de
s'accumuler).
Pour cette raison, on prefère sauver les evenements qui résultent de
l'appel de la commande.
Ils capturent alors l'état actuel de la logique métier indépendément
des changements futurs de cette logique.
Par exemple, dans notre resto, imaginons qu'on calcule la tva sur les
commandes..
Avant le 1er juillet dernier, la commande EmitBill comptait une tva à
19,6.
Depuis le 1er juillet, elle compte une tva a 5.5
Si on rejout les commandes d'avant le 1er juillet, il faut prendre en
compte l'ancienne tva et utiliser la nouvelle pour les commandes qui
datent d'après. Ceci peut obliger à utiliser des objets temporels ce
qui complique pas mal le code, en particulier si ce type de changement
n'a pas été anticipé.
En sauvant les commandes, on aura un evenement BillEmited { TvaRate :
19,6%, TotalTva : 5€ } pour les commandes appelées avant le 1er
juillet et BillEmited { TvaRate: 5,5%, ToalTva 2€ } pour les autres.
Il sera alors inutile d'utiliser des objets temporels.
L'autre point important est que l'on n'a pas besoin de déterminer si
l'objet à changer.. on emet un changement ou l'on en emet pas :
public void Move(Address newAddress)
{
if (adress == currentAddress)
return;
var event = new UserMoved { Address = newAddress, Far =
IsMovingFar(address, newAddress) };
OnUserMoved(event);
SaveAndPublish(event);
}
private void OnUserMoved(UserMoved event)
{
address = event.address;
}
Ici, meme si la logique IsMovingFar change, le résultat est sauvé dans
les evenements passés.
On voit ici que le pattern repose sur CQS.
La préparation de l'évenement ne change pas l'état du système (Q),
L'application de l'évenement n'utilise pas l'état actuel du système et
ne retourne rien (C).
On a une correspondance exacte entre le changement interne de l'objet
et ce qui est publié.
[Au fait, CQRS != Event Sourcing, on peut faire du CQRS sans event
sourcing et de l'event sourcing sans CQRS ]
jeremie / thinkbeforecoding
On 1 avr, 12:16, Guillaume JAY <guillaume....@gmail.com> wrote:
> 2010/4/1 Mathias Kluba <mathias.kl...@gmail.com>
Attention, en event sourcing, on ne sauve pas les commandes, mais les
evenements.
Ensuite, on ne sauve pas la différence d'état, mais le changement
métier qui est intervenu..
Mais après, ce genre de chose est à l'appréciation de chacun...
jeremie / thinkbeforecoding
On 2 avr, 11:04, Guillaume JAY <guillaume....@gmail.com> wrote:
> 2010/4/1 Jérémie Chassaing <jeremie.chassa...@thinkbeforecoding.com>
>
> > Attention, en event sourcing, on ne sauve pas les commandes, mais les
> > evenements.
> > Ensuite, on ne sauve pas la différence d'état, mais le changement
> > métier qui est intervenu..
>
> Merci pour l'exemple, ca correspondait bien a ce que je voyais, en fait (sur
> evenement, plutot que commande), et c'est tres parlant pour du CQRS réel
>
> Sinon, par rapport a ce que tu me disais deux emails avant, sur "Pas de
> setters sur metier"
> Je viens de lire ceci :http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/03/31/stren...
> et ceci
> " *operations can be generally divided into two categories: data operations
> and behavioral operations*. For data operations, where Fee has a Comments
On Apr 2, 11:01 am, Jérémie Chassaing
> > Guillaume- Hide quoted text -
>
> - Show quoted text -