<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Design &amp; Architecture</title><link>https://www.dotnetzone.gr:443/cs/forums/16/ShowForum.aspx</link><description>Θέματα αρχιτεκτονικής και σχεδιασμού εφαρμογών (design patterns, object orientation, κ.α.)</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5549.aspx</link><pubDate>Sun, 18 Sep 2005 04:44:26 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5549</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5549.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5549</wfw:commentRss><description>Να 'μαι κι εγώ! Ετοιμαστείτε, για το μακρυνάρι. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Καταρχήν, να βάλουμε τα πράγματα στη θέση τους. Είναι λάθος να πεις ότι η Microsoft ή ο οποιοσδήποτε προτείνει να φτιάξεις μία κλάση στο DAL για κάθε οντότητα, ή το αντίθετο. Πως θα φτιάξεις το DAL, πως θα το παραμετροποιήσεις και πως θα το χρησιμοποιήσεις έχουν να κάνουν κάθε φορά με την εφαρμογή σου. Το ζήτημα έχει δύο (τουλάχιστον) διαστάσεις. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Η μία διάσταση έχει να κάνει με το πως ορίζεις τις κλάσεις σου, και έχει άμεση σχέση με το domain model της εφαρμογής σου. Αν η εφαρμογή είναι αρκετά απλή, μπορεί να μην υπάρχουν καν κλάσεις που να αντιστοιχούν στις οντότητες του domain model. Για παράδειγμα, αν θέλεις να φτιάξεις ένα απλό calculator, δεν υπάρχει λόγος να δημιουργήσεις κλάσεις για πράξεις, συναρτήσεις κλπ. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Σε πιο περίπλοκες εφαρμογές, είναι απαραίτητο να υπάρχουν κλάσεις στο business layer οι οποίες αντιστοιχούν στις οντότητες του domain model. Αν αυτό είναι απλό και αλλάζει σπάνια, η πιο απλή λύση είναι να φτιάξεις μια κλάση στο data layer για κάθε οντότητα. Αυτή είναι και η περίπτωση του Pet shop, όπου το domain model είναι σχετικά απλό (πελάτες, προϊόντα, παραγγελίες κλπ). &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Όσο πιο περίπλοκο ή ευμετάβλητο είναι το domain model, τόσο περισσότερο θα πρέπει να ψάξεις για λύσεις που θα επιτρέπουν την παραμετροποίηση. Όσο πιο ευέλικτη είναι όμως η λύση που θα επιλεξεις, τόσο δυσκολότερη θα είναι στην υλοποίηση. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Μία λύση είναι να χρησιμοποιήσεις code generators για να φορτώσεις τα δεδομένα των κλάσεων του business layer από τη βάση. Κάποιοι generators βασίζονται σε απλές παραμέτρους ή attributes, κάποιοι άλλοι μπορούν να δεχτούν το ίδιο το domain model σαν είσοδο και να δημιουργήσουν τον κώδικα που θα συνδέσει τις business κλάσεις με τη βάση, είτε μέσω dynamic sql ή με stored procedures. Κάποιοι μάλιστα μπορούν να δημιουργήσουν τα κατάλληλα stored procedures από το domain model. Το πλεονέκτημα των code generators είναι ότι μπορούν να παράγουν πολύ γρήγορο κώδικα. Το μειονέκτημα είναι ότι όταν αλλάζει το domain model οι generators πρέπει να εκτελεστούν ξανά. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Άλλη λύση είναι οι OR mappers. Στην πιο απλή περίπτωση, ο mapper αντιστοιχεί πεδία της βάσης ή ενός stored procedure σε πεδία μιας business class ή ενός data object. Πιό προχωρημένοι mappers μπορούν να χρησιμοποιήσουν το ίδιο το domain model ή views του domain model. Η διαφορά με τον code generator είναι ότι ο mapper διαβάζει το domain model κάθε φορά που εκτελείται η εφαρμογή. Το αποτέλεσμα είναι ότι είναι πολύ ευκολότερο να τροποποιήσει κανείς το domain model. Το μειονέκτημα είναι ότι πρέπει να εκτελεστεί κώδικας για διαβαστεί το domain model κάθε φορά. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Μπορεί να πετύχει κανείς ακόμα μεγαλύτερη ευελιξία όταν και τα business objects δημιουργούνται δυναμικά, διαβάζοντας μια περιγραφή του domain model. Το κύριο μειονέκτημα αυτής της λύσης είναι ότι είναι πιο αργή από τις άλλες, αλλά έχει ένα πολύ σημαντικό πλεονέκτημα. Η ανάπτυξη νέων εφαρμογών είναι πολύ ευκολότερη, κάτι που γίνεται πιο σημαντικό όσο πιο περίπλοκο ή ευμετάβλητο είναι το domain model. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Η άλλη διάσταση έχει να κάνει με το πώς και πότε πρέπει να αλλάξει το domain model. Αν είναι απαραίτητο το domain model να αλλάζει χωρίς να σταματήσει το σύστημα, θα πρέπει να χρησιμοποιηθεί μια λύση όπου τα domain models θα δημιουργούνται δυναμικά. Αν οι αλλαγές θα πρέπει να γίνουν στο χώρο του πελάτη αλλά δεν είναι απαραίτητο να συνεχίσει να λειτουργεί το σύστημα, μπορεί να χρησιμοποιηθεί OR mapper που θα διαβάζει το domain model από κάποιο configuration file. Τέλος, η απλούστερη λύση είναι να γίνουν οι αλλαγές πριν ή κατά το compile Και να δημιουργηθεί ένα νέο binary που θα σταλεί στον πελάτη. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Φυσικά υπάρχουν και άλλες διαστάσεις. Τί γίνεται, για παράδειγμα, όταν το business layer βρίσκεται σε άλλο μηχάνημα και η επικοινωνία πρέπει να γίνει μέσω Remoting? Πως υλοποιούνται απαιτήσεις ασφαλείας? Caching? &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Σε κάθε περίπτωση, όσο πιο ευέλικτη είναι η τεχνική, τόσο δυσκολότερη θα είναι και η ανάπτυξή της. Οι πιο γνωστοί code generators και mappers έχουν χρόνια ανάπτυξης από πίσω τους, ενώ έχουν και έτοιμα εργαλεία διαχείρισης. Γι αυτό και είναι προτιμότερο να χρησιμοποιήσεις έτοιμους code generators ή mappers, γιατί διαφορετικά θα ξοδέψεις πολύ σημαντικό χρόνο για να καταφέρεις να φτιάξεις ένα εφάμιλλο mapper. Αν βρεις ένα mapper που καλύπτει τις ανάγκες σου είναι προτιμότερο να τον χρησιμοποιήσεις παρά να προσπαθήσεις να δημιουργήσεις ένα νέο από το μηδέν. Μπορεί να φαίνεται εύκολο, αλλά ειδικά η δημιουργία των εργαλείων μπορεί να πάρει πολύ χρόνο. &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Σαν συμπέρασμα, αν δεν θεωρείς ότι η δημιουργία ενός mapper θα σου δώσει ένα ισχυρό σε σχέση με ανταγωνιστικά προϊόντα, καλύτερα να χρησιμοποιήσεις ένα έτοιμο. &lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Προτείνω τέλος να διαβάσεις το "Patterns of Enterprise Application Architecture" του Martin Fowler (ISBN 0321127420) όπου περιγράφει τόσο τα θέματα domain modelling, mapping όσο και concurrency.</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5545.aspx</link><pubDate>Sun, 18 Sep 2005 00:01:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5545</guid><dc:creator>George J. Capnias</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5545.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5545</wfw:commentRss><description>&lt;P&gt;Ο Παναγιώτης (pkanavos) σε αυτό το post έχει μαζέψει μια &lt;A HREF="/cs/forums/ShowPost.aspx?PostID=507"&gt;μεγάλη λίστα από O/R Tools&lt;/A&gt;. Μερικά από αυτά είναι δωρεάν, μερικά όχι. Μπορείτε να την δείτε και να πάρετε μια γεύση από O/R Tools.&lt;/P&gt; &lt;P&gt;&amp;nbsp;&lt;/P&gt; &lt;P&gt;George J.&lt;/P&gt; &lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5544.aspx</link><pubDate>Sat, 17 Sep 2005 23:41:16 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5544</guid><dc:creator>geochatz</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5544.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5544</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;axaros wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td width="100%" valign="top" class="txt4"&gt;Free O/R mapping tool : &lt;br&gt;http://www.olero.com/ormweb/index.aspx?mp=help &lt;br&gt; &lt;br&gt;Γιατί ο τζάμπα δεν πέθανε !!!! &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt; &lt;br&gt; Όντως ο τζάμπα δεν πέθανε, αν και στην συγκεκριμένη περίπτωση δεν είμαι και πολύ σίγουρος, καθώς το ORM αυτό έχει σταματήσει η ανάπτυξη και η υποστήριξη του. &lt;br&gt;</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5534.aspx</link><pubDate>Sat, 17 Sep 2005 02:07:17 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5534</guid><dc:creator>axaros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5534.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5534</wfw:commentRss><description>Free O/R mapping tool :&lt;br&gt;http://www.olero.com/ormweb/index.aspx?mp=help&lt;br&gt;&lt;br&gt;Γιατί ο τζάμπα δεν πέθανε !!!!&lt;br&gt;</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5528.aspx</link><pubDate>Sat, 17 Sep 2005 00:51:52 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5528</guid><dc:creator>Mitsaras</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5528.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5528</wfw:commentRss><description>Χρησιμοποιώ ένα χειροποίητο DAL σε κάθε εφαρμογή που αναπτύσσω, όπως αυτό που αναφέρει ο  pSychoK!LLer, και είναι γεγονός ότι ένα O/R mapper είναι ήδη απαραίτητο, ωστόσο δε θέλω να χρησιμοποιήσω έτοιμο κώδικα. Ο λόγος γι' αυτό, είναι ότι -απαιτώ- να γνωρίζω κάθε πτυχή του κώδικα που χρησιμοποιώ, και αν το παρακάνω με εξωτερικά components, δύσκολα θα το πετύχω.&lt;br&gt;&lt;br&gt;Σκοπεύω κάποια στιγμή να γράψω ένα O/R mapper αλλά σίγουρα θα αργήσει. Μέχρι τότε, το BL κάθε application αναλαμβάνει το O/R mapping.</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5523.aspx</link><pubDate>Fri, 16 Sep 2005 23:56:47 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5523</guid><dc:creator>Χρήστος Γεωργακόπουλος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5523.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5523</wfw:commentRss><description>Μόλις ανακάλυψες την ανάγκη για "O/R Mapping". Κάνε ένα search...</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5518.aspx</link><pubDate>Fri, 16 Sep 2005 23:10:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5518</guid><dc:creator>pSychoK!LLer</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5518.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5518</wfw:commentRss><description>Νομίζω πως θα μπορουσες να έχεις ένα DAL το οποίο θα "μιλάει" απευθείας με το BL και αρκετά DB-Specific DALS για κάθε διαφορετικό τύπο βάσης. &lt;br&gt;Έτσι θα πετύχαινες transparrency στο BL. &lt;br&gt;Θα καλούσες τις ίδιες μεθόδους του DAL ανεξάρτητα από τον τύπο της βάσης σου, το οποίο θα είναι υπεύθυνο για την επικοινωνία μe το αντίστοιχο layer.</description></item><item><title>Απ: Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5517.aspx</link><pubDate>Fri, 16 Sep 2005 22:59:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5517</guid><dc:creator>axaros</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5517.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5517</wfw:commentRss><description>&lt;P&gt;Zeon , ξεκίνησες καλό θέμα ...&lt;BR&gt;Φυσικά περιμένω να διαβάσω τα σχετικά σχόλια από το βαρύ πυροβολικό του forum αλλά δεν χρειάζεται να γράψεις δυναμικά statements αν έχεις κάποιο πιο generic DAL. Θα μπορούσες για παράδειγμα να έχεις κάποια μέθοδο σε κάποιο (generic mid) component που να να παίρνει σαν input το όνομα ενός sp και να σου επιστρέφει ότι διαλέξεις dataset κλπ ...&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Data access layer</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/5515.aspx</link><pubDate>Fri, 16 Sep 2005 22:26:20 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:5515</guid><dc:creator>zeon</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/5515.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=5515</wfw:commentRss><description>Επανέρχομαι λοιπόν με καινούρια ερώτηση που έχει να κάνει με το data
access layer. Διάβασα αρκετές γνώμες σε βιβλία και sites.Είδα και το
Petshop από microsoft καθώς και τα application block κλπ. &lt;br&gt;
Βέβαια καταλαβαίνω πως οι απόψεις πάνω στο θέμα είναι υποκειμενικές
αλλά έχω την εξής απορία. Αν βάλουμε στο DAL κλάσεις για κάθε οντότητα
(όπως κάνει για παράδειγμα η microsoft) καταλήγουμε στο να βάζουμε
τρελό αριθμό κλάσεων σε πραγματικό project. Επίσης σε κάθε project
είμαστε αναγκασμένοι να ξαναγράφουμε κλάσεις για το DAL. Αν όμως
φτιάξουμε μια δύο κλάσεις και περνάμε παραμέτρους πεδία, τιμές κ.λ.π.
σε μια μορφή που έχουμε ορίσει global τότε πιστεύω φτιάχνουμε μία φορά
το dal και το "κολλάμε" σε κάθε project. Αυτό βέβαια μας αναγκάζει να
φτιάχνουμε δυναμικά τα sql queries μέσα στο DAL και να μην δουλεύουμε
και με stored procedures. Ποια είναι η γνώμη σας επί του θέματος?&lt;br&gt;
&lt;br&gt;</description></item></channel></rss>