Modelul de injecție a dependenței și introducerea în cadrul ninject-di pentru

Articolul prezintă un exemplu de clase strâns legate, refacerea lor cu implementarea modelului de dependență de injectare (implementarea dependenței) și demonstrează utilizarea cadrului Ninject, care facilitează introducerea dependențelor.







Fiecare dintre noi a scris acest cod cel puțin o dată în viață. Iar cei care au sarcina de a verifica codul programatorilor novici pot vedea destul de des acest lucru. Din punct de vedere sintactic și logic, nu este nimic infracțional în el. Codul va funcționa perfect, executând tot ce se așteaptă de la el și absolut nimic nu trebuie să fie atins în el, dacă face parte dintr-un program format din cinci clase. Întrebările apar atunci când un astfel de cod apare într-un proiect real care are zeci de clase, are un ciclu de viață lung și este mai probabil să schimbe cerințele utilizatorului, modul în care sunt stocate datele sau echipamentul care este suportat.

Ce este rău? Pe scurt, dependența unei anumite clase de mașini de o anumită clasă de motoare. Imaginați-vă că se va schimba constructorul de clasă motor - în acest caz, va trebui să schimbați mașina. Sau, de exemplu, există un alt motor. Și că mașina ar putea să o folosească, din nou, trebuie să schimbi clasa Mașină. În plus, o astfel de dependență rigid programată reduce testabilitatea claselor - clasa Mașină nu poate fi testată separat de motor sau înlocuiește motorul cu un obiect fals, pentru a simula circumstanțe neprevăzute.

Ce se poate face pentru a îmbunătăți codul? Primul este să introduceți interfața IEngine, care va fi implementată de clasa Engine.

Apoi, schimbați clasa Mașină pentru a utiliza interfața IEngine în locul clasei Motor. Și a doua, nu mai puțin importantă schimbare este că clasa Mașină nu ar trebui să creeze motorul în sine, acum constructorul face referire la obiectul care implementează interfața IEngine.

Și ultimul lucru pe care trebuie să-l faceți este să schimbați funcția principală.

Soluția rezultată este mai ușor de extensibil, mai testabilă și este un exemplu de implementare a modelului Dependency Injection - dependența motorului mașină nu este configurată în cadrul clasei, dar motorul creat în afara clasei este încorporat în acesta.







Dezavantajul acestei soluții este că se pierde simplitatea creării unei noi instanțe de clasă auto. Imaginați-vă dacă există multe dependențe similare în program, toate trebuie să fie create manual din nou și din nou. Prin urmare, vom merge mai departe și vom vedea cum puteți face viața mai ușoară folosind Ninject, un cadru pentru introducerea automată a dependențelor.

Ideea principală de a folosi cadrele DI pentru crearea obiectelor poate fi descrisă după cum urmează: "Am nevoie de un obiect de clasă A, o creez și nu mă interesează ce și cum vei face pentru asta". Iată cum se va face crearea unei mașini care utilizează Ninject:

Ce este ninjectKernel va deveni clar mai târziu, iar acum merită atenție la absența oricărei mențiuni a motorului sau a motorului. Datorită preconfigurării, Ninject știe că mașina are nevoie de un motor și când este rugată să creeze o nouă instanță a clasei Mașină, ea creează automat motorul și îl transmite constructorului mașinii. Astfel, tot ce este necesar este să cereți o clasă. Toate dependențele necesare creării sau muncii sale, cadrul DI se va rezolva singur. Dacă, desigur, a fost configurat corect în mod corespunzător.

Ninject poate fi descărcat de la Ninject.org ca o versiune stabilă sau poate fi preluat ca fișiere sursă efectivă din depozit. Vă recomandăm să utilizați a doua metodă, deoarece versiunea din depozit acceptă mai multe funcții noi, inclusiv codul pentru integrarea cu MVC ASP.NET.

Pentru a începe lucrul cu Ninject, trebuie să adăugați o referință la ansamblul Ninject.Core.dll care implementează capabilitățile de bază ale cadrului. Al doilea pas este configurația. Din păcate, Injecția de dependență nu este magică și că Ninject știa cum să rezolve dependențele, ar trebui să fie instruit. Pentru programul nostru, sunt necesare doar două instrucțiuni:

În timp ce multe cadre DI se bazează pe fișiere XML de configurare, Ninject are un API simplu și intuitiv pentru definirea dependențelor, folosind sintaxa familiară a limbii și permițând toate caracteristicile IDE.

Prima instrucțiune leagă interfața IEngine cu clasa Engine astfel încât ori de câte ori un Ninject detectează necesitatea unui obiect IEngine, va fi creat un obiect Engine. A doua declarație descrie comportamentul dorit atunci când cereți să creați o instanță a clasei Mașină - trebuie să creați această instanță, totul este simplu. De fapt, a doua instrucțiune este opțională - acest comportament este implementat de cadrul implicit. Dacă este necesar, clasele de auto-conectare pot fi dezactivate și puteți configura singur totul.

Acum apare întrebarea - unde să configurați? Configurația este efectuată în metoda virtuală de încărcare a clasei care implementează interfața IModule. Cea mai ușoară modalitate de a moșteni această clasă din clasa StandardModule.

Dacă se dorește, mai multe astfel de module pot fi create, de exemplu, pentru configurații separate pentru diferite părți ale programului. Mai mult, aceste module sunt folosite pentru a crea un container, care va efectua toate lucrările murdare pentru noi.







Trimiteți-le prietenilor: