Sto osservando uno scenario per la creazione di un'istanza aggregata da un trigger e un aggregato diverso.
Ho incorporato qualche logica nel mio DDD
e Event Sourcing
con Onion architecture
scenario di apprendimento intorno alla registrazione dell'utente e alla creazione di un account utente.
Attualmente ho una semplice istanza di classe di registrazione che ha un numero di attributi intorno a Indirizzo e nome e-mail. Questo al momento ha un singolo metodo chiamato Activate.
Quando è attiva la registrazione , deve essere creato un account .
Internamente, sto registrando eventi sulle varie azioni.
public partial class NewRegistration : EventSourcedAggregate
{
internal NewRegistration(
string organisationName,
AccountContact contact)
{
OrganisationName = organisationName ?? throw new ArgumentNullException(nameof(organisationName));
Contact = contact ?? throw new ArgumentNullException(nameof(contact));
RequestedDate = SystemClock.Current.GetCurrentUtcDateTime();
Apply(new RegistrationCreated(
OrganisationName,
Contact.EmailAddress.ToString(),
Contact.Name.GivenName,
Contact.Name.FamilyName,
RequestedDate));
}
NewRegistration(Guid id, int version)
: base(id, version)
{
}
public string OrganisationName { get; private set; }
public AccountContact Contact { get; private set; }
public string ActivationCode { get; private set; }
public DateTime RequestedDate { get; private set; }
public DateTime? ActivatedDate { get; private set; }
public void ChangeActivationCode(string activationCode)
{
if (ActivatedDate.HasValue) throw new InvalidOperationException("The registration has already been activated");
if (activationCode != ActivationCode)
{
Apply(new ActivationCodeChanged(activationCode));
}
}
public void Activate()
{
Apply(new RegistrationActivatedEvent(SystemClock.Current.GetCurrentUtcDateTime()));
}
protected sealed override void Apply(DomainEvent changes)
{
When((dynamic)changes);
}
private void When(ActivationCodeChanged activationCodeChanged)
{
ActivationCode = activationCodeChanged.ActivationCode;
}
private void When(RegistrationActivatedEvent registrationActivatedEvent)
{
ActivatedDate = registrationActivatedEvent.ActivationDate;
}
}
Sebbene quanto sopra sia memorizzato in una tabella SQL, non realizza completamente l'Event Sourcing - poiché avrà sempre un solo record che verrà aggiornato solo se l'utente resetta il codice di attivazione.
Quindi, quando viene attivata la registrazione, ho bisogno di creare una nuova istanza di account. Attualmente vedo Registrazione e Account come parte dei clienti bounded context
. Ritengo che la registrazione e gli account siano due percentuali separate domains
/% co_de all'interno del contesto: potrei sbagliarmi! Avevo anche la sensazione che l'account potesse essere un sub-domains
, sebbene leggessi post sul blog di Udi Dahans quando non usare CQRS Mi sento un po 'deluso da quello che stavo progettando.
Ora ci sono diversi modi per implementarlo. Il mio primo pensiero è stato semplicemente gestirlo in un Event sourced aggregate
. In genere metterei questa logica qui mentre coordinano le cose. Ciò richiederebbe il Application Service
e il INewRegistrationRepository
iniettati - per copiare le informazioni dall'una all'altra.
Abbiamo utilizzato molti servizi applicativi al lavoro e sono diventato impantanato nel numero che abbiamo a causa del modo in cui la nostra logica di business è (gestori statici, helper, infrastruttura mescolata con un modello di dominio anemico.
Ma stavo leggendo un po 'su Process Managers e Sagas, I che mi ha un po' confuso e ha fermato i miei pensieri per quel giorno.
Sono tutto per mantenere le cose semplici, e questa è una parte semplice di un'implementazione di dominio che sto guardando. Mi sento un po 'sopraffatto con i servizi applicativi: il gestore dei domini di dominio o Saga si adatta meglio a questo scenario.
In che modo i professionisti di DDD guardano qui all'implementazione di uno scenario del genere?