Ho una configurazione di applicazioni a 3 livelli di finanza personale come: UI, BLL e DAL. Il mio dominio ha il seguente aspetto:
// Write Model
public class Account
{
public Account(AccountId id)
{
_id = id;
}
public AddSubAccount(Account account)
{
// add subaccount to this account
}
// more business logic methods for accounts
private AccountId _id;
private List<Account> _subAccounts = new List<Account>();
}
// Read Model
public class AccountDTO
{
public AccountDTO(AccountId id, IEnumerable<AccountDTO> subAccounts, decimal balance)
{
Id = id;
SubAccounts = subAccounts;
Balance = balance;
}
public AccountId Id { get; }
public IEnumerable<AccountDTO> SubAccounts;
public decimal Balance { get; }
}
Poi ho un IAccountRepository
che gestisce il recupero di AccountDTO
e il salvataggio / eliminazione di Account
.
Il client quindi usa questo come:
// client -- view all accounts
var accounts = accountRepo.GetAllAccounts();
// client -- remove
var account = accountRepo.GetById(accountId);
accountRepo.Remove(account.Id);
// client -- add subaccount
var parentAccount = new Account(parentAccountId);
var subAccount = new Account(subAccountId);
parentAccount.AddSubAccount(subAccount);
accountRepo.Update(parentAccount);
Il problema è che alcuni dei miei account sono conti di investimento e voglio che vengano calcolati (giornalmente, settimanalmente, annualmente) per riflettere un valore di portafoglio accurato. Pertanto, invece di restituire un AccountDTO
con il saldo dei contributi delle transazioni, ho bisogno di utilizzare le quotazioni giornaliere per un portafoglio di fondi per calcolare quale sarà il saldo sul conto.
Ho letto che il modello di scrittura dovrebbe gestire questa logica in modo che il modello di query / lettura sia veloce. Tuttavia, non sono sicuro su dove archiviare questi dati. Avrebbe senso memorizzare questo nel database? Ho letto che non va bene a meno che tu non abbia milioni di righe.
Oppure, dovrei semplicemente salvare i contributi / transazioni e le quotazioni giornaliere nel database e quindi ricalcolare questo ogni volta? Se seguo questo percorso, suppongo di aver bisogno di un servizio di dominio tra il repository e il client?