Sono nuovo di DDD e cerco di capirci qualcosa scrivendo un prototipo per un'applicazione (Core-Logic-Layer).
Il mio modello di dominio è simile a questo atm. (Ho estratto le parti, che non erano necessarie per il problema):
QuindiabbiamounaradiceaggregataDebitAccount
chehaassegnatoEstimations
(suicosti/entratechesiverificanoinundatointervallo).HaancheassegnatoPostings
chesièverificatofisicamente(costo/reddito)inunadeterminatadata.
UnPosting
puòverificarsiconunastimaassegnata(ades."Abbiamo i costi mensili per pagare l'affitto"), ma potrebbe anche non esistere ("Il mio blocco note si è rotto, quindi ho bisogno di acquistarne uno nuovo").
Ecco il codice (imho) necessario per implementare il modello:
public class DebitAccount : BaseEntity
{
protected ICollection<Estimation> _Estimations;
protected ICollection<Posting> _Postings;
public virtual IEnumerable<Estimation> Estimations
{
get
{
return new List<Estimation>(_Estimations);
}
}
public virtual IEnumerable<Posting> Postings
{
get
{
return new List<Posting>(_Postings);
}
}
public void Post(Posting posting)
{
var associatedEstimation = _Estimations.FirstOrDefault(e => e == posting.BelongsToEstimation);
if(associatedEstimation == null)
{
var now = _DateProvider.GetCurrentDate();
var guid = Guid.NewGuid();
associatedEstimation = new Estimation(new Posting[] { posting }, new Amount(0, _CurrencyProvider.GetDefaultCurrency()), posting.PostingName, new DayInterval(now, now, 0),new EstimationId(guid));
_Estimations.Add(associatedEstimation);
}
_Postings.Add(posting);
}
public DebitAccount TransferAmountTo(DebitAccount to, Amount amount, string transferName)
{
var currentDate = _DateProvider.GetCurrentDate();
var fromPosting = new Posting(amount.Invert(),transferName, currentDate, null);
var toPosting = new Posting(amount.Clone() ,transferName, currentDate, null);
this.Post(fromPosting);
to.Post(toPosting);
return this;
}
}
Ci sono diversi problemi che sto affrontando:
-
Quando si chiama
Post
-Method di un account di debito, come ottenereEstimation
a cui appartiene la pubblicazione (se ce ne sono)? Nel codice dell'applicazione, è possibile ottenere tutte le stime dalla proprietà pubblica, trovare quella corretta e assegnarla alla registrazione corrente. Ma questo richiede al cliente di sapere che deve cercare la stima nella proprietà. -
Il prossimo problema è simile al primo: quando si trasferisce su un altro
DebitAccount
, come trovare il corrispondenteEstimation
(se esiste)? -
TransferTo
-Function: dove e come persistere entrambiDebitAccounts
. Deve assumere il codice chiamante (ad esempio il livello applicazione), che implicitamente il% passatoDebitAccount
(to
) è stato modificato (call-by-reference) e semplicemente persistono entrambi in un repository?
Come potrebbero essere affrontati questi problemi? O forse ho sbagliato e il mio design DDD è difettoso? Qualsiasi idea, commento e pensiero è apprezzata :)