Come ottenere l'ID nel creare quando si applica CQRS?
-
08-10-2019 - |
Domanda
Il mio assumere CQRS è quando seguite rigorosamente i comandi non restituisce nulla (tipo restituito void), quindi il mio esempio è molto semplice: Come si fa a recuperare un ID per la creazione di qualcosa di
Per esempio quando si crea una transazione con carta di credito sembra piuttosto importante per restituire un ID di transazione, o durante la creazione di un cliente che sarebbe molto più facile se hai il cliente si è creato o la parte posteriore cliente id così un browser potrebbe passare automaticamente da un la pagina del cliente, per esempio.
Una soluzione potrebbe essere quella di prima chiedere un ID e quindi creare il cliente o transazione con quel ID, ma sembra piuttosto strano.
Qualcuno ha qualche esperienza con questo o ora come dovrebbe essere fatto nel modo più efficace? Forse ho frainteso qualcosa?
Soluzione
CQRS è tutto il fuoco e dimentica, e dal momento che sono molto affidabili GUID (basso rischio di collisione) non c'è nessun problema l'invio in un GUID che si genera la vostra auto.
La procedura sarebbe fondamentalmente:
- Crea il tuo comando
- Genera e assegnare la vostra identità (GUID) ad esso
- Fuoco del comando
- Ritorna l'identità precedente generata ??li>
Per saperne di più su GUID su Wikipedia
Altri suggerimenti
array / GUID / byte di integer id di qualsiasi dimensione può essere abbastanza affidabile in pratica, ma tutti non corrisponde al requisito teorico (collisioni avviene), mentre la soluzione teorica valida presente e può essere applicata la maggior parte del tempo.
mi piacerebbe formulare la soluzione come: nella cooperazione la propria identità sistema di pari-livello dovrebbe essere garantito dal sistema di un livello superiore. Sistema di livello superiore è quella che gestisce il ciclo di vita dei sistemi cooperanti.
Esempio :
class John
{
private readonly int id;
public John(int id)
{
this.id = id;
}
public void UseSite(Site site)
{
site.CreateAccount(id, "john");
site.SetPassword(id, "john", "123");
/* ... */
}
}
class Site
{
public void CreateAccount(int humanId, string accName) { /* ... */ }
public void SetPassword(int humanId, string accName, string pwd) { /* ... */ }
/* ... */
}
class Program
{
static void Main(string[] args)
{
Site s = new Site();
// It's easy to guarantee the identity while there's only one object
John j = new John(4);
Console.ReadLine();
}
}
Program
è il modulo di livello superiore. E 'responsabile per l'uso John
e Site
correttamente. Fornire John
con un identificatore unico è una parte di questa responsabilità.
Troverete che è impossibile o molto difficile da affrontare con l'identità di alcuni sistemi di vita reale, come un essere umano. Succede quando questi sistemi sono allo stesso livello di sistema. Esempio tipico è un essere umano e un sito web. Il tuo sito non avrà mai una garanzia che il diritto umano che richiede la pagina. In questo caso si dovrebbe utilizzare l'approccio probabilistico con un hash affidabile.