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

 

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

Απλούστερο MVC με Generic Controller;

Îåêßíçóå áðü ôï ìÝëïò Χρήστος Γεωργακόπουλος. Τελευταία δημοσίευση από το μέλος anjelinio στις 12-09-2006, 21:35. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-09-2006, 10:38 16594

    Απλούστερο MVC με Generic Controller;

    Έχω μια φόρμα από την οποία οι χρήστες κάνουν επιλογή εκτυπώσεων από μια λίστα και κάνοντας click στο κουμπί print εκτυπώνεται το επιλεγμένο report. Θέλω να κάνω αυτή τη φόρμα αρκετά generic ώστε να χρησιμοποιείται σε οποιοδήποτε section της εφαρμογής που έχει reports και να είναι όσο το δυνατόν απλούστερο για τους developers να προσθέτουν τα δικά τους reports.

    Όταν ο χρήστης επιλέγει ένα report, σε ένα διπλανό panel η φόρμα ανοίγει ένα έτοιμο user control (διαφορετικό για κάθε report) το οποίο μαζεύει τις απαραίτητες παραμέτρους. Μόλις γίνει click στο print, η φόρμα ζητάει από το user control τις παραμέτρους και τις μεταβιβάζει στο αντίστοιχο function που εμφανίζει το report.

    Το μοντέλο είναι ουσιαστικά MVC με την φόρμα να είναι ο controller, το parameters user control να είναι το view, και οι παράμετροι (η αν θέλετε το object των παραμέτρων) να είναι το model.

    Ο parent controller λοιπόν (από τον οποίο γίνονται inherit όλες οι φόρμες που κάνουν αυτή τη δουλιά, απλά με άλλα reports) έχει πάνω του μια μέθοδο AddReport την οποία χρησιμοποιούν οι developers για να προσθέσουν τα δικά τους reports σαν επιλογές. Αυτή θα πρέπει να δέχεται τα εξής ορίσματα:
    1. Τον τίτλο του report
    2. Τον τύπο του user control το οποίο μαζεύει τις απαιτούμενες παραμέτρους
    3. Την συνάρτηση η οποία πρέπει να κληθεί για να πάρει τις παραμέτρους και να εμφανίσει το report
    Το πρόβλημά μου είναι ουσιαστικά στο 3. Μια επιλογή που έχω υλοποιήσει είναι μέσα στο instance του controller που δουλεύω να ορίζω ένα delegate sub με τα ορίσματα της αντίστοιχης συνάρτησης και να το περνάω στο AddReport σαν System.Delegate για να το κάνω αργότερα invoke. Η λύση αυτή δεν μου αρέσει όμως γιατί αναγκάζει τους developers (juniors) να μπλέκουν με τη λέξη delegate.

    Θα ήθελα να το αντικαταστήσω με ένα απλό addressOf που είναι πολύ πιο εύκολα κατανοητό. Αυτό όμως προϋποθέτει ότι ουσιαστικά υπάρχει δηλωμένο ένα generic delegate μέσα στο controller base, το οποίο από τη στιγμή δεν ξέρει όλους τους τύπους models που μπορεί να λάβει σαν παραμέτρους θα με ρίξει σε boxing το οποίο θα μου φέρει άλλα προβλήματα μετά.

    Θα ήθελα απόψεις / λύσεις, με στόχο την όσο το δυνατόν μεγαλύτερη απλοποίηση της χρήσης για τους developers.

    tnx.


    Χρήστος Γεωργακόπουλος
  •  12-09-2006, 10:55 16598 σε απάντηση της 16594

    Απ: Απλούστερο MVC με Generic Controller;

    Μια λύση θα ήταν αντί για delegate να ζητάς για παράμετρο ένα function object. Αυτό θα μπορούσε να είναι ένα object που υλοποιεί ένα interface σαν το
    interface  IDisplayReport
    {
      void DisplayReport(ReportParametersBase a_Parameters);
    }


    Και οι παράμετροι να είναι μαζεμένες σε ένα object που κληρονομεί από το ReportParameterBase. Αν μάλιστα το ReportParameterBase μπορεί να χρησιμοποιηθεί σαν hash table με κλειδί το όνομα της παραμέτρου, τότε δεν είναι καν απαραίτητο να το κληρονομήσεις αλλά μπορείς να το χρησιμοποιήσεις ως έχει.
    Και βέβαια δεν είναι απαραίτητο να δημιουργήσεις μια νέα κλάση για να το κάνεις αυτό. Αρκεί να υλοποιήσεις το IDisplayReport στην κλάση που θα περιείχε τη function με την οποία θα δημιουργούσες τον delegate.

    Νατάσα Μανουσοπούλου
  •  12-09-2006, 11:25 16603 σε απάντηση της 16598

    Απ: Απλούστερο MVC με Generic Controller;

    Είναι κι αυτό μια ιδέα. Κοίτα όμως πως είναι τώρα:

    Delegate Sub ShowFirstReportDelegate(ByVal categoryID As Integer)
    Private Shared Sub ShowFirstReport(ByVal categoryID As Integer)
        Dim MyReport As New CategoryReport
        MyReport.Show()
    End Sub


    Και μέσα από το instance του controller έχω:

    Dim ShowFirstReportFunctionDelegate As ShowFirstReportDelegate = AddressOf ShowFirstReport
    Me.AddReportOption("Εκτύπωση κατηγορίας", GetType(FirstReportParametersControl), ShowFirstReportFunctionDelegate)


    Έχω επιβαρύνει τους developers με το να φτιάξουν ξεχωριστά ένα ParametersControl και με το να δουν τη λέξη delegate. Με αυτό που προτείνεις θα τους γλυτώσω από το delegate, αλλά θα τους επιβαρύνω με την κατασκευή ενός νέου object που θα έχει μέσα το function.

    Καλή η ιδέα σου, την κρατάω, απλά τα κριτήρια επιλογής της λύσης είναι περισσότερο ψυχολογικά...

    Χρήστος Γεωργακόπουλος
  •  12-09-2006, 21:35 16652 σε απάντηση της 16598

    Απ: Απλούστερο MVC με Generic Controller;

    Νομίζω η φίλτατη mns πρότεινε μια πολύ "καθαρή" λύση, Χρήστο. Όσο για το extra object, έχει ήδη απαντήσει η ίδια ...

     mns wrote:

    Και βέβαια δεν είναι απαραίτητο να δημιουργήσεις μια νέα κλάση για να το κάνεις αυτό. Αρκεί να υλοποιήσεις το IDisplayReport στην κλάση που θα περιείχε τη function με την οποία θα δημιουργούσες τον delegate.


    Τώρα, έρχομαι εγώ και ρωτάω ... οι εκάστοτε juniors σίγουρα έχουν γράψει event handlers στη ζωή τους. Έμμεσα λοιπόν, έχουν αγγίξει την έννοια του delegate. Πέρα όμως απο αυτό, η ύπαρξη ενός delegate σαν παράμετρος σε μέθοδο, ίσως μπορεί να ιδωθεί και ως ... μεταβίβαση γνώσης ή έναυσμα να γίνουν καλύτεροι απο ότι είναι ήδη.

    Η γνώμη μου είναι οτι οι δύο τρόποι είναι σχεδόν ισοδύναμοι, με μια ροπή προς το interface ως πιο "φιλικό" στον προγραμματιστή. Παρ' όλα αυτά, δε νομίζω ότι η ύπαρξη του delegate είναι απαραίτητα κακό πράγμα.

    Σταματάω εδώ όμως, γιατί θα κάνουμε ένα τεχνικό post άσκηση φιλοσοφίας ( ... πάλι ...) :D

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