BLOGas.lt
Sukurk savo BLOGą Kitas atsitiktinis BLOGas

Lietuvos .NET vartotojų grupės puslapis

Parašė Sergejus | 2008-01-30 22:08

Paskutines dvi savaites visą savo laisvą laiką aš skiriu Lietuvos .NET vartotojų grupės puslapio kūrimui. Darbai vyksta pakankamai lietai, kadangi pačiam reikėjo dizainą adaptuoti BlogEngine.NET blogui, kurti papildomą funkcionalumą (vartotojų registraciją) ir pan. Dar yra keletą neužbaigtų darbų, bet puslapis po truputi įgyja savo galutinį dizainą ir funkcionalumą:


Šiandien pagaliau gavau talpinimo serverį šiam puslapiui, taigi dabar prasidėjo testavimo įkarštis (kaip matyti iš paveikslėlio, testuoju sa šio blogo duomenimis). Tikiuosi kitos savaitės pabaigoje pavyks oficialiai paleisti puslapį ir jus galėsite jį įvertinti bei užsiregistruoti.


Tiek naujienų ir atgal prie darbo …


Rodyk draugams

Įvadas į Entity Framework (5 dalis)

Parašė Sergejus | 2008-01-28 18:57

Praėjo porą savaičių nuo mano paskutinio straipsnio, skirto Entity Framework. Bandysiu pasitaisyti…


Dažniausiai objektinio-reliacinio susiejimo įrankių vengiama dėl to, kad jie generuoja dinamines CRUD (Create, Read, Update, Delete) užklausas. Entity Framework leidžia pasinaudoti savo privalumais net ir tokiais atvejais, kada CRUD turi būti realizuotas išsaugotų procedūrų pagalba. Pirmiausia prisiminkime, kaip atrodė mūsų esybės bei jų sąryšiai iš ankstesnių pavyzdžių:



Tarkime, esybei Users mes norime nurodyti, kad esybių kūrimui, atnaujinimui ir trynimui būtų naudojami ne dinamiškai generuojami SQL sakiniai, bet mūsų nurodytos išsaugotos procedūros. Šiam tikslui pirma apibrėžiame atitinkamas išsaugotas procedūras usp_INSERT_Users, usp_UPDATE_Users ir usp_DELETE_Users (išsaugotų procedūrų pavadinimai gali būti bet kokie). Toliau Mapping Details lange pereiname prie esybių ir funkcijų susiejimo skilties ir nurodome atitinkamas procedūras:



Pasirinkus konkrečią išsaugotą procedūrą, reikia susieti esybės laukus su procedūros parametrais:



Jeigu esybės laukų ir procedūros argumentų pavadinimai sutampa, Entity Framework juos susieja automatiškai, išorinių raktų (asociacijų) atveju reikia iš išsiskleidžiamo sąrašo pasirinkti susijusios esybės lauką.


Aprašant atnaujinimo procedūrą, galima jai nurodyti naudoti pradines reikšmes, t.y. lyginti ar atnaujinimo metu duomenų bazės lauko reikšmė sutampa su atnaujinamos esybės lauko reikšme:


Apibendrinant, galimybė nurodyti esybei CRUD išsaugotas procedūras bus tikrai naudinga projektuose, kur norima pasinaudoti Entity Framework galimybėmis, bet priimta naudoti ne dinaminius SQL sakinius, o išsaugotas procedūras. Tiek žinių šiam kartui ir sėkmės bebandant!

Rodyk draugams

MCPD Enterprise

Parašė Sergejus | 2008-01-25 14:38

Šiandien pagaliau prisiruošiau ir išsilaikiau egzaminą 70-549 Designing and Developing Enterprise Applications by Using the Microsoft .NET Framework. Taigi tapau Microsoft Certified Professional Developer: Enterprise Applications developer. Valio!


P.S. Tikriausiai pastebėjote, kad visą šią savaitę nebuvo naujų straipsnių. Tai susiję su tuo, kad aš dirbau prie būsimo .NET vartotojų grupės puslapio. Daugiau informacijos parašysiu artimiausiu metu.

Rodyk draugams

Išleisti .NET Framework 3.5 išeities tekstai

Parašė Sergejus | 2008-01-17 23:36

