2010-11-10 5 views
5

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.

+0

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? –

+0

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?) –

risposta

2

secondo è orribile ...

Aggiunta di un prodotto su ordinazione non dovrebbe avere il repository sulla sua firma dal repository non è parte del dominio.

Tendo ad andare con il primo.

+0

In realtà Deposito ** Le interfacce ** fanno parte del dominio. L'implementazione concreta fa parte dell'infrastruttura di dominio: http://dddsample.sourceforge.net/architecture.html – GenericTypeTea

+0

Quando vai al supermercato e prendi un oggetto e aggiungi al carrello, specifichi un repository? Sì, il repository può essere pensato come parte del dominio dell'infrastruttura ma non del dominio aziendale. – Aliostad

+0

No, sono troppo occupato nell'implementazione di 'IWheel'. Ma mi piace il tuo esempio :). Pensavo che sembrasse strano; rende tutto più ordinato ma non sembra soddisfare le regole come le ho capite. – GenericTypeTea

1

Sì Buddy In primo luogo si è meglio ...

Come se pensiamo in forma di oggetti ...

Aggiungendo il prodotto alla lista non ha nulla a che fare con il repository del prodotto, si deve prendere solo il prodotto.

+0

è in realtà un prodotto, è stato un errore di battitura – Genius