Teched 2007, Barcelona – Day 3

Δείτε εδώ τα υπόλοιπα blog posts για την Teched 2007

Το πρώτο event της ημέρας είχε τον Pablo Castro να μας μιλά για Entity Framework και Application Patterns. Αρχικά έγινε μια μικρή περιγραφή του Enity Framework. Πρόκειται για μία πλατφόρμα περιγραφής δεδομένων με ένα conceptual μοντέλο. Παρότι δεν κατάφερα να δω μια άλλη παρουσίαση σχετικά με το Enity Framework, από τα λίγα εισαγωγικά που μας είπε μπορώ να πω ότι εντυπωσιάστηκα. Μοντελοποίηση βάσης δεδομένων με ένα πολύ εύκολο εργαλείο, αποθήκευση της σε ένα edm σχήμα και μετά εύκολη χρήση της για CRUD μεθόδους στη βάση δεδομένων, data synhcronization, κατασκευή αντικειμένων με properties mapped στα ανάλογα πεδία της βάσης, lazy loading κ.α.

Στη συνέχεια, μετά από ένα slide με μια μικρή περιγραφή των 2-tier εφαρμογών, είδαμε ένα πολύ ωραίο demo μιας Visual desktop asic εφαρμογής που να χρησιμοποιεί το Entity Model ενός καταστήματος ποδηλάτων. Μου άρεσε πάρα πολύ η ευκολία χρήσης του Entity Framework. Μίλησε για διάφορα patterns ώστε να χρησιμοποιούμε ποιο αποδοτικά το Entity Framework, με ένα από αυτά να είναι η χρήση του ίδιου context ώστε τα αντικείμενα μας να γίνονται marked για gargabe collection όταν πρέπει αλλά και για concurrency issues. Ένα σημαντικό σημείο της ομιλίας του ήτανε το MergeOption.NoTracking enumeration, με το οποίο απενεργοποιούμε το tracking για αλλαγές στα αντικείμενά μας (όταν π.χ. φέρνουμε read only δεδομένα).

Το επόμενο θέμα για το οποίο μας μίλησε ήταν οι web εφαρμογές. Κατέληξε στο ότι πρέπει να δημιουργούμε ένα νέο context σε κάθε page hit, και να σώζουμε δεδομένα στο ViewState μόνο όταν είναι απολύτως ααραίτητο. Το demo περιλάμβανε μία Web εφαρμογή για ένα κατάστημα ποδηλάτων. Σε αυτή την εφαρμογή, ο Pablo έγραψε αρκετό κώδικα δείχνοντας μας πως να χρησιμοποιήσουμε αποδοτικά το Entity Framework σε web εφαρμογές. Χρησιμοποίησε, επίσης, αρκετό LINQ κώδικα για να κάνει CRUD operations στη βάση (με τη βοήθεια του Entity Framework). Τόνισε επίσης ότι το άνοιγμα connection στη βάση δεν είναι performance instensive διαδικασία, μιας και προέρχονται από το connection pool. Εντυπωσιακό ήταν και το τέλος του demo, με τον Pablo από τη μία να περνάει δεδομένα από την web σελίδα και την windows φόρμα να ανανεώνεται αυτόματα, αλλά και χρήση compiled lambda expression για αποδοτικότερο κώδικα.

Έπειτα, μας μίλησε για multi tier εφαρμογές, για τα use cases αλλά και τα χαρακτηριστικά τους. Ανέφετε ότι το Entity Framework έχει κατασκευαστεί ώστε να μπορεί να συνεργάζεται καλά με το Windows Communication Foundation. Στο demo, κατασκεύασε ένα WCF service, και μέσα σε αυτό μια συνάρτηση που να επιστρέφει ένα αντικείμενο από τη βάση. Στη συνέχεια, έφτιαξε άλλο ένα project και του έβαλε reference στο service που έφτιαξε λίγο πιο πριν. Έτσι, κατάφερε να “τραβήξει” ένα αντικείμενο από το WCF Service. Ύστερα, επέκτεινε το service ώστε να επιστρέψει ένα collection από αντικείμενα. Σε αυτό το demo ανέφερε ότι πρέπει να είμαστε προσεκτικοί με το lazy loading, και το πως καλούμε δεδομένα από τη βάση, ώστε να είμαστε όσο πιο αποδοτικοί γίνεται. Τέλος, έπαιξε με το project Astoria, κατασκευάζοντας ένα μικρό demo, ώστε τα δεδομένα να είναι διαθέσιμα μέσω HTTP.