Taigi kaip ir buvo žadėta dar spalio mėnesį, šiandien Microsoft išleido .NET Framework 3.5 išeities tekstus, o tiksliau derinimo simbolius (debug symbols). Šiuo metu prieinami tokių bibliotekų derinimo simboliai:



  • Bazinės .NET bibliotekos


    • System

    • System.CodeDom

    • System.Collections

    • System.ComponentModel

    • System.Diagnostics

    • System.Drawing

    • System.Globalization

    • System.IO

    • System.Net

    • System.Reflection

    • System.Runtime

    • System.Security

    • System.Text

    • System.Threading

    • ir t.t.

  • ASP.NET


    • System.Web

    • System.Web.Extensions

  • Windows Forms


    • System.Windows.Forms

  • Windows Presentation Foundation


    • System.Windows

  • ADO.NET ir XML


    • System.Data

    • System.Xml




Pastebėtina, bet derinimo simboliai nėra prieinami savarankiškam parsisiuntimui, už mus tai darys Visual Studio derinimo metu. Tam pirma reikės įdiegti specialiai tam išleistą Visual Studio 2008 atnaujinimą. Detalus viso proceso aprašymas yra prieinamas anglų kalba.

Rodyk draugams

.NET Framework 3.5 atnaujintas tipų plakatas

Parašė Sergejus | 2008-01-15 18:03

Atsinaujino .NET Framework 3.5 dažniausiai naudojamų tipų plakatas.

Rodyk draugams

Kaip parsiųsti keletą failų vienų ypu.

Parašė Sergejus | 2008-01-14 22:27

Tikriausiai visi esate susidūrę, kada užeinate į puslapį kuriame įjungta „Directory Browsing“ galimybė (t.y. rodomi visi toje direktorijoje esantys failai) ir jums reikia parsiųsti keliasdešimt failų (po viena). Prieš keletą dienų aš ir vėl patyriau tą patį jausmą ir nusprendžiau – gana! Reikia parašyti elementariausią programą, kuri viską padarytų vietoj manęs. Taigi pasidalinsiu dviejų vakarų rezultatu…


Programos kodas reikalauja .NET Framework 3.5 (jeigu pageidausite 2.0 galima pakeisti). Išeities tekstai p r i e i n a m i.


Pradėsiu nuo bendros architektūros. Pagrindinį funkcionalumą aš išskaidžiau į dvi dalis: puslapio parserį, kuris surenka visas nuorodas į falus; ir siuntėją (downloader, beje kaip tiksliau išversti į lietuvių kalbą?), atsakingą už nurodytų failų parsiuntimą.



Parserio dalis





Pirma aš apibrėžiau IHtmlParser interfeisą su dviem metodais: Parse (atsakingą už nuorodų iš HTML kodo ištraukimą ir juos atitinkamų DownloadableObject sukūrimą) bei ParseFrom (atsakingą už nurodyto puslapio HTML kodo gavimą pagal perduotą URL ir tolesnį Parse metodo iškvietimą). Kadangi prisijungimas prie puslapio bei jo HTML kodo gavimas nepriklauso nuo konkretaus puslapio, aš nutariau tą funkcionalumą įgyvendinti abstrakčioje klasėje HtmlParserBase, o Parse metodus pilnai realizavau HtmlParser klasėje. HtmlParser klasę aš bandžiau su IIS ir Apache web serveriais, jeigu paaiškės, kad tokia realizacija netinka kitiems serveriams, užteks paveldėti iš HtmlParserBase ir realizuoti Parse metodus pagal konkretaus web serverio specifiką.


O dabar truputi kodo… IHtmlParser realizacija:


HtmlParserBase realizacija:


Ir įdomiausia dalis, Parse metodų realizacija:



Algoritmas paremtas tuo, kad tiek IIS, tiek Apache web serveriai failų sąrašą patalpina tarp HTML žymių TAG. Pasinaudojant pirma reguliaria išraiška aš gaunu sąrašo turinį, o antra reguliari išraiška – visas nuorodas. Tam, kad tiek failo pavadinimas, tiek jo nuoroda būtu teisingi, tenka pasinaudoti HtmlDecode ir UrlDecode metodais. Metodai IsValidUrl ir IsValidName kaip ir seka iš pavadinimo atsakingi už nuorodos ir vardo validavimą. Jeigu buvo perduota bazinė nuoroda (pagal kuria nuorodos yra perdaromos į absoliučias), papildomai reikia patikrinti ar tai nėra nuoroda į tėvinį katalogą. Galiausiai metodas grąžina DownloadableObject sąrašą.



