My question is, for reassurance, that there is no way to use dependency inversion without sharing complex classes or applying an adapter between the 2 layers?
No, ci sono certamente modi per usare il principio di inversione delle dipendenze senza condividere classi complesse. Condividi semplici messaggi.
Se metti un adattatore tra due strati quello che hai è un terzo livello. Questa non è una brutta cosa a patto che il livello sia utile e focalizzato.
@Metafight ha esattamente ragione. I DTO (o gli oggetti valore ) possono essere passati in giro. Ma ...
Tipi di reso? Chi ha detto che dovevi tornare?
The Clean Architecture
Uno dei trucchi più accurati che ho visto che segue il principio di inversione delle dipendenze è il diagramma del plugin nel in basso a destra qui:
Ciòconsentealflussodicontrollodiiniziarenellivelloesterno,immergersinellostratointernoetornaredinuovonellostratoesterno.Tuttosenzadoverrestituireunacosa.Unmessaggiomoltosemplicepuòessereinviatoinquestomodo.Ecco un esempio .
Non lo sa, non lo vuole sapere
I am confused about Dependency Inversion in general. Lets's say we have 2 layers: Layer0 the low level layer, and Layer1 the high level layer. Layer1 should define the abstract interface, and Layer0 should implement it. However if Layer1 requires other types then the built in types, then in order to use Dependency Inversion I must extract the complex types into a separate library and use those types in both layers.
La cosa fondamentale qui è che il livello di alto livello non conosce affatto il livello di basso livello. Il livello di alto livello definisce le interfacce con cui può ascoltare o parlare senza sapere cosa c'è dall'altra parte. Lo strato di basso livello è uno schiavo di queste interfacce. Non li possiede ma deve abbinarli. Ciò significa che il livello di basso livello può essere completamente sostituito senza che il livello di alto livello venga cambiato affatto.
Quindi cosa significa questo per DTO? Il livello più alto che conosce il DTO definisce la sua interfaccia. Tutto ciò che in alto e in basso può conoscere l'interfaccia e utilizzare il DTO. Tuttavia, qualsiasi cosa abbia costruito il DTO è ciò che definisce la sua implementazione.
Le DTO non devono essere complicate. Possono diventare complicati se non tieni i casi d'uso concentrati e semplici.