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

 

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

Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις

  •  09-12-2006, 20:41

    Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις

    Ανοίγω εδώ ένα θέμα το οποίο μπορεί άνετα να καταλήξει και στο Wiki ή να αποτελέσει πηγή για την δημιουργία ενός ωραίου άρθρου. Ξερω οτι μας βασανίζει (πολλούς από εμάς), αλλά δεν το είχαμε "πιάσει" ως τώρα στα χέρια μας αναλυτικά. Ιδού λοιπον:

    Σενάριο: Θέλουμε να δημιουργήσουμε μια απλή εφαρμογή 3/n-tier (ας το περιορίσουμε σε windows forms για να μην μπερδευτούμε). Εχουμε στα χέρια μας την εξής απόφαση / περιορισμό αρχιτεκτονικής: Ομορφα objects στο middle tier ΧΩΡΙΣ να μιλάμε με datasets απευθείας στο presentation, και ένα DAL το οποίο μπορεί να είναι custom ή να αποτελείται από typed datasets/tableadapters ή απο οτιδήποτε άλλο θέλουμε.

    Πιθανές προσεγγίσεις:

    1. Data carrier objects.

    Τα objects μας είναι απλά data carriers. Παράλληλα με τα object μας έχουμε manager/controller/whatever classes οι οποίες αναλαμβάνουν όλες τις CRUD λειτουργίες - συνεπώς, την επικοινωνία με το DAL. Οι ίδιοι managers (μην αναφέρω το μακρινάρι πάλι) είναι υπεύθυνοι για τη δημιουργία / population των objects και ενδεχομένως των collections μας. Αν ένα property κάποιου object αναφέρεται σε collection από άλλα objects, ο "manager" είναι υπεύθυνος να το κάνει populate.

    Παραλλαγή 1.1: Ενας τεράστιος manager με όλες τις CRUD λειτουργίες για όλα τα objects μας, singleton. (cohesion:high, coupling: low)
    Παραλλαγή 1.2: Ενας τεράστιος manager με όλες τις CRUD λειτουργίες για όλα τα objects μας, shared. (cohesion:high, coupling: low)
    Παραλλαγή 1.3: Πολλοί managers, ένας για κάθε object μας, όλοι shared. (cohesion:low, coupling: high - μεταξύ των managers)
    Παραλλαγή 1.4: Πολλοί managers, ένας για κάθε object μας, όλοι instance-based. (cohesion:low, coupling: high - μεταξύ των managers)
    Παραλλαγή 1.5: Πολλοί managers, ένας για κάθε object μας, όλοι singleton. (cohesion:low, coupling: high - μεταξύ των managers)

    Παράδειγμα:

    Εχουμε τις εξής κλάσεις:
    Customer
    CustomerManager

    Η δημιουργια ενός νέου customer object που τραβάει τα δεδομένα του από τη βάση γίνεται από τον CustomerManager κάπως έτσι (παραλλαγή 1.4):

    Dim cm as New CustomerManager()
    Dim cust as Customer()

    cust = cm.GetCustomerById(34)

    Εσωτερικά, ο Customer έχει ένα Orders property που αποτελεί ένα collection από Order objects. Υπεύθυνος για το population του Orders collection είναι ο CustomerManager (να γράψω sample κωδικα; μπα. Πιστεύω να το καταλαβαίνετε)

    2. "Εξυπνα" και "παχιά" objects - intermediate approach

    Τα objects μας είναι "ολίγον εξυπνα" όσον αφορά στο data access. Υπάρχουν οι προαναφερθέντες "managers", οι οποίοι όμως καλούνται από τα ίδια τα objects. Ετσι, κάθε object που περιέχει άλλα objects κάνει populate μόνο του τον εαυτό του και τα collections που τυχόν περιέχει.

    Παραλλαγές: Ολες οι παραπάνω, όταν έχουμε instance-based managers τα objects είναι υπεύθυνα για το initialization / disposal των managers αυτών.

    Παράδειγμα :

    Dim cust as New Customer(34) 'Ας πούμε οτι έχουμε overloaded constructors εδώ και αυτός το γεμίζει κιόλας

    cust.Name = "Lalakis"
    cust.Save()

    Εσωτερικά, για να δώσουμε π.χ. την cust.Orders property θα είχαμε τον εξής κώδικα για το property backer variable:

    Dim cm as New OrderManager()

    _orders=cm.GetOrdersByCustomer(Me.CustomerId)

     

    3. "Εξυπνα" και "παχιά" objects - full approach

    Εδώ δεν υπάρχουν "managers". Τα objects κάνουν απευθείας κλήσεις στο DAL για τις λειτουργίες τους.

    Παραλλαγή 3.1: Οι methods των objects που κάνουν κλήσεις στο DAL είναι shared.
    Παραλλαγή 3.2: Οι methods των objects που κάνουν κλήσεις στο DAL είναι instance-based.

    Παράδειγμα (παραλλαγή 3.1):

    Dim cust as Customer()

    cust = Customer.GetById(34)
    cust.Name = "Lalakis"
    Customer.Save(cust)


    Ερωτήματα:

    - Ειναι ορθές οι παραπάνω προσεγγίσεις ή κάποιες ειναι προβληματικές (κατά την άποψή σας πάντα); Εσείς τι επιλέγετε ανάλογα με την περίσταση;
    - Υπάρχουν άλλες προσεγγίσεις που τυχόν χρησιμοποιείτε (σε απλά σενάρια ή ακόμα και σε περίπλοκα) που δεν αναφέρονται εδώ;

    Να ζητήσω συγνώμη που τα δείγματα κώδικα είναι γραμμένα "στο πόδι" και από το μυαλό μου, και ίσως δεν δείχνουν επακριβώς τα πράγματα όπως θα ήθελα. Το θέμα είναι αρκετά μεγάλο και θέλω απλά να κάνω την αρχή για συζήτηση και όχι να απαριθμήσω ολες τις δυνατές προσεγγίσεις. Ομως πιστεύω οτι είναι ιδιαίτερα χρήσιμο να συζητήσουμε τι είδους προσεγγίσεις ακολουθούμε σε κάθε περίπτωση. Και ναι, πιστεύω οτι και τα ORMs είναι μέσα στο παιχνίδι, όμως ας δούμε τι γίνεται ΧΩΡΙΣ αυτα. Με την έννοια οτι ξέρω οτι ο Παναγιώτης (και με το δίκιο του) θα μας προτείνει να βάλουμε ένα nHibernate σε κάποιες από τις παραπάνω περιπτώσεις. Ομως, θα ήθελα να συζητήσουμε για την προσέγγιση με βάση τα εργαλεία που μας δίνει η Microsoft, και όχι με βάση τρίτα βοηθήματα.

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Δείτε όλες τις δημοσιεύσεις της Θεματική Ενότητας
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems