È un servizio di dominio utilizzato per calcolare un valore (potrebbe essere oggetto, elenco ecc.) che non è una variabile di istanza di un'entità / valore?

3

Stavo leggendo questo articolo recentemente: link

Lo scrittore consiglia una classe come questa:

public sealed class AtmService // Domain service
{
    public void WithdrawMoney(Atm atm, decimal amount)
    {
        if (!atm.CanDispenseMoney(amount))
            return;
        decimal amountWithCommission = atm.CalculateAmountWithCommission(amount);
        Result result = _paymentGateway.ChargePayment(amountWithCommission);
        if (result.IsFailure)
            return;
        atm.DispenseMoney(amount);
    }
}

Perché il metodo WithdrawMoney non va nella classe ATM anziché nella classe ATMService? Sicuramente questo è quasi tanto grave quanto mettere tutta la logica di dominio nel servizio dell'applicazione?

D1) È una pratica scorretta utilizzare un oggetto dominio A (o un elenco di oggetti dominio A in un oggetto dominio B quando l'oggetto dominio A (o l'elenco dell'oggetto dominio A) non è una variabile di istanza dell'oggetto dominio B? Ad esempio :

public class Customer
{
   bool valuedCustomer=false;

   public void IsValuedCustomer (List<Order> orders)
   {
      if (orders.Count > 100)
      {
           //Do some more logic here e.g. look how much they have spent etc
           valuedCustomer = true;
      }
   }
}

Qui l'Elenco ordini viene passato alla classe Cutomer in modo che possa essere determinato se sono un cliente stimato.

Q2) È un servizio di dominio appena usato per calcolare un valore (potrebbe essere oggetto, elenco ecc.) che non è una variabile di istanza di un'entità / valore?

Aggiorna

In seguito alla risposta di Ewan. Diciamo che ho avuto una classe come questa:

public class Customer
    {
       List<Offer> offers = List<Offer>(); //this is the offers the customer is entitled to e.g. two offers out of ten.

       public void AssignOffers (List<Offer> offers)
       {
          //All available offers (say 100) are passed to this method
          //There is logic here to figure out what offers the person is   entitled to (this could be a LINQ query).  If the person is entitled to an offer then add it to the instance variable list
       }
    }
    
posta w0051977 13.08.2017 - 11:40
fonte

2 risposte

2

Questo è un bizzarro esempio. Penso che la cosa fondamentale, e il motivo sia un servizio, è l'uso di _paymentGateway.

Secondo me, i servizi di dominio vengono utilizzati quando si ha un'operazione che attraversa contesti limitati.

Hai la tua radice aggregata ATM, con Banche e quant'altro e un PaymentGateway con Pagamenti e simili.

Non vuoi combinare questi in un unico contesto aggregato / limitato ma hai un'operazione che richiede oggetti da entrambi. Hai bisogno di qualche oggetto in cui raggruppare la logica di attraversamento del dominio, quindi inventi un 'ATMService' e inseriscilo lì.

Non è un oggetto di dominio a sé stante perché non ha dati, solo metodi.

Come dici tu, anche se è un nome strano avere un servizio e un oggetto entrambi chiamati ATM e non è chiaro perché PaymentGateway si troverà in un contesto limitato per ATM

    
risposta data 13.08.2017 - 12:39
fonte
0

re: IsValuedCustomer (Elenca ordini)

Questo è un metodo "cattivo" perché:

  • L'ordine dovrebbe far parte della radice di aggregazione del cliente. In tal caso non è necessario inoltrare gli ordini.

  • OrderCollection è un DomainObject nel qual caso puoi avere OrderCollection.IsValuedCustomerId (string customerId)

  • Il cliente è un DomainService, nel qual caso non dovrebbe avere i dati dei clienti e la denominazione è dispari.

Tuttavia, detto questo, se si stesse adottando un approccio ADM in cui Order era semplicemente un oggetto struct o data transfer. Avere un ICustomerValuationService.ValueCustomerFromOrders () potrebbe essere un buon approccio.

In questo caso, l'ordine è il tuo oggetto dominio e il cliente è un servizio dominio

Tuttavia, questo non sarebbe il DDD "classico" (per mancanza di un termine migliore) secondo me. Credo che si presuma che tu stia programmando un'app OOP in stile monolite in cui tutto è conservato in memoria e quindi non è necessario passare oggetti di dati in giro.

    
risposta data 13.08.2017 - 15:12
fonte

Leggi altre domande sui tag