Το επόμενο event ήταν αρχιτεκτονικής φύσεως και είχε τίτλο “Build your own software factory”. Εισηγητές ήταν οι Don Smith, Dennis Doomen και Olaf Conijn. Μετά από τις απαραίτητες συστάσεις των ομιλητών, μας παρουσιάστηκε ο ορισμός ενός software factory. Σε τελείως abstract επίπεδο, πρόκειται για “πρόγραμμα που κατασκευάζει ένα άλλο πρόγραμμα”. Μας παρουσιάστηκαν εργαλεία για το Visual Studio τα οποία χρησιμοποιούν models, designers, editors και wizards προκειμένου να επιτύχουν το συγκεκριμένο σκοπό, δηλαδή να κάνουν output τον κορμό ενός προγράμματος, με τα εκτελέσιμά του αλλά και τις reusable βιβλιοθήκες του.

Στη συνέχεια, έγινε επίδειξη ενός demo, το οποίο αποτελούνταν από ένα αρκετά μεγάλο WCF service solution, με διαγράμματα από τις κλάσεις από τις οποίες αποτελούνταν. Σε αυτά τα διαγράμματα, υπάρχει δυνατότητα validate, το οποίο ποικίλλει ανάλογα με τον τύπο του project. Ο Olaf, αφού μας έδειξε αυτά, έκανε generate code από αυτό το factory.

Ο Don και ο Dennis πήρανε τη σκυτάλη, με παρουσίαση του γιατί και πότε πρέπει να χρησιμοποιούμε software factories. το γενικό συμπέρασμα που προέκυψε ήταν ότι είναι ιδανικό να χρησιμοποιούμε software factories όταν πρόκειται να κατασκευάσουμε πολλές διαφορετικές μεν εφαρμογές, αλλά ίδιου τύπου δε. Αποδεδειγμένα, το software factory είναι αρκετά δύσκολο και χρονοβόρο να κατασκευαστεί, αλλά όταν πρόκειται για πολλές εφαρμογές, είναι αρκετά πιο βολικό και μας γλιτώνει αρκετό χρόνο (καθώς και βαρετές επαναλήψεις/ επαναχρησιμοποιήσεις κώδικα).

Εν συνεχεία, ο Olaf μας έδειξε ένα ακόμα demo, αυτή τη φορά δημιουργίας ενός guidance package, το οποίο μας επιτρέπει να δημιουργήσουμε software factories. Κάπως περίπλοκη διαδικασία, περιελάμβανε εξαγωγή ενός project template από το Visual Studio, register στο guidance package, πείραγμα ενός configuration file αλλά και μερικών άλλων files, αλλά άξιζε τον κόπο. Εξαγωγή κώδικα με μερικά clicks.

Τελικά, μας παρουσιάστηκε το DSL toolkit, το οποίο πρακτικά χρησιμοποιεί DSL (Domain Specific Language) για να δημιουργήσει DSL!!!! Το generated project, όταν γινόταν build ξεκίναγε ένα νέο instance του Visual Studio, οι ρυθμίσεις του οποίου αποθηκεύονται σε διαφορετικό hive στη registry, ώστε σε περίπτωση σφάλματος στο DSL να είναι δυνατή η εκκίνηση του Visual Studio για διόρθωση του DSL. Το demo ολοκληρώθηκε με ένα integration των δύο project (guidance package και DSL). Η παρουσίαση τελείωσε με το συμπέρασμα ότι το software factory creation είναι ακόμα δύσκολο στο Visual Studio 2005, αλλά θα γίνει πολύ καλύτερη στην καινούρια έκδοση του Visual Studio Team System (codename “Rosario”), το οποίο θα έχει designer integration, recipe framework αλλά και top-down design υποστήριξη.

Το τελευταίο event της ημέρας είχε τον Ian Griffiths να μιλάει για multithreading σε Windows Presentation Foundation εφαρμογές. Ξεκίνησε με μια ενημέρωση για τον Dispatcher. Κάθε Window (και όλο το περιεχόμενό του) έχει ένα Dispatcher object, και κάθε Dispatcher object ανήκει σε ένα Thread. Ο χρυσός κανόνας, όπως υπήρχε σε ένα slide, είναι “Don’t touch the UI from the wrong thread”. Ο δεύτερος χρυσός κανόνας είναι “Don’t block the UI thread”. Οπότε, αναρωτήθηκε ο Ian, πώς γίνεται και να πειράζεις το UI αλλά και να μην το πειράζεις;

Η λύση έρχεται με τη χρήση του Dispatcher object. Εδώ ξεκίνησε και το πρώτο demo. Ο Ian μας επίδειξε μια καθυστέρηση σε UI με τη δημιουργία ενός νέου Window το οποίο καλούσε μία κλάση, η οποία έκανε Thread.Sleep() για 5 δευτερόλεπτα. Στη συνέχεια, έβαλε την αργή function της κλάσης στο ThreadPool. Το UI τότε δεν πάγωνε, απλά πήγαινε να πειράξει ένα TextBox από το δικό του thread, με συνέπεια ένα InvalidOperationException. Αυτό λύθηκε με τη χρήση της μεθόδου Dispatcher.BeginInvoke, που παίρνει σαν ορίσματα ένα DispatcherPriority enumeration, μία delegate class που δείχνει στη συνάρτηση που θα γίνει Invoke από το UI Thread, και τα τυχόν ορίσματά της.

Το DispatcherPriority enumeration έχει 10 τιμές, όπως DataBind, Render, Background, Loaded κ.λ.π., ανάλογα σε ποιο σημείο της λειτουργίας του Control θέλουμε να γίνει το Invoke. Η Dispatcher.BeginInvoke μέθοδος επιστρέφει ένα DispatcherOperation object, το οποίο έχει Operations (Wait, Abort), Properties (Priority, Status, Result) και Events (Completed, Aborted). Ο Ian μας πρότεινε να μην χρησιμοποιήσουμε το Completed event καθώς υπάρχει περίπτωση για race condition (να τελειώσει η συνάρτηση που θα κληθεί από την BeginInvoke πριν γίνει register ο event handler). Επίσης, μας πρότεινε να μην χρησιμοποιήσουμε τη Wait operation, καθώς μπορεί να γίνεται και Wait από το UI, οπότε θα καταλήξουμε σε deadlock. Ανέφερε ακόμη, πως δεν υπάρχει Dispatcher.EndInvoke μέθοδος, την ύπαρξη της οποίας έχουμε συνηθίσει από το .NET async pattern.

Συνέχισε με μια βασικά αναφορά στις δυνατότητες για asynchronous δυνατότητες. Στο .ΝΕΤ 1.1, υπάρχει το pattern BeginXXX/EndXXX και το IAsyncResult. Το βασικό πλεονέκτημα είναι ότι είναι αρκετά αξιόλογο για τις περισσότερες εργασίες. Ο Ian ανέφερε ότι αυτός είναι περίπου και ο τρόπος που δουλεύει ο πυρήνας των Windows, πράγμα το οποίο γνωρίζει από πρώτο χέρι μιας και παλιά έγραφε device drivers. Προχώρησε με ένα demo, με μία WPF εφαρμογή να καλεί ένα WCF service. Μας έδειξε στην client εφαρμογή μία επιλογή του Visual Studio, προκειμένου η proxy class που θα δημιουργηθεί να έχει async μεθόδους (αυτό γίνεται αυτόματα σε Web Service proxies). Με τη χρήση της BeginXXX μεθόδου και τη χρήση του Dispatcher, το blocking UI έγινε non-blocking.

Το .NET 2 async pattern ήταν το επόμενο σημείο της παρουσίασής του. μας περιέγραψε τις μεθόδους XXXAsync και CancelAsync/XXXAsyncCancel αλλά και τα events XXXCompleted και XXXProgressChanged. Η κύρια διαφορά με το προηγούμενο είναι ότι τα δύο events γίνονται raise στο αρχικό thread, οπότε δεν χρειάζεται άλλα “κόλπα” για πείραγμα του UI. Τα υπέρ είναι ότι υποστηρίζει ακύρωση, ότι τα events σκάνε στο ίδιο thread, και τα κατά είναι το ότι δεν υποστηρίζεται στο Windows Communication Foundation και δεν υπάρχει υποστήριξη για το Waithandle. Στη συνέχεια είδαμε ένα demo σχετικό με αυτά, με ένα WebClient object να κάνει download ασύγχρονα μια εικόνα από ένα web site και να την εμφανίζει σε ένα WPF Window. Πολύ απλά διαδικασία, πραγματικά.

