CONTEXTE: J'ai un objet domaine Person. C'est une racine agrégée. J'ai inclus une partie de la classe ci-dessous. J'expose des méthodes pour effectuer les comportements d'objets. Par exemple, pour ajouter un BankAccount, j'ai la méthode AddBankAccount(). Je n'ai pas inclus toutes les méthodes de la classe, mais il suffit de dire que toute propriété publique doit être mise à jour en utilisant une méthode.Domain Driven Design - Comment gérer les mises à jour pour certaines parties de vos racines agrégées
Je vais créer un référentiel IPerson pour gérer les opérations CRUD.
public interface IPersonRepository
{
void Save(Person p);
//...other methods
}
QUESTION: Comment puis-je dire le dépôt quels champs doivent être mis à jour lorsque nous mettons à jour une personne existante? Par exemple, si j'ajoute un compte bancaire à une personne existante, comment puis-je communiquer cette information au référentiel lorsque repository.Save() est appelée?
Dans le référentiel, il est facile de déterminer quand une nouvelle personne est créée, mais lorsqu'une personne existante existe et que vous mettez à jour des champs sur cette personne, je ne sais pas comment la communiquer au référentiel.
Je ne veux pas polluer mon objet Person avec des informations sur les champs qui sont mis à jour.
Je pourrais avoir des méthodes séparées sur le dépôt comme .UpdateEmail(), AddBankAccount() mais cela semble être trop. Je voudrais une méthode simple .Save() sur le référentiel et il détermine ce qui doit être mis à jour d'une manière ou d'une autre.
Comment les autres ont-ils géré cette situation?
J'ai fait des recherches sur le web et stackoverflow mais je n'ai rien trouvé. Je ne dois pas chercher correctement parce que cela semble quelque chose de simple quand il s'agit de la persistance dans le paradigme DDD. Je pourrais aussi être loin de ma compréhension de DDD :-)
public class Person : DomainObject
{
public Person(int Id, string FirstName, string LastName,
string Name, string Email)
{
this.Id = Id;
this.CreditCards = new List<CreditCard>();
this.BankAccounts = new List<BankAccount>();
this.PhoneNumbers = new List<PhoneNumber>();
this.Sponsorships = new List<Sponsorship>();
}
public string FirstName { get; private set; }
public string LastName { get; private set; }
public string Name{ get; private set; }
public string Email { get; private set; }
public string LoginName { get; private set; }
public ICollection<CreditCard> CreditCards { get; private set; }
public ICollection<BankAccount> BankAccounts { get; private set; }
public ICollection<PhoneNumber> PhoneNumbers { get; private set; }
public void AddBankAccount(BankAccount accountToAdd, IBankAccountValidator bankAccountValidator)
{
bankAccountValidator.Validate(accountToAdd);
this.BankAccounts.Add(accountToAdd);
}
public void AddCreditCard(CreditCard creditCardToAdd, ICreditCardValidator ccValidator)
{
ccValidator.Validate(creditCardToAdd);
this.CreditCards.Add(creditCardToAdd);
}
public void UpdateEmail(string NewEmail)
{
this.Email = NewEmail;
}
Bonjour, je vois que personne n'a vraiment répondu à votre question. Eh bien, au moins, je ne pense pas que dire "utiliser un ORM" est une solution. Qu'avez-vous fini par faire? –