Ho bisogno di una guida esperta. Sto cercando di apprendere i concetti e di implementarli, ed è possibile che io possa essere un po 'troppo ingegnoso. Ma va bene, perché voglio imparare e acquisire esperienza più che mantenerlo semplice. Mi piacerebbe applicare i concetti di DDD e CQRS nel mio progetto ma ho difficoltà a capire come mettere tutto insieme. Devo progettare e implementare il contesto limitato ItemManagement, che fa parte di un sistema più grande.
Innanzitutto, ci sarà un'applicazione web MVC che gli utenti possono utilizzare per gestire l'inventario degli articoli. Alcuni casi di utilizzo di base sono creazione, modifica, check-in / check-out.
Successivamente, voglio un'API Web esterna che questo sito utilizzerà per interrogare i dati e rispondere ai comandi (e anche essere disponibile per altri contesti limitati).
Mettere insieme queste due cose è dove ho bisogno di una guida, specialmente con il comando. Il modo in cui ho immaginato è che posso inviare oggetti comando al rispettivo URL dell'API, ad esempio api / v1 / items / create, api / v1 / items / {id} / edit, api / v1 / items / {id} / checkin, api / v1 / items / {id} / checkout. Ma poi rimango bloccato. Dopo aver ricevuto un comando nell'API, quali passi vengono seguiti per applicare il comando a un'entità di dominio, convalidare le eventuali regole aziendali e in definitiva mantenere le modifiche? Ecco come lo stavo immaginando
public class Item
{
public int Id { get; private set; }
public string ItemName { get; private set; }
public bool Available { get; private set; }
public Item(int id, string itemName, bool available)
{
Id = id;
itemName = ItemName;
Available = available;
}
public Item(CreateItemCommand command)
{
Id = command.Id;
ItemName = command.ItemName;
Available = command.Available;
}
public void Edit(EditItemCommand command)
{
ItemName = command.ItemName;
Available = command.Available;
}
public void CheckIn()
{
Available = true;
}
public void CheckOut()
{
Available = false;
}
}
public class CreateItemCommand
{
public int Id { get; private set; }
public string ItemName { get; private set; }
public bool Available { get; private set; }
}
public class EditItemCommand
{
public int Id { get; private set; }
public string ItemName { get; private set; }
public bool Available { get; private set; }
}
Quindi, nelle mie azioni API, gestivo questi comandi come tali:
Crea
Item item = new Item(createCommand);
_repository.Add(item);
Modifica
Item item = _repository.Get(id);
item.Edit(editCommand);
_repository.Save(item);
Checkout
Item item = _repository.Get(id);
item.CheckOut();
_repository.Save(item);
Non c'è nessuno in questo esempio, ma qualsiasi violazione invariante di dominio comporterebbe un'eccezione generata dal modello di dominio e in definitiva tornando al client sotto forma di errore 500.
Sono sulla strada giusta qui o sono fuori dalla giusta forma / pratica? Grazie mille per il tuo tempo.