Μετά από αυτό, ο Ian άνοιξε πάλι το demo με το Web Service, και έφτιαξε έναν wrapper στον client, έτσι ώστε να υποστηρίζεται το .NET 2 async pattern. Το δύσκολο σημείο εδώ ήταν να “πιάσει” το thread του caller, και αυτό το έκανε με τη χρήση ενός SynchronizationContext αντικειμένου. Έπειτα, έβαλε το SynchronizationContext.Current σε αυτό το αντικείμενο, το πέρασε στον callback της BeginInvoke, όπου και (αφού το πήρε από το AsyncState του IAsyncResult) κάλεσε μια άλλη συνάρτηση όπου και έκανε raise το event (προκειμένου να υλοποιήσει το .NET 2 async pattern). Αρχικά φάνηκε περίεργο, αλλά τελικά είναι αρκετά εύκολο μόλις καταλάβεις πως δουλεύει.

Έπειτα, μας μίλησε για την άλλη μας επιλογή, το ThreadPool. Μετά από αυτό, προχώρησε στην τελευταία μας επιλογή, να δημιουργήσουμε δικά μας threads. Έτσι, υπάρχει η δυνατότητα για μείωση του concurrency. Μας ανέφερε, βέβαια, πως ο στόχος δεν είναι αυτός, αλλά η απλότητα και η απόκριση του User Interface. Το κακό αυτής της τελευταίας επιλογής είναι πως “είμαστε μόνοι μας”. Δεν μας έδειξε demo καθώς, όπως είπε η εκάστοτε υλοποίηση εξαρτάται από την εκάστοτε εφαρμογή.

Προχώρησε σε επεξηγήσεις για το data binding. Ανέφερε πως το Windows Presentation Foundation μας προσφέρει κάποια βοήθεια, καθώς τα property change events μπορούν να γίνουν raise σε οποιοδήποτε thread, και πως υπάρχει δυνατότητα για προσδιορισμού asynchronous operation σε ένα WPF binding.  Το demo περιείχε μία κλάση που έκανε implement το INotifyPropertyChanged, καθώς αυτό είναι το interface που περιμένει το WPF, προκειμένου να υποστηρίξει data binding σε μια συγκεκριμένη κλάση. Τελευταία προσθήκη στην κλάση ήτανε μία “αργή” συνάρτηση. Κατασκεύασε ένα WPF Window, και μέσα σε αυτό ένα TextBlock που έγινε bound σε ένα δεδομένο της κλάσης που έφτιαξε πριν. Με μία αλλαγή στο δεδομένο και μπόλικα Debug.WriteLine, μας έδειξε τη διαδρομή από το UI thread στο worker thread. Εδώ μας έδειξε και την “εξυπνάδα” του WPF, το οποίο στέλνει μόνο του ένα μήνυμα στο UI thread, ότι άλλαξε το property προκειμένου να ξαναγίνει το rebinding, παρόλο που η αλλαγή έγινε σε άλλο thread.

Τέλος, μας ανέφερε πως το databinding για collection objects (όπως στο ObservableCollection<T>) δεν είναι και τόσο καλό, όταν βρίσκεται σε multithreading περιβάλλον. Είδαμε ένα demo όπου ένα databound ObservableCollection σήκωσε Exception όταν του έγινε μια αλλαγή από άλλο Thread. Αυτή η δυνατότητα υπάρχει μόνο αν η αλλαγή γίνει στο dispatcher thread. Την λύση σε αυτό το πρόβλημα την έδωσε το τελευταίο demo το οποίο μιλούσε με το MSDN web service, για να εμφανίσει τα θέματά του σε ένα treeview. Εκεί, χρησιμοποίησε πάλι το SynchronizationContext αντικείμενο, για να μπορεί να ποστάρει μηνύματα στο UI thread, για την ανανέωση της λίστας, όπου και με την έλευση των μηνυματων γινόταν το update στα bound ObservableCollection αντικείμενα.

Είχα κάνει στο παρελθόν ένα class με τον Ian, και όσο εντυπωσιασμένος είχα μείνει τότε, άλλο τόσο έμεινα τώρα. Από τους καλύτερους γνώστες του Windows Presentation Foundation παγκοσμίως, με πάρα πολύ καλή μεταδοτικότητα.

Αυτά για σήμερα!!!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s