Wednesday, 28 January 2009
Authorization
Dodali smo možnost uporaba authorizacije nad posameznimi podatki. To vključimo tako, da uporabimo atributom Authorization nad PBBusinessbase in PBReadOnlyBase objektom. V polje DataRole na tabeli se bodo vpisovale podatkovne role. Podatkovne role, ki se bodo vpisovale v to polje nastavimo na posameznem uporabniku, tako da izberemo WriteDataRole. Do katerih podaktov pa lahko dostopamo pa nastavimo z izbiro ReadDataRole. Ponavadi sta obe izbrane vrednosti enaki.
Saturday, 24 January 2009
Razširjanje obstoječih razredov FCLja
Z Extension methods, lahko obstoječe tipe framework class librarja razširimo, kot že ime pove s lastnimi user-defined metodami, brez dedovanja ali ponovnega kompajliranja.
Recimo, da potrebujemo na obstoječem tipu String novo metodo, ki bo preverila ali stanje objekta ustreza določemu pravilu. Lahko bi z regular expressions preverili ali je obstoječa vrednost objekta pravilen e-mail naslov ali ne.
V našem primeru bomo razširili tip String z metodo, ki bo preverila ali je vrednost palindrom.
Napišemo extensiom method takole:
Lame implementacija palindrom-checker funkcije, če ve kdo boljšo naj pove :)
Za test naredimo array stringov in za vsak element v arraju pokličimo naš nov extension method isPalidrome()
Primer s preverjanjem stringa, če ustreza vzorcu veljavnega email naslova. User defined extension metode so lahko tudi v poljubnem razredu. Smotrno je, da imamo vse extension metode na enem mestu npr. v MyExtensions razredu. Če so splošno uporabne, lahko naredimo tudi code library(assembly) in ga vključimo v nadaljnje aplikacije, ki jih bomo razvijali.
Preverjanje nove extension metode na listi stringov:
Action je delegat, ki kaže na anonimno metodo izraženo z lambda izrazom.
Na generični kolekciji uporabimo default extension metodo ForEach() in ji damo
za parameter delegat(pointer na anonimno metodo).
Izpiše, F, T, F, T (Zadnji T verjetno ni vredu ... tako se je sparsal string na podlagi regular izraza, obstajajo tudi boljši pattern marcheri( za maile, ampak to zdaj ni tema ...).
Recimo, da potrebujemo na obstoječem tipu String novo metodo, ki bo preverila ali stanje objekta ustreza določemu pravilu. Lahko bi z regular expressions preverili ali je obstoječa vrednost objekta pravilen e-mail naslov ali ne.
V našem primeru bomo razširili tip String z metodo, ki bo preverila ali je vrednost palindrom.
Napišemo extensiom method takole:
1 public static class String
2 {
3 public static bool isPalindrome(this string s)
4 {
5 string result = string.Empty;
6 char[] charArray = s.ToCharArray();
7
8 for (int i = 0; i < s.Length; i++)
9 {
10 result = result + charArray[s.Length - (i + 1)];
11 }
12
13 if (s == result)
14 return true;
15 else
16 return false;
17 }
18 }
Lame implementacija palindrom-checker funkcije, če ve kdo boljšo naj pove :)
Za test naredimo array stringov in za vsak element v arraju pokličimo naš nov extension method isPalidrome()
Loop izpiše, F, T, T, F, T1 var words = new string[] { "kaj", "ata", "bab", "bla", "radar" };
2
3 var foo = words.Select(x => x.isPalindrome());
4
5 foreach (bool b in foo)
6 Console.WriteLine(b);
Primer s preverjanjem stringa, če ustreza vzorcu veljavnega email naslova. User defined extension metode so lahko tudi v poljubnem razredu. Smotrno je, da imamo vse extension metode na enem mestu npr. v MyExtensions razredu. Če so splošno uporabne, lahko naredimo tudi code library(assembly) in ga vključimo v nadaljnje aplikacije, ki jih bomo razvijali.
1 public static class MyExtensions
2 {
3 public static bool IsValidEmailAddress(this string s)
4 {
5 Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
6 return regex.IsMatch(s);
7 }
8 }
Preverjanje nove extension metode na listi stringov:
Action
Na generični kolekciji uporabimo default extension metodo ForEach() in ji damo
za parameter delegat(pointer na anonimno metodo).
1 Action<string> email = e => Console.WriteLine(e.IsValidEmailAddress());
2
3 var emailList = new List<string>
4 {
5 "bla@bla",
6 "matjaz.curic@pro-bit.si",
7 "localhost",
8 "root@google.com.com.com.si"
9 };
10
11 emailList.ForEach(email);
Izpiše, F, T, F, T (Zadnji T verjetno ni vredu ... tako se je sparsal string na podlagi regular izraza, obstajajo tudi boljši pattern marcheri( za maile, ampak to zdaj ni tema ...).
Friday, 23 January 2009
Generične kolekcije, anonimne metode, lambda izrazi
Iz primera je razvidna priročnost anonimnih funkcij, gnezdenja funkcij (fluent interface) na generičnih kolekcijah.
Kadar predvidevamo, da bomo neko funkcijo uporabili samo enkrat, jo definiramo kar "in-line". Drugi funkciji lahko damo kot parameter funkcijo samo. Izrazno močen in eleganten način pisanja anonimih funkcij je s pomočjo lambda izrazov.
Primer:
Izpis kvadratov celih števil od 1 do 10
Iz naslednjega primera bo še bolj razvidna moč fluent interface-a.
Primer:
Na množici celih števil od 1 do 10, izberimo podmnožico lihih števil razvrščene od največjega do namanjšega. Vsak element podmnožice korenimo s kvadratnim korenom. Ustvarimo močno tipizirano generično kolekcijo z novim anonimnim tipom, ki naj ima dva propertija, osnovo in kvadratni koren osnove.
Omenjeno transformacijo je možno naredit v eni vrstici, zaradi preglednosti je koda zapisana v "več" vrsticah.
V parameter listi metode Select() smo na desni strani lambda izraza uporabili object initializer in s keywordom "new" ustvarili nov anonimni tip. Compiler v compile time-u v odzadju ustvari nov anonimni razred, njegovo definicijo pa izpelje(type inference) iz object initializerja.
Vsaka od generičnih metod na IEnumerable tipu vrne novo instanco enakega tipa, torej IEnumerable, zato je mogoče gnezditi izraze v "neskočnost" (pipelines of operations).
Primer iz PBRT4Lividature, kjer je bilo potrebno zgenerirat argumente za eksterni program za risanje grafov:
Na objektu List je bila uporabljena extension metoda ForEach, kateri sem dal za parameter anonimno funkcijo za obdelavo stringov.
Torej kadar delamo operacije nad elementi v kolekcijah, pride prav obsoječi interface "extension" method, ki jih je microsoft dodal v tipe generičnih kolekcij. Anonimne metode ni potrebno več izražati z delegati, saj so na voljo lambda izrazi, s katerimi je možno definirati anonimne metode še bolj kompaktno.
Kadar predvidevamo, da bomo neko funkcijo uporabili samo enkrat, jo definiramo kar "in-line". Drugi funkciji lahko damo kot parameter funkcijo samo. Izrazno močen in eleganten način pisanja anonimih funkcij je s pomočjo lambda izrazov.
Primer:
Izpis kvadratov celih števil od 1 do 10
1 var squares = Enumerable.Range(0, 10).Select(x => x * x);
2
3 foreach (int num in squares)
4 {
5 Console.WriteLine(num);
6 }
7
Iz naslednjega primera bo še bolj razvidna moč fluent interface-a.
Primer:
Na množici celih števil od 1 do 10, izberimo podmnožico lihih števil razvrščene od največjega do namanjšega. Vsak element podmnožice korenimo s kvadratnim korenom. Ustvarimo močno tipizirano generično kolekcijo z novim anonimnim tipom, ki naj ima dva propertija, osnovo in kvadratni koren osnove.
Omenjeno transformacijo je možno naredit v eni vrstici, zaradi preglednosti je koda zapisana v "več" vrsticah.
var collection = Enumerable.Range(0, 10)
.Where(x => x % 2 != 0)
.Reverse()
.Select(x =>
new { Original = x,
SquareRoot = Math.Sqrt(x)
});
V parameter listi metode Select() smo na desni strani lambda izraza uporabili object initializer in s keywordom "new" ustvarili nov anonimni tip. Compiler v compile time-u v odzadju ustvari nov anonimni razred, njegovo definicijo pa izpelje(type inference) iz object initializerja.
Vsaka od generičnih metod na IEnumerable
Primer iz PBRT4Lividature, kjer je bilo potrebno zgenerirat argumente za eksterni program za risanje grafov:
Na objektu List
1 var documentFlow = (List<Posta_referent>)p.ForwardedTo;
2
3 documentFlow.ForEach(refer =>
4 {
5 edge = edge + refer.Referent_posredoval + " -> " + refer.Referent + ";";
6 });
Torej kadar delamo operacije nad elementi v kolekcijah, pride prav obsoječi interface "extension" method, ki jih je microsoft dodal v tipe generičnih kolekcij. Anonimne metode ni potrebno več izražati z delegati, saj so na voljo lambda izrazi, s katerimi je možno definirati anonimne metode še bolj kompaktno.
Sprememba tipa polja na bazi
Če spremenimo tip polja, ki že obstaja na bazi, moramo polje zbrisati na podatkovni bazi, da bo avtomatska posodobitev polja delovala pravilno. V nasprotnem primeru upgrade podatkovne baze smatra da je polje že ustvarjeno in ga ne ustvari ponovno. NE PREVERJA TIPOV.
Monday, 19 January 2009
povezave na bazo
Ko kreiramo objekt moramo paziti na DatabaseKey property, ki je defniran v PBBussinesBase in PB ReadOnlyBussinesBase objektu. V primeru da ga pustimo nespremenjenega je pametno da uporabljamo Prefikse tabel glede na projekt za katerega gre, da bodo posamezne tabele ločene že s samim imenom.
V nasprotnem primeru je potrebno prepisat property DatabaseKey, ki je definiran v dedovanem objektu. Vračati nam more ime datoteke, v kateri je zapisana povezava na podatkovno bazo. Uporabljati moramo imena datotek, ki so povezana z projektom, da ne bomo uporabljali iste podatkovne baze za dostop do različnih podatkov.
Z uporabo OldTable atributa, je obvezno spremeniti ime datoteke, ki dostopa do podatkovne baze.
Updgrade podatkovne baze
Pri Avtomatskem upgradu podatkovne baze je potrebno paziti na OldTable attribute, ker nam ena sama uporaba v eni knjižnici, izključi opcijo za celotno knjižnico.
Takšne objekte navedemo ločenem projektu.
Friday, 16 January 2009
Naredimo Text polje na bazi.
Če želimo narediti text polje na podatkovni bazi mu moramo določiti tip in dolžino, kot je v primeru spodaj.
Monday, 12 January 2009
Uporaba Default Sheme
Monday, 5 January 2009
Osnovna Aplikacija
Na Y:\PBRT4\PBRT4_Base Je objavljena prva verzija prazne aplikacije. Vsebuje samo Administrativni del in povezavo na sistemsko bazo.
Zaporedje namestitve komponent
Zaporedje namestitev [za pravilno delovanje!]
1. Enterprise Library May 2007 [3.1]
2. Guidance Automation Extension
3. Guidance Automation Toolkit for VS 2008
4. Smart Client Software Factory [April]
Datoteke za namestitev se nahajajo na Y:\PBRT4\...
1. Enterprise Library May 2007 [3.1]
2. Guidance Automation Extension
3. Guidance Automation Toolkit for VS 2008
4. Smart Client Software Factory [April]
NHibernate Profiler
A Profiler For NHibernate? What’s The Point?
If you’re not very experienced with NHibernate, it’s not always clear what NHibernate is doing behind the scenes. What kind of queries is it generating? How many entities are we loading? How often does it go the database? Even experienced NHibernate users can make mistakes which may result in inefficient data access, high memory usage, slow response times, etc. When used properly however, you can get excellent performance out of NHibernate.
http://davybrion.com/blog/2009/01/nhibernate-profiler-review/