Siuntėjo dalis




Interfeisas IDownloader apibrėžia du metodus Download (atsakantis už nurodytų DownloadableObject parsiuntimą) ir DownloadAll (atsakantis už visų failų parsiuntimą), be to aprašo penkis įvykius skirtus siuntimo procesui stebėti. DownloadProcessStarted ir DownloadProcessFinished įvykiai atsako už bendro siuntimo proceso pradžią ir pabaigą bei dirba su DownloadProcessEventArgs argumento tipu. DownloadStarted ir DownloadFinished įvykiai atsako už kiekvieno failo siuntimo pradžią ir pabaigą bei dirba su DownloadEventArgs argumento tipu. Penktas, DownloadProgress įvykis rodo failo siuntimo progresą ir operuoja DownloadProgressEventArgs argumento tipu. DownloadManager klasė ne tik įgyvendina minėtą interfeisą, bet ir inkapsuliuoja įvykius specialiuose metoduose (skirtuose perrašymui išvestinėse klasėse). O dabar kodas…


IDownloader realizacija:


DownloadManager realizacija:


Kaip matyti, DownloadManager turi du konstruktorius, vienas iš kurių leidžia perduoti nuosavą parserį. Kitas įdomus dalykas – WebClient objekto DownloadProgressChanged įvykio apdorojimo aprašymas. Primenu, tai nauja C# 3.0 galimybė Lambda išraiškos (patogesnis anoniminių delegatų užrašymo būdas ir ne tik…). OnDownloadProgress (ir kiti klasės metodai kurie prasideda On…) skirtas DownloadProgress įvykio iškvietimui:


Pagrindinio klasės metodo Download realizacija:


Vienintelį būdą, kurį radau WebClient klasėje sekti failo siuntimosi progresą, buvo asinchroninio metodo DownloadFileAsync panaudojimas (jeigu naudojamas sinchroninis metodas DownloadFile, tai įvykiai DownloadFileCompleted ir DownloadProgressChanged nėra kviečiami). Bet asinchroninio metodo iškvietimas neleidžia žinoti kada visi failai yra parsiųsti ir kada laikas kviesti įvykį DownloadProgressFinished. Dėl šito apribojimo visą vykdymo logiką teko dirbtinai sinchronizuoti. Pirma atributo MethodImpl(MethodImplOptions.Synchronized) pagalba aš padariau visą Download metodą sinchroniniu, kas savo ruožtu leido pasinaudoti monitoriaus sinchronizavimo primityvu. Monitor.Wait sustabdo metodo vykdymą ir laukia Monitor.Pulse signalo iš išorės (mano atveju iš metodo DownloadFileCompleted).


DownloadFileCompleted realizacija:


Kadangi DownloadFinished įvykis reikalauja DownloadableObject objekto, jis buvo perduotas DownloadFileAsync metodui kaip vartotojo būsenos (UserState) kintamasis.


Paskutinio DownloadAll metodo realizacija yra triviali:



Klientinė programa



Tiek pagrindinių dalykų iš parserio ir siuntėjo realizacijų, beliko tik klientinės programos realizacija, kuri gavosi labai paprasta (įsidėmėkite kaip naudojamos Lamda išraiškos):


kur InitDownloadManager metodas yra


Tikriausiai atkreipėte dėmesį į Main metodo eilutę string path = System.Reflection.Assembly.GetExecutingAssembly().Location; Tai labai patogus būdas gauti vykdomos programos kelią (įskaitant ir EXE pavadinimą).


Dabar norėdami parsisiųsti visus failus, jums užtenka konsolėje suvesti
DownloaderConsole.exe http://kakzkoks.serveris.lt/kazkokia/direktorija c:\tmp - viskas!


Tiek šiam kartui, išeities tekstus galite p a r s i s i ų s t i ir naudoti kur norite ir kaip norite. Laukiu jūsų atsiliepimų, pastabų bei pasiūlymų!

