Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Σκέψεις για το Prism (Workitem)

Îåêßíçóå áðü ôï ìÝëïò George Parissis. Τελευταία δημοσίευση από το μέλος George Parissis στις 17-10-2011, 19:15. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-10-2011, 00:18 67645

    Σκέψεις για το Prism (Workitem)

    Ασχολούμαι με το Prism περίπου ένα μήνα. Δεν δυσκολεύτηκα να το καταλάβω βοήθησε και η εμπειρία που είχα στο CAB. Θα μπορούσα να το χαρακτηρίσω μία νεότερη έκδοση του CAB με στόχο το WPF (και ειδικά όταν βάλουμε μαζί και τα MEF attributes ήταν σαν να είχα μπροστά μου έναν ObjectBuilder3.dll). Όμως πρόσεξα πως από το Prism δεν υπάρχει η έννοια του Workitem.

    Ας πάρουμε το εξής παράδειγμα που με το CAB θα λυνόταν πολύ εύκολα με την χρήση του workitem. Έχω ένα TabControl το οποίο έχω ορίσει σαν region στο Prism. Μέσα σε αυτό το region εμφανίζω διάφορα views με την μορφή TabPages. Ένα από αυτά τα Views έχει επίσης ένα TabControl που θα πρέπει να οριστεί σαν region και το οποίο με την σειρά του εμφανίζει διάφορα views. Οπότε έχουμε ένα αρχικό TabControl όπου σε ένα TabPage υπάρχει άλλο ένα TabControl.

    Στο CAB τώρα όταν ήθελα να κάνω activate ένα view το οποίο υπήρχε στο εσωτερικό TabControl μπορούσα, λόγω της ιεραρχικής δομής των workitems να κάνω activate όλα τα workitems που ήταν πάνω από το συγκεκριμένο και έτσι το εξωτερικό TabControl να έκανε Active το σωστό TabPage μέσα στο οποίο βρισκόταν το TabControl και αυτό με την σειρά του να έκανε active το σωστό TabPage μέσα στο οποίο βρισκόταν το view.

    Στο Prism όμως δεν υπάρχει η έννοια του workitem και το navigate feature που έχει δεν μπορεί να μου λύσει το πρόβλημα αυτό.

    Πως θα μπορούσε να λυθεί το παραπάνω πρόβλημα; Όλα τα παραδείγματα που έχω δει είναι απλά για regions και όχι για nested regions.

  •  07-10-2011, 11:14 67663 σε απάντηση της 67645

    Απ: Σκέψεις για το Prism (Workitem)

    Να υποθέσω ότι η ερώτηση είναι δυσνόητη ή ότι το σενάριο που ανέφερα δεν καλύπτεται από το Prism οπότε θα πρέπει να φτιάξω κάτι Custom.

  •  09-10-2011, 17:50 67689 σε απάντηση της 67663

    Απ: Σκέψεις για το Prism (Workitem)

    Όχι, απλά ψάχνεις να βρεις κάτι το οποίο φτιάχτηκε για άλλο σκοπό (encapsulation use cases ή .... Work Items), σε άλλο framework για να κάνεις κάτι το οποίο αφορά καθαρά το UI. Tα WorkItems δεν είχαν φτιαχτεί για composition των οθονών αν και έμμεσα κατέληγες και σε αυτό.

    Το Prism δεν είναι η εξέλιξη του CAB σε νέα πλατφόρμα αλλά μία νέα σχεδίαση, η οποία φτιάχτηκε για να αντιμετωπίσει τα σοβαρά προβλήματα του παλιού, όπως για παράδειγμα την υπερβολική πολυπλοκότητα. Οι δημιουργοί του CAB ακόμα ζητάνε συγγνώμη κάθε φορά που μιλάνε γι αυτό.

    Εκεί που παλιά είχες views, services, actions και ένα workitem να τα συνδέει όλα, τώρα έχεις το ViewModel που αναλαμβάνει τον ίδιο σκοπό. Εκεί που είχες την ιεραρχία των WorkItems και την έμμεση ιεραρχία των views (μέσω των WorkItems) τώρα έχεις τη σύνθεση των ViewModels. Ο τρόπος που γίνεται το composition εξαρτάται από το framework που χρησιμοποιείς κάθε φορά για να υλοποιήσεις το MVVM (αν δεν έχεις φτιάξει το δικό σου).

    Είναι πολύ σημαντικό να καταλάβεις ότι το PRISM δεν είναι το CAB. Όσες απορίες είχες ως τώρα είναι επειδή προσπαθείς να κάνεις το Prism να γίνει CAB. 

    Επίσης, δεν είναι το μοναδικό ούτε καν το καλύτερο framework για αρχιτεκτονικές MVVM. Είναι μεν απλούστερο από το CAB αλλά εξακολουθεί να είναι overengineered. Υπάρχουν άλλα frameworks όπως το MVVM Light και το Caliburn.Micro τα οποία είναι πολύ απλούστερα, εξαιρετικά μικρότερα σε όγκο (κώδικα και binary) και παρέχουν ουσιαστικά τις ίδιες λειτουργίες. Δες για παράδειγμα την περιγραφή του composition για το Caliburn.Micro, ή αυτή την παρουσίαση του Igor Moochnick για το πως να φτιάξεις composite applications

    Έχοντας δουλέψει και με Prism και Caliburn.Micro απλά αναρωτιέμαι τί με έπιασε και ξεκίνησα καν το Prism Quickstart. Υπερβολικά μεγάλη φασαρία για να πετύχεις ακριβώς τα ίδια πράγματα.  Η περιέργεια που σκότωσε τη γάτα θα πεις ...

    Όσον αφορά καλούδια όπως το MEF, είναι μέρος του framework, όχι του Prism, και δουλεύουν απείρως απλούστερα και ευκολότερα από τον ObjectBuilder. Αν θέλεις κάτι παραπάνω σε Dependency Injection υπάρχουν άλλα frameworks όπως το Castle.Windsor ή το Spring.Net

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-10-2011, 20:05 67782 σε απάντηση της 67689

    Απ: Σκέψεις για το Prism (Workitem)

    Μπορείς να μου δώσεις ένα παράδειγμα πως θα μπορούσα να λύσω το πρόβλημα που ανέφερα με την χρήση των ViewModels? Όσο και αν έχω ψάξει δεν μπόρεσα να βρω. Τα παραδείγματα, όσα δηλαδή έχω βρει είναι για απλά regions και όχι nested regions σαν το παράδειγμα που έχω αναφέρει. Από την άλλη είμαι περίεργος να δω πια προσέγγιση θα χρησιμοποιήσεις για να λύσεις την ιεραρχία το scope και το messaging από το αρχικό ViewModel σε αυτά που έχουν ανοίξει κάτω από αυτό. Δεν θα καταλήξεις να φτιάξεις ένα custom αντίστοιχο workitem;
  •  14-10-2011, 22:17 67785 σε απάντηση της 67782

    Απ: Σκέψεις για το Prism (Workitem)

    Πάω στοίχημα ότι τελικά δεν κοίταξες τα παραδείγματα ή προσπαθείς να βρεις το CAB κάπου εκεί μέσα και φυσικά δεν βγαίνει άκρη. Κοίτα το Screens, Conductors and Composition για ένα παράδειγμα πως γίνεται η σύνθεση των viewmodels και των αντίστοιχων Views τους. Αν προσέξεις την "τρισδιάστατη" αναπαράσταση των Views θα δείς ότι όχι μόνο είναι nested, αλλά και σε πολλά επίπεδα.

    Όσο για το πως γίνεται αυτό σε επίπεδο XAML: το Shell περιέχει ItemControls και ContentControls τα οποία γίνονται bind στα child ViewModels τα οποία δείχνουν τα δικά τους Views (XAML δηλαδή) τα οποία έχουν τα δικά τους ItemControls κλπ κλπ κλπ.

    Πως θα κάνεις activate ένα από τα child του δεύτερου επιπέδου? Κάνοντας το activate και θα γίνουν αυτόματα activate και όλα τα child του child. Πως θα επικοινωνήσουν όλα αυτά μεταξύ τους? Υπάρχει ο EventAggregator ο οποίος παρέχει Publish, Subscribe για μηνύματα που ορίζεις εσύ.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2011, 05:24 67801 σε απάντηση της 67785

    Απ: Σκέψεις για το Prism (Workitem)

    Όχι το κοίταξα αλλά δεν το πρόσεξα γιατί τον τελευταίο καιρό έχω δει τόσα που όταν δω την εικόνα ή διαβάσω λίγο και δω ότι δεν κάνει πάω παρακάτω. Το παράδειγμα δεν ήταν το πιο αντιπροσωπευτικό με αποτέλεσμα να μην φαίνονται οι δυνατότητες του framework για κάποιον που έχει κουραστεί να ψάχνει. Έχει ένα PresentationContentControl για Conductor με αποτέλεσμα να μην μπορώ να δω όταν έρχεται ένα view μπροστά που το έχω καλέσει με κώδικα, αν γίνεται από πίσω active το parent view (Στο συγκεκριμένο δεν μπόρεσα να καταλάβω από τον λίγο κώδικα που είχε). Κάτι που με TabControl μέσα σε TabControl και τα views σε pages θα το έβλεπα καλύτερα ή με όποιον άλλο τρόπο ήθελαν αυτοί, αρκεί να φαίνεται το composition και όχι να ψάχνω μέσα σε κώδικα για να δω αν μου κάνει ή όχι.

    Με την επιμονή σου όμως ξανά στο παράδειγμα του έριξα άλλη μία ματιά το Σ/Κ και κατέβασα και το Calliburn.

    Κατέβασα και τα παραδείγματα που έχει αλλά δεν το βρήκα μέσα, εκτός και αν έχει άλλο τίτλο το project από αυτό που γράφει στο παράδειγμα. Όπως και να έχει βρήκα αυτό που έψαχνα και ευχαριστώ.

    Μία ακόμα ερώτηση, με τον EventAggregator, μπορώ να ελέγξω το scope του message γιατί το παράδειγμα που έχουν είναι πολύ απλό. Θα μπορούσα δηλαδή να επέλεγα έναν Conductor και σε όσα Views έχουν ανοίξει μέσα σε αυτόν να στείλω ένα μήνυμα ή η υλοποίησή του είναι γενική και τα μηνύματα πάνε σε όλη την εφαρμογή;

  •  17-10-2011, 14:46 67805 σε απάντηση της 67801

    Απ: Σκέψεις για το Prism (Workitem)

    Δεν υπάρχει περίπτωση να βγάλεις άκρη όσο προσπαθείς να βρεις κάτι που είναι ολόιδιο με αυτό που ήξερες. Απλά θα πελαγοδρομείς. Αρχιτεκτονική όμοια με του CAB δεν θα ξαναδείς. Αν θέλεις να καταλάβεις τί κάνει ένα framework θα πρέπει να καταλάβεις τη δική του λογική και να αρχίσεις να κοιτάς πως δουλεύει. Bούτηξες κατευθείαν στα πιο περίπλοκα κομμάτια του WPF προσπαθώντας να βρεις κάτι που υπήρχε κάποτε. Το learning curve για το WPF και το MVVM είναι 100 φορές μικρότερα απ' ότι για το CAB αλλά υπάρχει. Πρέπει πρώτα να καταλάβεις πως δουλεύει η πλατφόρμα σου και μετά να προχωρήσεις σε πιο περίπλοκα θέματα.

    Καταρχήν, κάποια πράγματα παρέχονται από το ίδιο το WPF και δεν χρειάζονται επιπλέον υποστήριξη από κάποιο framework. Για παράδειγμα, όλα τα ItemControl όπως και το TabControl μπορούν να γίνουν bind σε ένα collection (π.χ. Customers) και να δείξουν οποιοδήποτε Content τους ορίσεις μέσω Templates. The WPF way είναι να φτιάξεις ένα Adapter ο οποίος θα εντοπίζει το κατάλληλο content (το κατάλληλο UserControl ουσιαστικά) και θα επιστρέφει αυτό για κάθε item που θέλεις να δείξεις. Φυσικά κάθε TabItem μπορεί να περιέχει άλλα ContentControls ή ItemControls τα οποία θα γίνονται bind σε κάποιο άλλο αντικείμενο κοκ.

    Είναι καθαρά δικό σου θέμα ή του framework που χρησιμοποιείς πως θα χρησιμοποιήσεις τα templates και το binding για να υλοποιήσεις regions. To Caliburn.Micro δεν έχει ένα ειδικό τρόπο καθώς σκοπός του είναι η απλότητα. Μπορείς όμως άνετα να υλοποιήσεις το δικό σου, καθώς ουσιαστικά χρειάζεσαι μόνο μία λίστα με τα ενεργά ViewModels και το "region" στο οποίο θέλεις να εμφανίζεται το κάθε ViewModel. Το PRISM υλοποιεί κάτι τέτοιο αν και απαιτεί την χρήση δικών σου adapters για να χρησιμοποιήσει TabControl. Το Prism για Silverlight έχει έτοιμο ένα TabControlRegionAdapter Ρίξε μία ματιά στο Prism and WPF - Custom Tab Region Adapter για να δεις πως γίνεται αυτό και σε WPF. Έχω υλοποιήσει παρόμοιο adapter για RadTabControl της Telerik αλλά όπως θα δεις ο κώδικας είναι καμμιά 100αριά γραμμές και απαιτεί να καταλαβαίνεις πως δουλεύει το WPF, και τί ρόλο έχουν οι adapters και τα regions. Στο τέλος όμως μπορείς να μετατρέψεις ένα TabControl σε region απλά προσθέτωντας 1-2 properties:
    <telerik:RadTabControl  x:Name="MainRegionTabs"
     prism:RegionManager.RegionName="MainRegion"
     Regions:RadTabControlRegionAdapter.ItemContainerStyle="{StaticResource TabHeaderStyle}"/>

    Ο κώδικας που κάνει όλη τη δουλειά πίσω από τον Adapter απλά προσθέτει/αφαιρεί TabItems κάθε φορά που αλλάζει το collection των Regions. 

    Όσον αφορά τα Views, αυτά έχουν δευτερεύοντα ρόλο σε όλα τα MVx patterns αλλά και στο Caliburn.Micro. Όπως σε όλα τα ΜVx patterns η σύνθεση γίνεται στο X -  είτε είναι controller, presenter ή εδώ, ViewModel. Ουσιαστικά μιλάς και ενεργοποιείς ViewModels και το framework αναλαμβάνει να βρει το κατάλληλο View για να το ενεργοποιήσει.  

    Τα ίδια τα Views είναι απλά UserControls, άντε Windows αν χρειαστεί, τα οποία απλά απεικονίζουν τα δεδομένα που τους στέλνει το ViewModel Μέσω του command και data binding τα δεδομένα που εμφανίζονται στα views προέρχονται όλα από το ViewModel. Μπορείς άνετα τη μία στιγμή να δείξεις ένα grid το οποίο θα εμφανίζει δεδομένα και αμέσως μετά να το αλλάξεις σε chart, το οποίο θα δείχνει πάλι τα ίδια δεδομένα καθώς θα κάνει bind στο ίδιο ViewModel.

    Ειδικά στην περίπτωση του Caliburn.Micro, το binding γίνεται με βάση τα ονόματα: το XyzView κάνει bind στο XyzViewModel, το grid Customers του view κάνει bind στο collection Customers του ViewModel, το κουμπί AddCustomer στη μέθοδο AddCustomer κλπ.

    Όσον αφορά τo Screens sample, είναι το Caliburn.Micro.HelloScreens στα samples.

    Όσο για τον EventAggregator ... γιατί να ελέγξεις το scope? Αν ένας subscriber ΔΕΝ θέλει να απαντήσει σε ένα μήνυμα, ΔΕΝ απαντάει. Να μην πω, αν δεν το θέλει, ας μην κάνει subscribe. Από την άλλη, αν είσαι σίγουρος ότι το θέλεις, δηλαδή αν βρεις κώδικα ο οποίος θα γινόταν απλούστερος αν υπήρχε το scope, δεν σε εμποδίζει τίποτε να γράψεις τον δικό σου EventAggregator. Ο κώδικας είναι πολύ απλός και τροποποιείται εύκολα.


    Το Caliburn.Micro είναι αρκετά απλό και έχει ένα πολύ στρωτό documentation σε σχέση με το Prism (κάτι που μπορείς άνετα να πεις για οποιοδήποτε MVVM framework εδώ που τα λέμε). Πάρε το Soup to Nuts στο Documentation βήμα-βήμα .....



    Συγγνώμη αλλά πριν από καμμία ώρα έμαθα για την παραίτηση του Σπινέλλη και τα έχω πάρει πολύ άσχημα στο κρανίο. Απλά δεν μπορώ πλέον να συγκεντρωθώ. Εδώ και καμμια ώρα "εκφράζω τις ανησυχίες μου στο twitter". 

    Και μόλις απέκτησα μία πελώρια λαχτάρα για μορταδέλλα!

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  17-10-2011, 19:15 67807 σε απάντηση της 67805

    Απ: Σκέψεις για το Prism (Workitem)

    Ε τώρα είσαι λίγο υπερβολικός.

    Το ξέρω ότι δεν θα ξαναβρώ CAB. Άλλωστε στα Winforms για να σχεδιάσεις ένα framework σαν το CAB θα δημιουργούσες κώδικα ο οποίος θα ήταν δύσκολος στην αρχή για να τον καταλάβεις, σίγουρα το WPF θα μπορούσε κάποια από τα πράγματα αυτά να τα έκανε πιο απλά και με διαφορετικό τρόπο. Όμως όταν ακολουθείς ένα τρόπο σκέψης με συγκεκριμένες ανάγκες και απαιτήσεις ανάλογα με το τι σου δίνει η κάθε τεχνολογία το κάνεις. Για παράδειγμα δεν μπορώ να φανταστώ Composition χωρίς ιεραρχεία. Δεν υπάρχει Composition χωρίς ιεραρχεία. Το αν θα γράψεις κώδικα για να την πετύχεις, το αν θα κάνεις Binding είναι άλλο θέμα, αυτό είναι θέμα της τεχνολογίας. Αυτή την ιεραρχεία έψαχνα στο Prism.

    Στο CAB επίσης όταν ήθελες κάποια Views να φορτώνονται δυναμικά μέσα σε ένα control το όριζες σαν Workspace και είχες τους Adapters. Τα ίδια τα views τα έλεγες smartparts. Στο Prism έχεις κάτι ανάλογο με Regions και views και στο Calliburn με Conductors (ο οποίος κάνει implement ένα interface με όνομα IWorkspace) και screens. Και στο Prism αλλά και στο calliburn έχεις adapters για τα regions και conductors αντίστοιχα. Το αν θα έβαζες τα views μέσα στο Workspace, Calliburn, Prism με κώδικα ή θα χρησιμοποιούσες Binding είναι και αυτό άλλο θέμα. Η αντιστοίχιση όμως είναι η ίδια όπως βλέπεις.

    Χρειάζεσαι μία ιεραρχεία, χρειάζεσαι ένα Host control χρειάζεσαι ένα HostControl Adapter και το έκανες. Αυτά τα σημεία σύνδεσης έψαχνα να βρω. Βρήκα κάποια από αυτά όχι όμως όλα. Αν για παράδειγμα πας αύριο να φτιάξεις μία εφαρμογή σε HTML5 και βγει ένα άλλο framework θα πεις πως ορίζεται σε αυτό το framework το control μέσα στο οποίο φορτώνονται views δυναμικά;

    Τώρα όσο για το messaging είσαι παλιά καραβάνα που λένε και σίγουρα θα δούλεψες με CAB οπότε κατάλαβες πως και αυτή η ερώτηση έρχεται από εκεί. Σε συνέχεια των παραπάνω δεν ψάχνω να το βρω ακριβώς όπως στο CAB αλλά σαν λειτουργία είχε την σημασία της και την χρησιμότητα της. Παραδείγματα πολλά, άλλωστε έχω φτιάξει αρκετές εφαρμογές με CAB που κάνω χρήση της δυνατότητας αυτής.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems