Cum să implementați în mod corect utilizarea globală în preaplinul de expresie a aplicației expres în limba rusă

Pe scurt despre structura a ceea ce este. Când porniți aplicația

Șirul cere ("socket") (server) - conectează fișierul:

Acum, mai aproape de punct, aplicația are controale care sunt moștenite de la baza:







Și, de exemplu, există o nevoie în interiorul metodeiForPage () pentru a trimite un mesaj ca acesta:

Dar, variabila socket este disponibilă numai în io.on ('connection'). Cum poate fi pusă la dispoziție în cadrul operatorului? Sau cum să-l definiți în interiorul controlerului de bază, astfel încât acesta să fie disponibil în toate controalele?

Există încă un lucru, de exemplu, există o nevoie în interiorul controlerului pentru a seta evenimentul socket, de exemplu:

Și dorim să folosim proprietățile acestui controler pentru a efectua, de exemplu, scrierea datelor primite de la soclu la baza de date.

Este posibil să punem în aplicare toate cele de mai sus în această formă și, dacă da, ce ar trebui făcut pentru aceasta? Este aceasta abordare corectă?

a fost văzută ultima dată pe 22 decembrie 15 la ora 9:55

Există o mulțime de opțiuni. Îmi place arhitectura sub forma unui copac, în cazul în care există ceva ca un obiect zeu, din care toate modulele disponibile, care acționează ca un dispecer între ele și punctul unic de acces la toate părțile din prilozheniya.Obychno am avea fie minciuni în global, sau transmise tuturor constructori / module. Dar nu și faptul că aceasta este soluția cea mai bună, pentru fiecare caz specific, trebuie să te uiți separat. Să sperăm că veți scrie un răspuns complet pe această temă. - Darth Dec 22 '15 la ora 10:55







Vă confruntați cu problema caracteristică a abordării OOP: de unde obțineți dependențe?

Există mai multe modalități de a rezolva problema. Cea mai evidentă este utilizarea variabilelor globale. dar această opțiune este potrivită doar pentru proiecte sau proiecte foarte mici, care nu trebuie suportate. Despre motivul pentru care variabilele globale sunt dăunătoare, un număr foarte mare de articole diferite au fost deja scrise. Toate problemele provin dintr-un fapt foarte simplu: codul devine prea strâns legat. În consecință, aceasta duce la imposibilitatea de reutilizare a codului, la problemele legate de unitatea de testare, la dificultatea depanării aplicațiilor și așa mai departe. În proiectele medii și mari, toate acestea conduc după un timp la o astfel de dezordine, încât devine mai ușor să rescrieți totul de la zero.

În urma acestei abordări, trebuie să faceți următoarele:

Returnați instanța socket.io din funcția exportată în fișierul socket.js:

Declarați o instanță socket.io explicit ca fiind o dependență a controlorului de bază (sau a unui anumit agregator de rute):

Utilizați instanța socket.io în controlerele copil (sau căi reale):

În fișierul principal al proiectului, trimiteți dependențele în mod explicit (puteți utiliza containerul DI, dar acest lucru pare oarecum redundant):

Mulțumesc, pentru un răspuns foarte util și extins! Nu am încercat încă sfatul în practică, dar uitandu-se la codul, am apare o întrebare, se referă la punctul 4. Aici scrie că, în începutul fișierului de proiect, includem controler de copil și să-l pentru a inițializa o socket.io instanță , dar faptul că în proiectul meu controlerele sunt întotdeauna inițializate în router-ele: router.get ("/ fooBar", funcția (req, res) ); - sanu0074 23 decembrie '15 la ora 16:04

Și nu înțeleg foarte bine cum va funcționa acest lucru și de ce este necesar să inițializați controlorii copil în fișierul principal al proiectului (pot exista prea multe dintre ele) și cum vor fi req și res atunci să cadă în ele? Poate că fac totul greșit și structura proiectului este construită incorect, aș vrea foarte mult să mă îndrumi pe calea cea bună! - sanu0074 23 decembrie '15 la ora 16:04







Trimiteți-le prietenilor: