Sto tentando di creare un front-end Web basato sul pattern MVC, anziché sulla base delle librerie coinvolte (ad esempio React.js).
Sto utilizzando l'integrazione delle dipendenze basata sul costruttore e le interfacce per disaccoppiare le implementazioni di ciascun elemento (di MVC), ma questo lascia comunque una dipendenza circolare.
- Il controller dipende dal modello (per rispondere agli eventi dell'utente finale).
- Il modello dipende da Visualizza (per ri-renderizzare il modello aggiornato).
- La vista dipende da React Component (per l'implementazione).
- Il componente di reazione dipende dai metodi del controller (per consentire l'input dell'utente finale).
Ho infranto questa dipendenza circolare usando l'iniezione di dipendenza basata sul mutatore con la vista, in questo modo:
view = new View()
model = new Model(view)
controller = new Controller(model)
component = new Component(controller.onClick)
view.component = component
... che funziona, ma mi lascia un problema.
Poiché la dipendenza del componente nella vista è iniettata da un mutatore, non sarà disponibile (per l'uso) fino a quando l'iniezione non si verifica effettivamente.
Eppure il mio modello sta facendo un'inizializzazione prima che l'iniezione del mutatore avvenga e poiché la vista non ha un componente per funzionare, non fa nulla (finché non ha un componente).
Sto pensando di poterlo risolvere memorizzando gli aggiornamenti in attesa della vista (all'interno dell'implementazione View) e poi riproducendoli in ordine quando il componente diventa disponibile.
C'è un approccio migliore a questo?
Modifica 1
Grazie a John per aver segnalato che ho il mio modello < - > Visualizza le dipendenze nel modo sbagliato.
Tuttavia, se li aggiusto per ottenere questo:
model = new Model()
controller = new Controller(model)
component = new Component(controller.onClick)
view = new View(model, component)
... che mi consente di utilizzare l'iniezione delle dipendenze basata sul costruttore tutt'intorno, ma il mio problema originale persiste ancora.
vale a dire. Se il mio modello esegue un'inizializzazione prima che la View si iscriva alle sue trasmissioni di aggiornamento, quelle trasmissioni iniziali non lo faranno alla View (e quindi all'utente finale).
Penso che dovrò provare a ritardare queste inizializzazioni del Modello fino a dopo che la Vista si è abbonata agli aggiornamenti del Modello.
Mi manca un altro approccio?