Iniezione delle dipendenze - Tipi di reso

1

Sono confuso su Dependency Inversion in generale. Diciamo che abbiamo 2 livelli: Layer0 il livello di basso livello e Layer1 il livello di alto livello. Layer1 dovrebbe definire l'interfaccia astratta e Layer0 dovrebbe implementarlo. Tuttavia se Layer1 richiede altri tipi, i tipi incorporati, quindi per usare Dependency Inversion devo estrarre i tipi complessi in una libreria separata e usare quei tipi in entrambi i livelli.

La mia domanda è, per sicurezza, che non c'è modo di usare l'inversione di dipendenza senza condividere classi complesse o applicare un adattatore tra i 2 livelli?

    
posta Icebraker 28.12.2016 - 15:36
fonte

2 risposte

1

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.

    
risposta data 29.12.2016 - 00:01
fonte
2

L'inversione di dipendenza si verifica quando il punto di dipendenza del tempo di compilazione è nella direzione opposta rispetto alla dipendenza in fase di esecuzione.
Anche senza classi quando modifichi l'astrazione (qualche interfaccia), allora entrambi i livelli devono essere ricompilati.
Quindi, a meno che i tipi complessi non contengano alcuna funzionalità che possono essere e fanno parte dell'astrazione.

----------------------
|                    |
|    Higher layer    |
|                    |    
----------------------  
         |
         | Higher layer depends on abstraction
         |
         V
--------------------------------
|                              |
|    Abstraction and classes   |
|                              |    
--------------------------------  
         ^
         |
         | Lower layer depends on abstraction
         |
----------------------
|                    |
|    Lower layer     |
|                    |    
----------------------  

Quindi la dipendenza del tempo di compilazione del livello inferiore continua a puntare "su" (diversa dalla dipendenza di runtime), il che significa che stai ancora utilizzando "inversione di dipendenza".

    
risposta data 28.12.2016 - 16:12
fonte

Leggi altre domande sui tag