Come scegliere tra l'uso di un evento di dominio, o lasciare che il livello applicativo orchestri tutto

26

Sto impostando i miei primi passi nel design guidato dal dominio, ho comprato il libro blu e tutto il resto, e mi ritrovo a vedere tre modi per implementare una determinata soluzione. Per la cronaca: non sto usando CQRS o Event Sourcing.

Diciamo che una richiesta utente arriva nel livello di servizio dell'applicazione. La logica aziendale per tale richiesta è (per qualsiasi motivo) separata in un metodo su un'entità e un metodo su un servizio di dominio. Come dovrei andare a chiamare quei metodi?

Le opzioni che ho raccolto finora sono:

  • Lascia che il servizio applicativo chiami entrambi i metodi
  • Utilizzare il metodo injection / double dispatch per iniettare il servizio di dominio nell'entità, lasciando che l'entità faccia la cosa e poi lasciare che chiami il metodo del servizio di dominio (o viceversa, lasciando che il servizio di dominio chiami il metodo su l'entità)
  • Aumentare un evento di dominio nel metodo entità, un gestore di cui chiama il servizio di dominio. (Il tipo di eventi di dominio di cui sto parlando sono: link )

Penso che siano tutti fattibili, ma non sono in grado di scegliere tra di loro. Ci ho pensato a lungo e sono giunto al punto in cui non vedo più le differenze semantiche tra i tre. Conosci alcune linee guida quando usare cosa?

    
posta dvdvorle 11.10.2012 - 14:04
fonte

1 risposta

17

Let the application service call both methods

Il servizio di applicazione di solito è un ottimo punto di partenza per questo, tuttavia dovresti sempre cercare di spostare il comportamento il più vicino possibile all'entità. Il servizio applicativo svolge un ruolo di orchestrazione e imposta le basi per l'esecuzione del comportamento del dominio e in quanto tale fornisce tutte le dipendenze richieste. Tuttavia, quando possibile, dovrebbe delegare il comportamento al modello di dominio.

Use method injection/double dispatch to inject the domain service into the entity, letting the entity do it's thing and then let it call the method of the domain service (or the other way around, letting the domain service call the method on the entity)

Questo è un approccio migliore perché più del comportamento è delegato all'entità o al servizio di dominio. Il modo più disaccoppiato per implementare questo è avere un'entità che esprima una dipendenza da un servizio come parametro del metodo che fornisce il comportamento in questione.

Raise a domain event in the entity method, a handler of which calls the domain service.

Il pattern degli eventi di dominio, come spiegato da Udi e anche da Evans stesso, è abbastanza versatile e può essere applicato in una varietà di scenari. Tuttavia ci sono alcune complicazioni che ne derivano. Innanzitutto, devi assicurarti di avere un ambito appropriato all'interno del publisher di eventi del dominio. La maggior parte delle volte, i gestori di eventi del dominio avranno dipendenze e se si sta utilizzando un contenitore IoC, è necessario assicurarsi che vengano iniettate istanze appropriate. Ad esempio, in un'applicazione Web, l'attributo [ThreadStatic] è problematico per l'ambito. Un'altra complessità è quella dei confini trascrizionali. Devi prendere in considerazione le transazioni, perché se un'entità genera un evento di dominio, ma un successivo commit al database fallisce, tutti i gestori di eventi di dominio avranno bisogno di un modo per eseguire il rollback, altrimenti finirai per generare un evento non valido. Se tuttavia queste basi sono coperte, gli eventi di dominio sono un ottimo modello per incapsulare la logica di dominio all'interno delle entità stesse.

La differenza tra l'approccio 2 e 3 dipende dal caso d'uso. Un evento di dominio si applica quando vuoi invocare comportamenti aggiuntivi in risposta a un evento, che è al passato . Questo è un vincolo importante, poiché il gestore di eventi del dominio non può influenzare il comportamento dell'entità. D'altra parte, con l'approccio 2, il servizio iniettato ha il potenziale per influenzare il comportamento perché è dichiarato una dipendenza per quel particolare comportamento.

    
risposta data 23.10.2012 - 20:52
fonte

Leggi altre domande sui tag