Le entità di dominio dovrebbero dipendere dalle fabbriche?

0

Vedi il codice qui sotto:

public IEnumerable<DenominationNumberRequired> CalculateDenominationsFor(int cost) 
    {
        var target = cost;
        foreach (var denomination in currency.AvailableDenominations.OrderByDescending(a => a))
        {
           var numberRequired = target / denomination;
           if (numberRequired > 0)
           {
               yield return new DenominationNumberRequired(denomination, numberRequired);
           }
           target = target - (numberRequired * denomination); 
        }
    } 

Si noti che questo oggetto dominio è responsabile della creazione degli oggetti DenominationNumberRequired anche se non è una fabbrica. Devo iniettare una fabbrica in questa entità per creare gli oggetti DenominationNumberRequired? Ciò sembra suggerire che non dovrei: link . Tuttavia, allo stesso modo; un oggetto dominio che crea altri oggetti di dominio non sembra giusto a causa del principio di responsabilità singola.

    
posta w0051977 14.12.2017 - 15:15
fonte

1 risposta

0

Should I be injecting a factory into this entity to create the Offer object?

Risposta breve: Probabilmente no.

La fabbrica può essere una buona idea senza iniettarla nell'entità Membro.

Ad esempio, puoi passarlo come argomento al metodo

public IEnumerable<DenominationNumberRequired> CalculateDenominationsFor(int cost, Factory<DenominationNumberRequired> factory) 
    {
        var target = cost;
        foreach (var denomination in currency.AvailableDenominations.OrderByDescending(a => a))
        {
           var numberRequired = target / denomination;
           if (numberRequired > 0)
           {
               yield return factory.create(denomination, numberRequired);
           }
           target = target - (numberRequired * denomination); 
        }
    } 

Questo potrebbe essere un vantaggio se vuoi una maggiore flessibilità nei tipi delle tue denominazioni; nel tuo esempio, CalculatedDenominationsFor in realtà non interessa affatto il tipo, quindi potresti invece scrivere ....

public IEnumerable<T> CalculateDenominationsFor(int cost, Factory<T> factory) 

Nel caso in cui tu abbia effettivamente dei vincoli sul tipo (perché hai bisogno di accedere ai metodi nell'interfaccia), potresti rendere la firma più specifica

public IEnumerable<T> CalculateDenominationsFor(int cost, Factory<T> factory) where T : DenominationNumberRequired

(Dichiarazione di non responsabilità: programmatore JVM che tenta di indovinare le ortografie in C #).

Are you saying that the factory instance should be created in the application service and passed to the domain layer?

Potresti farlo - per quanto riguarda l'applicazione, la fabbrica è solo una maniglia opaca che dovrebbe passare quando sarà il momento. E sì, nel far ciò, finisci per passare la maniglia attraverso molti luoghi a cui non importa molto.

Potrebbe essere un suggerimento che i tuoi limiti non siano nei posti giusti, o che tu non stia usando le astrazioni giuste come argomenti.

    
risposta data 14.12.2017 - 16:34
fonte

Leggi altre domande sui tag