Come fa una classe isolata (o un gruppo di classi isolate) ad inserirsi in un modello di dominio?

3

Sto cercando di ridefinire un'applicazione complessa e grande per usare i principi DDD come e quando avrò tempo.

Ho una classe, che è completamente isolata dal dominio (è usata solo da un servizio applicativo) ma fa parte del linguaggio ubiquitario. Sembra questo (una vecchia versione di esso):

public class CurrencyCalculator
{
    private readonly ICurrency currency;

    public CurrencyCalculator(ICurrency currency)
    {
        this.currency = currency;
    }

    public IEnumerable<KeyValuePair<int, int>> 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 KeyValuePair<int, int>(denomination, numberRequired);
           }
           target = target - (numberRequired * denomination); 
        }
    } 
}

La classe ha un front-end Web e un'applicazione front-end ed è utilizzata dai cassieri.

Così com'è; questa classe esiste in un progetto di libreria di classi a sé stante (con classe di valuta e interfaccia). Questo è un esempio di un servizio di dominio in terminolgia DDD ? (domanda principale) Dovrebbe essere in una libreria di classi chiamata: Core? (il nucleo dell'applicazione). Se la risposta è no, qual è questa classe - un'utilità?

Il motivo per cui lo chiedo è perché recentemente ho migliorato il mio modo di pensare a questo dominio. Tuttavia, non riesco a vedere come questa classe molto semplice si adatti al mio modello di dominio.

Aggiorna

Prima di rispondere; Ho due ulteriori pensieri:

1) La mia comprensione di un servizio di dominio è che viene utilizzata quando la logica non è adatta per un'entità e la logica si estende su più contesti / radici aggregate. È normale disporre di un servizio di dominio, che non fa riferimento a entità o oggetti valore (come in questo caso)?

2) Questa specifica applicazione è basata su CRUD e questa è l'unica classe Dominio. Pertanto sto pensando di spostarlo dal progetto Core (modello di dominio) al servizio di applicazione per semplificarlo. Immagino che questo potrebbe infrangere le regole DDD?

    
posta w0051977 21.02.2018 - 21:05
fonte

3 risposte

1

Is this an example of a domain service in DDD terminolgy?

Direi di sì.

Should it be in a class library named: Core? (the Core of the application).

Non so che tipo di libreria sia Core. Ma dovrebbe essere proprio lungo tutte le altre Entità o Servizi.

Cosa che mi dà fastidio che sia il nome. CurrencyCalculator è un nome troppo generico. Lo chiamerei CurrenciesDenomination , quindi è chiaro che sta calcolando le denominazioni. E lo metterei in Currencies "module" nella libreria dei domini. Molto probabilmente proprio accanto all'interfaccia ICurrency .

Ed è vero che il metodo può essere trasformato in un metodo statico con i parametri ICurrency e cost . E potrebbe essere trasformato in un metodo di estensione. Ma dovrebbe ancora appartenere al dominio in Currencies "modulo". NON sarebbe un utility , comunque ciò significa.

    
risposta data 22.02.2018 - 08:43
fonte
0

Laiv lo ha sottolineato:

  1. It's pure (has no side effects)
  2. Has no domain logic
  3. Either has external dependencies since ICurrency is part of the domain (the domain of the library)
  4. Doesn't involves entities or value objects so it's fairly decoupled from the model.

Tuttavia, non sono sicuro se sia giusto vedere al # 3 questa classe isolata come "dominio" separato.
Se guardo tutti questi punti, quindi in termini di DDD mi appartiene per servizi .

When an operation does not conceptually belong to any object. Following the natural contours of the problem, you can implement these operations in services.

Vedi: definizione DDD .

    
risposta data 22.02.2018 - 08:45
fonte
0

Semplice. Questo è un servizio di dominio. Lo sappiamo perché conosce il tuo dominio. Currency è sicuramente un oggetto dominio. Inoltre, comprende una regola aziendale. Impone che nel caso in cui Cashier debba dare una variazione Customer , lo fa con il minor numero totale di corso legale. Se tale regola cambia, diciamo quando un Customer paga con un biglietto da 100 dollari e il cambiamento è maggiore di $ 50 Cashiers deve utilizzare due banconote da 20 dollari invece di un 50, dove altrimenti tale regola essere applicato? O cosa succede se, per qualche motivo, è stata stabilita una regola in base alla quale uno specifico Cashier poteva dare solo 1 dollaro come cambiamento? Ora avremmo bisogno di più metodi su questo servizio per consentire al consumatore di decidere come apportare modifiche.

Tutto ciò detto, ti suggerirei di pensare a lungo a quale servizio chiami, perché CurrencyCalculator non ha certamente mostrato il comportamento che pensavo avrebbe dovuto mostrare quando ho iniziato a leggere il tuo codice . Prendilo con un pizzico di sale, ma mi aspetterei un servizio che calcola la modifica che un Cashier dovrebbe restituire a Customer per includere in qualche modo quegli indizi di contesto nel nome.

    
risposta data 24.02.2018 - 07:44
fonte

Leggi altre domande sui tag