Ho lavorato con DDD per alcuni mesi e mi sono imbattuto in alcune cose di cui non sono sicuro.Quali di questi esempi rappresentano l'uso corretto di DDD?
Prendi l'esempio semplicistico di aggiungere uno Product
a un oggetto Order
. Dal nostro controller, avremmo un int
passato tramite l'interfaccia utente che rappresenta un Product
nel database. Quale dei seguenti due esempi è corretto (fammi sapere se hanno entrambi torto)?
Esempio uno:
public class OrderController
{
// Injected Repositories
private readonly IProductRepository _productRepository;
// Called by UI
public void AddProduct(int productId)
{
Order order = ...; // Persisted Order
Product product = _productRepository.GetProduct(productId);
order.AddProduct(product);
}
}
Il controller crea un'istanza del prodotto stesso e lo aggiunge in via del metodo:
void AddProduct(Product product)
{
productList.Add(product);
}
Esempio due:
public class OrderController
{
// Injected Repositories
private readonly IProductRepository _productRepository;
// Called by UI
public void AddProduct(int productId)
{
Order order = ...; // Persisted Order
order.AddProduct(productId, _productRepository);
}
}
Il Order
modello di dominio ha il repository prodotto iniettato passati ad esso e si ottiene il prodotto e lo aggiunge:
Product AddProduct(int productId, IProductRepository productRepository)
{
Product product = productRepository.GetProduct(productId);
productList.Add(product);
return product;
}
Sono attualmente andato per il primo esempio, perché il modello di dominio non dovrebbe mai chiamare un metodo di servizio interno, tuttavia Ultimamente ho visto alcuni esempi che usano il mio secondo esempio e sembrano in ordine. Mi sembra che l'Esempio 1 sia quasi anemico. L'esempio due sposterebbe tutta la logica di aggiunta del prodotto nel modello di dominio stesso.
Sembra che il primo esempio porti un progetto verso il caricamento avido di dati e il secondo verso il caricamento lento. Quale di questi preferisci? –
Come viene salvato il tuo ordine dopo che il prodotto è stato aggiunto alla lista in memoria? C'è qualche cosa di magico (mi dispiace non so C# forse l'oggetto Ordine è un proxy gestito da un framework?) –