Καλημέρα παιδιά ...
.. ήρεμη μέρα σήμερα, κι είπα να ζητήσω γνώμες για ένα "τύποις" data layer που έγραψα και χρησιμοποιώ άρδην λίγο καιρό τώρα.
Η βασική ιδέα είναι η δυνατότητα για declarative definition όλων των data queries, καθώς και των data sources. Aυτά σε xml ( duh ... trendy boy

), σε ένα σχήμα κάπως έτσι:
<data-action id="SelectCount" type="0" data-source="local" query="select count(*) from ? where ?=0" cached="false"
cache-timeout="0">
<params>
<param name="tablename" type="String" required="true" />
<param name="deleted_fld_name" type="String" required="true" />
</params>
</data-action>
... και ...
<data-action id="GetSystemAttributes" type="1" data-source="local" query="sp_GetSysAttrValuesByAttrType" cached="true"
cache-timeout="3600000">
<params>
<param name="@Prefix" type="String" required="true" />
</params>
</data-action>
Στο programmatic μέρος της ιστορίας, όλα αυτά διαχειρίζονται απο 2 Singletons, ένα για τα data sources κι ένα για τα data queries. Όλο το initialization γίνεται σε 2 γραμμές κώδικα, και κάθε call είναι άλλη μια γραμμή:
FileStream io_in_ds = new FileStream(strXmlDSourcesPath, FileMode.Open, FileAccess.ReadWrite);
DataSourceManager.NewInstance(io_in_ds);
FileStream io_in = new FileStream(strXmlActionsPath, FileMode.Open, FileAccess.ReadWrite);
DataActionManager.NewInstance(io_in);
DataSet ds = DataActionManager.GetInstance().ExecuteQuery("GetSystemAttributes",
new object[] {pid});
Το βασικό "πλεονέκτημα" που κυνήγησα σε αυτό το approach, ήταν οτι βάζω τον data access κώδικά μου σε ένα και μοναδικό σημείο, κι έτσι κερδίζω στα κάτωθι:
Όταν ο κώδικας δεν είναι διάσπαρτος και γραμμένος απο διακόσιους ανθρώπους, έχεις πολύ καλύτερο έλεγχο στην ποιότητά του. Μπορείς ας πούμε να διασφαλίσεις οτι τα πάντα θα εκτελεστούν σαν prepared statements, οτι τα connections θα ελευθερωθούν πίσω στο pool, κτλ κτλ
Έχοντας ένα single entry-point στο data access, μπορείς να κάνεις πράγματα όπως parameter validation & caching πολύ πιο εύκολα.
Δίνοντας ένα απλό interface στον προγραμματιστή, κι ένα εξ' ίσου απλό xml schema στον DB-guy, χωρίζεις τα responsibilities. Εγώ, σαν κωδικογράφος, δε χρειάζεται να ξέρω πως έχει γράψει ο άλλος τη βάση απο κάτω. Θέλω να ξέρω ένα τύποις interface μόνο, του στύλ "αυτό το query, μ'αυτό το όνομα κι αυτές τις παραμέτρους θα σου επιστρέψει αυτό κι αυτό". Τι με νοιάζει αν έιναι stored procedure, κάποιο direct query ή οτιδήποτε άλλο. Επίσης, σαν DB-guy, κάνω τη δουλειά μου, ορίζω ένα interface στην xml, manage-άρω εγώ τα connection strings ... transparently απ'την υπόλοιπη ομάδα, οι οποίοι .. δε χρειάζεται να ξέρουν

( encapsulation ?? )
Επίσης, αυτο το declarative επιτρέπει transparent αλλαγές, χωρίς re-compile. Αν αλλάξω data source απο Access σε SQL Server ... δε χρειάζεται να κάνω καμμία αλλαγή σε κώδικα, ούτε καν start-stop τον IIS σε περίπτωση ενός web app. Αν θέλω ν'αλλαξω cache settings .. piece of cake .. τελος πάντων, είναι πολύ πιο ευέλικτο paradigm.
Τέλος, έχοντας ένα μηχανισμό όπου κάθε data source έχει και έναν provider (ορισμένος στην xml, κλασσικά .. ), μπορώ να χρησιμοποιώ το ίδιο interface για queries σε μη-παραδοσιακές data sources, όπως flat files, xml, το Arc IMS (!!!) κτλ κτλ κτλ ...
Άντε .. πολλά είπα ε; Αν έχει κάποιος κάποια δεύτερη γνώμη να μοιραστεί ... θα χαρώ πολύ να συζητήσουμε το θέμα
Πολύ καλή μέρα μας
Angel
O:]