Skip to main content

Posts

Showing posts from December, 2010

Cum pot sa forteti garbage collecter(GC) sa se execute din debug

Exista momente când am dorii sa putem apela GC când suntem în debug. Pentru acest lucru putem sa folosim Ctrl-Alt-Shift-F12 . Tot ce trebuie sa facem este sa ţinem apăsat Ctrl-Alt-Shift şi sa apăsam de doua ori F12 . Ce se va întâmpla? GC va rula automat şi va face dispose la obiectele care sunt marcate pentru ştergere. Se poate folosii cu succes când se face debug pe mai multe instante de VS, iar memoria maşini este încărcata aproape la maxim.

Dispose pattern - using statement

In .NET nu trebuie sa facem dispose manual la obiectele pe care le iniţializam. Acesta face automat dispose la obiectele pe care nu le mai folosim. GC( g arbage c ollector) se ocupa de acest lucru, stergand din memorie obiectele pe care nu le mai folosim. Totuşi, exista momente când dorim sa controlam aceasta acţiune. De exemplu sunt cazuri când accesam baza de date, fişiere şi/sau resurse din COM. Ori avem alte obiecte în interiorul obiectului nostru care folosesc acest mecanism şi dorim sa facem dispose la ele. In aceste cazuri dorim sa controlam acţiunea de dispose. Cand spun sa o putem controla ma refer la doua lucruri separate: momentul când se face "dispose"; acţiunea care sa se execute când se face dispose; Pentru a putea controla acest mecanism trebuie sa implementam interfaţa IDispose . Nimic complicat pana aici, avem doar o metoda void Dispose() pe care trebuie sa o implementam. In interiorul ei putem sa facem acţiunea de dispose. public class ProcessData: IDispose...

jquery template - jumate de MVC

Nu odata am scris ceva asemanator cu aceste cond in jQuery: var sablon = "<b> ${nume} </b>"; Problema la acest template este modul in care se poate manipula . In cazul in care dorim sa facem o modificare, suntem nevoiti sa cautam in cod unde avem definit template-ul si sa facem modificari pe el. In cazul in care un nou dezvoltator trebuie sa faca modificari, el o sa fie nevoit sa cauta in cod. O solutie este sa folosim un template pentru acest lucru. Primul pas este sa definim template-ul in forma urmatoare: <script id="numeTemplate" type="text/html"> <b> ${nume} </b> </script> Prin acest mod, o sa ne putem referi template-ul nostru in orice loc din cod pe baza unui ID, totodata o sa fie foarte usor de grupat toate template-urile. Urmatorul pas este sa referim pe langa libraria de jquery si libraria pentru template-uri. Numele ei este: jquery.tmpl.js. Template-ul pe care l-am definit mai sus trebuie putin modificat...

Auto-start la servicii WCF hostate pe IIS

Sunt cazuri când avem servicii WCF pe IIS care necesita un timp lung pentru iniţializare. Din aceasta cauza primul apel a unui serviciu poate sa dureze o veşnicie. La încărcarea aplicaţiei, IIS ne ajuta destul de mult: iniţializează AppDomain, compilează dacă este nevoie codul( în principiu pregăteşte aplicaţia). Aproape totul este pregătit, mai puţin iniţializarea serviciilor, care este lăsata în seama noastră. Pentru aceasta problema exista mai multe soluţii: La iniţializarea aplicaţiei se pot încarcă resursele necesare serviciului static sau într-un IoC. Apelul "virtual" a tuturor serviciilor, în momentul în care serverul porneşte. Prin aceasta metoda toate resursele folosite de către servicii o sa fie deja încărcare. Implementarea unui mecanism de auto-start la servicii. O sa descriu mai amănunţit ultima soluţie propusa. .NET împreuna cu IIS 7.5 ne pune la îndemâna un mecanism destul de simplu prin intermediul căruia putem sa iniţializam automat un servic...

Care este diferenta principala intre Convert.ToInt si int.Parse

Convert.ToIn t si int.Parse fac aproape acelasi lucru. De foarte multe ori alegerea unei variante se face doar pe baza obişnuintei. Trebuie ţinut cont de faptul ca cele doua mecanisme sunt în proporţie de 90% la fel, dar se difera printr-un singur lucru, care poate sa genereze un comportament ciudat a aplicaţiei. Daca valoarea string-ului pe care o dam este NULL Convert.ToInt o sa ne returneze 0, iar int.Parse o sa arunce o exceptie de tip Argument Null Exception . De exemplu: string sValue=null; //Va returna 0. var v1=Convert.ToInt(sValue); //Va arunca o exceptie de tip Argument Null Exception. var v1=int.Pase(sValue); In rest, ambele metode se vor comporta la fel.

Force success build before check-in - configurare TFS ( Team Source Control)

Nu odată ne-am trezit ca pe source control exista cod care nu compilează. Pentru a evita aceasta problema putem sa configuram TFS sa forţeze dezvoltatorul sa facă BUILD înainte de check-in. Acesta o sa poată sa facă check-in doar dacă BUILD-ul s-a cu s-a terminat succes. Din păcate TFS nu are un buton special pentru asa ceva, dar putem sa folosim un artificiu. Putem sa activam Code Analysis , dar fara sa selectam nici o regula. Prin aceasta metoda, check-in-ul se va putea face doar dacă soluţia a fost compilata cu succes după ultima modificare a unui fişier din soluţie.

Ordonare in sens invers - generic

Era nevoie sa implementez un mecanism de ordonare. Deoarece existau mai multe tipuri de ordonare pe acelasi obiect, am ales sa folosesc IComparer . IComparer este un mecanism de comparare extern. Implementarea functiei care face compararea nu este in interiorul obiectului, asa cum este in cazul IComparable . Se foloseste de obicei cand modul in care se face comparatie nu este naturala. Cand se implementeaza interfata IComparer , este nevoie sa implementam metoda int Compare(T obj1,T obj2), care returneaza o valorea pozitiva daca obj1 > obj2; negativa daca obj1 zero daca obj1 = obj2; Pana aici nu apare nici o problema. Dar daca avem nevoie sa putem face si o ordonare inversa( reverse), apar probleme. Nu neaparat la modul de implementare, putem foarte usor sa ne folosim de operatorul de negare !, ci la modul in care facem implementarea. Am cautat un mecanism de ordonare in sens invers, care sa fie cat mai generic. Solutia pe care o propun este urmatoarea: public class ComparerReverse...

Calcule cu DateTime

Trebuia sa afisez durata intre un startDate si un endDate. Aceasta trebuia sa fie afisata sub forma: Durata este de: [years], [months], [days] Problema a aparut cand trebuia sa determin daca 28,29,30 sau 31 de zile reprezinta o luna? Problema este ca nu am putut determina numarul de zile pentru o luna. Daca as alege 28, as ajunge ca sa calculez ca luna ianuarie contine si ea 28 de zile, cea ce este complet eronat. O alta situație in care pot sa ajung este sa aleg durata unei luni de 30( sau 29) de zile si atunci as ajunge intr-o situatie similara pentru luna februarie. Problema apare in jurul date de 28 februarie. Rotunjirile care se fac in jurul acestei date(+/- o unitate de masura - care poate sa fie zi sau luna). Valoarea de tip TimeStamp sau DateTime pe care o adun sau o scad nu reprezinta mereu o valoarea buna, deoarece o luna poate sa aibe 28,29,30 sau 31 de zile. Problema a apărut cînd am ajuns pe cazurile de mai jos: 30/01/2011 + 0 luna = 28/02/2011 29/01/2011 + 0 luna = 28/02...