Rodyk draugams

Įvadas į Entity Framework (4 dalis)

Parašė Sergejus | 2008-01-10 22:46

Atėjo laikas jau ketvirtai „Įvado į Entity Framework“ daliai. Šiandien noriu aptarti vieną labai svarbią Entity Framework (ir kitų ORM įrankių) galimybę, sudėtinės esybės sudarymą pagal kelias duomenų bazės lenteles. Prisiminkime mūsų esybių struktūrą iš 3 dalies:


Jeigu detaliau pasižiūrėti į esybę Authors, tai matyti, kad ji buvo kuriama kaip esybės Users potipis, t.y. Authors tai tie patys Users, bet papildomai turi savybes Bio ir Photo. Šiuo metu mes galime iš Authors esybės prieiti prie vardo ir pavardės tik per asociaciją, bet kur kas natūraliau būtų, jeigu mūsų esybė turėtu iš karto tiek visas savo, tiek User savybes. Tam spaudžiame dešiniu pelės klavišu ant esybės Authors ir pasirenkame meniu punktą Add Scalar Property:


Pridėjus esybę, mes suteikiame jai pavadinimą bei papildomą informaciją (tipą, ilgį, ar gali būti null ir pan.). Kitas būdas, pažymėjus esybės Users savybę paspausti Ctrl + C, o vėliau pažymėjus esybę Authors Ctrl + V. Tokiu būdu yra kopijuojama savybė su visa papildoma informacija. Galutinis esybės Authors vaizdas turėtų būti toks:


Dabar reikia kiekvieną pridėtą esybę susieti su fizinės User lentelės stulpeliais. Tam pasirenkame Authors esybę ir iš Mapping Details lango nustatome, kad apart lentelės Authors, mes susiejimui norime naudoti ir lentelę Users:


Štai ir viskas! Mes turime sudėtinę esybę sudarytą pagal kelias lenteles. Sėkmės ir iki kitų dalių!

Rodyk draugams

Introducing Microsoft LINQ elektroninė knyga - nemokamai!

Parašė Sergejus | 2008-01-07 00:08

Microsoft Learning siūlo nemokamai parsisiųsti 3 elektronines knygas:










 
 Introducing Microsoft LINQ (pilna)
 
 Introducing Microsoft ASP.NET AJAX (1 ir 5 skyriai)
 
 Introducing Microsoft Silverlight 1.0 (1 ir 5 skyriai)


Rodyk draugams

Įvadas į Entity Framework (3 dalis)

Parašė Sergejus | 2008-01-04 19:15

Pirmoje ir antroje dalyse aš aptariau bendriausius Entity Framework principus, nuo šiol prasidėda įdomesni pavyzdžiai. Pradėsiu nuo tiesioginio daug su daug (N:M) ryšio aprašymo. Priminsiu, mūsų schema šiuo metu atrodo taip:


Šioje schemoje matyti, kad esybės Tags ir Posts susietos daug su daug ryšiu per tarpinę PostTags esybę. Patogumo dėlei apibrėžkime tiesioginį ryšį tarp šių esybių. Tam spaudžiame ant esybės Tags dešiniu pelės mygtuku ir pasirenkame meniu punktą Add Association:


Nurodome, kad esybę Tags norime susieti su esybe Posts daug su daug (*:*) ryšiu:


Po aprašytų manipuliacijų tarp esybių Tags ir Posts atsiranda tiesioginis ryšis bei atitinkamos navigacijos savybės:


Nepaisant fakto, kad atsirado ryšis, jis dar nėra susietas su esybių ID stulpeliais. Tam pasirenkame ką tik sukurtą ryšį ir Mapping Details lange nurodome, kad susiejimas vyksta per tarpinės PostTags esybės Post ir Tag laukus:


Štai ir viskas! Turime tiesiogiai apibrėžtą daug su daug ryšį, leidžia iš Post esybės tiesiogiai prieiti prie visų susijusių Tag esybių ir atvirkščiai.


Taigi tiek šiam kartui ir primenu, mums LABAI reikalingas vartotojų grupės puslapio dizaineris. Busime labai dėkingi jeigu kas atsilieps ar bent žinote kas galėtų padėti!

Rodyk draugams