<?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>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/31609.aspx</link><pubDate>Wed, 09 May 2007 07:21:14 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:31609</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/31609.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=31609</wfw:commentRss><description>&lt;P&gt;Ο Δημήτρης έχει δίκιο. Κολλώντας μία ασαφή ερώτηση σου σε ένα thread που έχει ουσιαστικά κλείσει, οι πιθανότητες να πάρεις απάντηση είναι ελάχιστες. Όσον αφορά την αρχική σου ερώτηση, δεν είναι δύσκολη, αλλά υπερβολικά ασαφής.&amp;nbsp;Ποιές καταχωρήσεις θέλεις να γίνονται μαζί? Τί εννοείς να γίνονται μαζί? Τί εννοείς καταχωρήσεις? Χρησιμοποιείς κλάσεις, datasets, τί? Παραδείγματα βιβλίου? &lt;/P&gt;
&lt;P&gt;Από τη στιγμή που έχεις ήδη τα βιβλία και αν το πρόβλημα σου είναι να καταλάβεις τα παραδείγματα, θα πρότεινα απλά να τα προσέξεις περισσότερο. Μήπως έχεις φτιάξει μία εικόνα στο μυαλό σου και προσπαθείς να ταιριάξεις το βιβλίο σε αυτή? Η ανάπτυξη n-Tier εφαρμογών διαφέρει αρκετά από την ανάπτυξη απλών φορμών. Θα πρέπει εσύ να προσαρμοστείς σε όσα σου λέει το βιβλίο, όχι να προσαρμόσεις το βιβλίο σε όσα νομίζεις.&lt;BR&gt;Τα παραδείγματα των βιβλίων είναι πάντα απλοποιημένα. Αν δεν μπορείς να τα καταλάβεις, θα έχεις μεγάλο πρόβλημα στην ανάπτυξη μίας εφαρμογής. Επιπλέον, όπως σου είπε και ο Kelman, κανένα βιβλίο δεν μπορεί να καλύψει τα πάντα. Θα πρέπει να διαβάσεις και το MSDN, το οποίο καλύπτει σχεδόν κάθε τομέα.&lt;/P&gt;
&lt;P&gt;Ίσως τέλος απλά να χρειάζεσαι πιο βασικά πράγματα από το πως να φτιάξεις μία N-TIER εφαρμογή. Η ερώτηση που έκανες δεν έχει τίποτε να κάνει με N-tier, αν και δεν κατάλαβα ακριβώς τι εννοείς. Προσπαθείς να αποθηκεύσεις αντικείμενα? Πίνακες? Τί? Μήπως πρέπει να ξεκινήσεις με ένα εισαγωγικό βιβλίο για VB.NET πριν περάσεις σε N-tier? &lt;/P&gt;
&lt;P&gt;Όσο κάνεις τόσο ασαφής ερωτήσεις, απάντηση δεν θα παίρνεις. Στο εξήγησε και ο Kelman, σπάνια υπάρχει χρόνος για να απαντήσει κανείς σε ασαφής ερωτήσεις. Μία συγκεκριμένη ερώτηση συνήθως παίρνει απάντηση σε λιγότερο από 1 ώρα. Μία γενική ερώτηση μπορεί να χαθεί. Μία ασαφής ερώτηση μάλλον δεν θα πάρει απάντηση. &lt;/P&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/31600.aspx</link><pubDate>Tue, 08 May 2007 22:49:53 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:31600</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/31600.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=31600</wfw:commentRss><description>&lt;p&gt;Προσπάθησε να διατυπώσεις ακριβώς αυτό που θέλεις να κάνεις σε ένα νέο thread και βλέπουμε.&lt;/p&gt;&lt;p&gt;Ποια είναι ακριβώς η ερώτηση;&amp;nbsp;&lt;/p&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/31597.aspx</link><pubDate>Tue, 08 May 2007 22:11:51 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:31597</guid><dc:creator>Ηλίας Κεκάκος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/31597.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=31597</wfw:commentRss><description>&lt;P&gt;&amp;nbsp; Γειά σας παιδιά.&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Είμαι ένας από τους πολούς που προσπαθούν να μάθουν να γράφουν N-TIER εφαρμογές σε VB.NET. Έχουν πέσει στα χέρια μου κάποια βιβλία τα οποία αναπτύσουν μία εφαρμογή και ταυτόχρονα προσπαθούν να σου μάθουν πως γίνετε αυτό. Φαίνετε όμως ότι έχω κάποια κενά και δεν μπορώ να καταλάβω πως μπορώ να ολοκληρώσω τα παραδείγματα αυτά σύμφωνα με τον τρόπο που θέλω να γίνονται οι καταχωρήσεις, πχ όχι μία-μία αλλά όλες μαζί (όπως κάνουμε με ένα Dataset). Έχω ξαναθέσει την ερώτηση αυτή αλλά απάντηση δεν πήρα, για να είμε ακριβής πήρα μιά απάντηση από τον &lt;A href="http://www.dotnetzone.gr/cs/forums/thread/28887.aspx"&gt;KELMAN&lt;/A&gt;. Από την απάντησή του αλλά και από τις μη απαντήσεις των υπολοίπων καταλαβαίνω ότι ζητάω κάτι δύσκολο που μπορεί να γίνει μέσω του forum. Δεν ξέρω ίσως ζητάω πολλά, αλλά αν υπάρχει κάποιος άλλος τρόπος πχ μέσω email και κάποιος έχει το χρόνο να το κάνει θα του ήμουν υπόχρεως.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; Thanks &lt;/P&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22053.aspx</link><pubDate>Tue, 12 Dec 2006 20:07:27 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22053</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22053.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22053</wfw:commentRss><description>[&lt;i&gt; ... είμαι σε άδεια, και τριγύρναγα σαν το τουριστάκι την Αθήνα με το Μετρό για αλλαγή, και έχασα αυτό το thread απ'την αρχή ... προσπαθώ να catch up όμως&lt;/i&gt; :P ]&lt;br&gt;&lt;br&gt;Πρώτα να πώ ότι έχοντας στο παρελθόν αναγκαστεί να γράψω πολλές "GetByXXX" μεθόδους τόσο σε Managers όσο και σε "ημι-εξυπνα" Data Transfer Objects - τα οποία πολλοί θεωρούσαν Business Objects λόγω ενός υποτυπώδους validation και 3-4 rules, ΜΙΣΩ πλέον αυτό το approach. Πολύ copy - paste inheritance ρε παιδιά, brain-dead εργασία.&lt;br&gt;&lt;br&gt;Επίης θεωρώ οτι τα &lt;b&gt;typed datasets&lt;/b&gt; δεν είναι και τόσο "&lt;i&gt;αισχρά&lt;/i&gt;" όσο πιστεύουν πολλοί. Σε ένα generic approach σαν αυτό που περιέγραψε ο Πάνος, τα typed datasets θα μπορούσαν κάλλιστα να είναι ο mapper, γι' αυτό φτιάχτηκαν άλλωστε.&lt;br&gt;&lt;br&gt;Στη δουλειά τώρα. Μάλλον είμαστε τυχεροί σε αυτή την εταιρία, γιατί έχουν περάσει κατα καιρούς αρκετοί έξυπνοι άνθρωποι, ένας εκ των οποίων ο Μάριος Μαργαρίτης. Πολλοί απο εμάς - &lt;i&gt;κι εγώ δεν τον πρόλαβα&lt;/i&gt; &lt;i&gt;live στην εταιρία&amp;nbsp; &lt;/i&gt;- τον έχουν δεί σε κάποιο DevDay πέρυσι να μιλαέι για DataAccess, έχοντας σαν παράδειγμα ένα DAL βασισμένο σε Typed Datasets. Αυτό, έχει δεν έχει περιορισμούς, το "&lt;i&gt;κληρονομήσαμε&lt;/i&gt;" στη δουλειά, και είναι η αλήθεια οτι μας έχει βολέψει. DataSet persistence με μια γραμμή κώδικα. &lt;br&gt;&lt;br&gt;Θεωρώ λοιπόν το typed dataset ως mapper και data transfer object μαζί. Επίσης, μου δίνει και πάμπολλα utilities όπως calculated πεδία, filtering, HasChanges (!!! ΠΟΛΥ ΣΗΜΑΝΤΙΚΟ !!!), και διάφορα άλλα μικρά καλούδια.&lt;br&gt;&lt;br&gt;So far λοιπόν,  έχω retrieval / persistence ( &lt;i&gt;οκ, retrieval με πολύ basic criteria για τώρα, βάσει PKeys &amp;amp; relations στο DataSet, αλλά το συζητάμε μετά αυτό&lt;/i&gt; ), σε κάποια DTOs, σχεδόν automagically. &lt;br&gt;&lt;br&gt;Τώρα, τα business objects. Μεγάλο κεφάλαιο. Αν πιστέψεις το φίλο μας το CSLA, to Customer είναι ένα business object. Κατα συνέπεια, στην περιγραφή του σεναρίου σου, τα ουσιαστικά μεταφράζονται σε "business objects". &lt;u&gt;Διαφωνώ. &lt;/u&gt;Τα business objects θα έπρεπε να είναι πολύ πιο coarse grained - "μεγαλύτερα" αντικείμενα, τα οποία χρησιμοποιούν τα data transfer objects για να κάνουν τη δουλειά τους. &lt;br&gt;&lt;br&gt;Στη δικιά μας δουλειά, ένα τέτοιο business object - &lt;i&gt;ActivityDataSources τα λέμε εμείς &lt;/i&gt;- χρησιμοποιεί κατα μέσο όρο 4-5 typed datasets, τα οποία γίνονται load on demand όταν χρειάζονται, γίνονται persist μόνο όταν έχουν αλλαγές, και σύντομα θα γίνονται cached &amp;amp; discarded όταν πλέον δεν τα χρειάζεται κανείς.&amp;nbsp; Όλα αυτά βάσει ενός generic manager μηχανισμού, όχι πολύ διαφορετικού απο αυτόν που προτείνει ο Παναγιώτης στην πρώτη σελίδα.&amp;nbsp;  ( &lt;i&gt;Τύποις generic, γιατί είμαστε ακόμη παγιδευμένοι σε 1.1, αλλά μόλις "ροκανίσαμε" την πρώτη μπάρα στο παράθυρο !!!&lt;/i&gt; :D&amp;nbsp; )&lt;br&gt;&lt;br&gt;Τώρα στο άμεσο μέλλον, θα ήθελα πολύ να λύσω δύο "προβλήματα".&lt;br&gt;&lt;br&gt;1. Fill τα typed datasets μου, όχι μόνο βάσει primary keys &amp;amp; relations, αλλά με πιο σύνθετα κριτήρια.&lt;br&gt;2. Να είμαι Persistence Medium Agnostic. Γιατί να ξέρω ΠΟΥ σώζονται αυτά που σώζωνται;&lt;br&gt;&lt;br&gt;Αυτά τα δύο σκοπεύω να τα λύσω "μπλέκοντας" το DAL που κληρονομήσαμε απο το Μάριο, με το δικό μου, το πρώτο μου post σε αυτό το site πριν 1-μισι χρόνο, στο οποίο χρησιμοποιώ external configuration files για να ορίσω "data actions" τα οποία η εφαρμογή μου καλεί by name, και μου δίνουν κι αυτά μετά διάφορα καλούδια, κυρίως όμως caching, parameter validation &amp;amp; persistence medium adaptability. &lt;br&gt;&lt;br&gt;Τελειώνοντας, να πώ οτι το Object Orientation , και γενικότερα η πληροφορική, είναι σαν πλαστελίνη. Δεν είναι "σκληρή επιφάνεια", μας δίνει ένα βασικό set of rules - mentallity καλύτερα, κι απο 'κεί και μετά είμαστε υποχρεωμένοι να "εξελιχθούμε" σε .. fluid καταστάσεις. Δε χρειάζεται τα ουσιαστικά στην πρόταση να είναι ντε και καλά objects, στην πραγματική ζωή. Αυτό ήταν και το βασικό misconception στους Java/EJB developers που τελικά κατάφερναν να κάνουν γαιδούρια να αγκωμαχάνε απο το βάρος ... 4 objects.  &lt;br&gt;&lt;br&gt;Καλή φάση η άδεια, ακόμα και αν είναι μόλις 3 μέρες !!! &lt;br&gt;&lt;br&gt;Υ.Γ. Όλα τα παραπάνω, δεν αναιρούν την αμέριστη εκτίμησή μου στο O/R mapping, και αφορούν δεδομένα και objects τα οποία αναφέρονται directly σε "problem domain data" στη βάση δεδομένων μου. Όσον αφορά workflow &amp;amp; ui generation, όπου τα objects μου είναι by definition "έξυπνα", θα χρησιμοποιούσα O/R mapping χωρίς δεύτερη σκέψη. Βλέπετε, απο λύση σε λύση κι απο project&amp;nbsp; σε project&amp;nbsp; το structure αυτών των αντικειμένων δεν αλλάζει και τόσο συχνά. Απο την άλλη, η βάση ή καλύτερα &lt;i&gt;&lt;u&gt;το view του σχήματος της βάσης&lt;/u&gt;&lt;/i&gt; το οποίο καλείται να χρησιμοποιήσει η εφαρμογή για μια νέα λύση για πελάτη αλλάζει σχεδόν κάθε μήνα, με κάθε νέο project. Εκεί δε σε παίρνει να ξαναγράφεις κώδικα κάθε τόσο. &lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22050.aspx</link><pubDate>Tue, 12 Dec 2006 19:09:33 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22050</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22050.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22050</wfw:commentRss><description>Γεια σας.&lt;br /&gt;
&lt;br /&gt;
Συνεχίζω από εκεί που έμεινα με βάση της ερωτήσεις του Σωτήρη (cap) :&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Μερικές ερωτήσεις επάνω σε αυτό:&lt;br /&gt;
&lt;br /&gt;
Ο manager σου αναλαμβάνει να διαχειριστει και τυχόν collections του object που διαχειρίζεται; &lt;br /&gt;
&lt;br /&gt;
Επίσης, ο manager είναι ένας, πολλοί, shared ή instance; &lt;br /&gt;
&lt;br /&gt;
Πώς δημιουργείς με αυτή την προσέγγιση ένα νέο, άδειο object;&lt;br /&gt;
&lt;br /&gt;
-------------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Όχι, ο Manager ή Managers που έχω δεν διαχειρίζονται collection των objects μου. Για αυτό υπεύθυνα είναι τα ίδια τα identities. &lt;br /&gt;
&lt;br /&gt;
Έχω πολλούς Managers π.χ DBManager ο οποίος επικοινωνεί με το DAL. Άρα οποιοδήποτε object θέλει να κάνει κάτι στην βάση θα περάσει μέσα από εκεί. Έχω ExportManager, όπου μέσα από εδώ στέλνω τα objects τα οποία θέλουμε να εκτυπώσουμε, να μετατρέψουμε σε XML και γενικά οτιδήποτε έχει να κάνει με αποστολή δεδομένων έξω από την εφαρμογή μου. Φυσικά έχω και τον αντίστοιχο Import. &lt;br /&gt;
&lt;br /&gt;
Τώρα τελευταία θέλω να προσθέσω μία νέα λειτουργία στις εφαρμογές μου χρησιμοποιώντας MSMQ. Μπορείτε να δείτε πόσο εύκολα μπορεί να γίνει αυτό;&lt;br /&gt;
&lt;br /&gt;
Όλοι οι Managers είναι Singleton, προς το παρών. Όχι γιατί δεν θα μπορούσαν να γίνουν multiinstance αλλά προτιμώ να δουλεύω με Singleton. &lt;br /&gt;
&lt;br /&gt;
H δημιουργία για ένα νέο άδειο object είναι δουλειά του Manager. Όπως ανέφερα ένα object δεν θα πρέπει να γνωρίζει το περιβάλλον και τις απαιτήσεις μέσα στο οποίο δουλεύει, θα πρέπει να γνωρίζει όμως βασικά πράγματα έτσι ώστε να δώσει οδηγίες στους Managers για το πως θα γίνει μία ενέργεια πάνω σε αυτό. &lt;br /&gt;
&lt;br /&gt;
Οπότε στων κώδικά μου δεν υπάρχει το &lt;br /&gt;
&lt;br /&gt;
Dim myCustomer as New Customer , αλλά &lt;br /&gt;
&lt;br /&gt;
Dim myCustomer as Customer&lt;br /&gt;
&lt;br /&gt;
myCustomer=myGeneralCollection.Create(AppObj.Customer)&lt;br /&gt;
&lt;br /&gt;
myCustomer.LastName="Parissis"&lt;br /&gt;
&lt;br /&gt;
myCustomer.FirstName="George"&lt;br /&gt;
&lt;br /&gt;
myDBManager.Save(myCustomer)&lt;br /&gt;
&lt;br /&gt;
Εδώ κάποιος θα μου πει. Ωραία και αν έγραφα Dim myCustomer as new Customer ποιο θα ήταν το πρόβλημα... Κανένα θα έλεγα. Σε αυτήν την φάση. Αν όμως πάμε λίγο πίσω στην κεντρική φράση "Κανένα object δεν θα πρέπει να γνωρίζει το περιβάλλον και τις απαιτήσεις απαιτήσεις, μέσα στο οποίο τρέχει" θα δούμε ότι ο κώδικας που έγραψα έχει σχέση με αυτό. Πολλές φορές ακόμα και στην ίδια την εφαρμογή, φανταστείτε πόσο μάλλον σε διαφορετικές, οι οποίες έχουν πουληθεί σε διαφορετικές γεωγραφικές περιοχές στην Ελλάδα ο χρήστης ίσως να θέλει να έχει διαφορετικές default τιμές στην δημιουργία κάποιων objects. Άρα το περιβάλλον τις εφαρμογής έχει μία απαίτηση. Δηλαδή όταν περνάω έναν νεο πελάτη και είμαι στην Αθηνα στην Πόλη να μου περνάει σαν default Αθήνα. Αυτό δεν είναι δουλειά του object να το γνωρίζει αλλά είναι πληροφορία που έχει να κάνει με την εφαρμογή και με τις ιδιαιτερότητες του χρήστη. Φυσικά ένα απλό παράδειγμα έφερα, μπορείτε να φανταστείτε πως μπορούν να επεκταθούν οι απαιτήσεις των χρηστών και σε άλλα πράγματα...&lt;br /&gt;
&lt;br /&gt;
Όσο για Dataset που ανέφερε ο Δημήτρης (papadi). Μπορεί να χρησιμοποιηθεί και αυτό αλλά εγώ δεν το προτιμώ. Χρησιμοποιώ DataBinding σε όλες τις εφαρμογές και λίστες αλλά Dataset που θα ήταν και η φυσική επιλογή όχι. Οι λόγοι είναι δύο :&lt;br /&gt;
&lt;br /&gt;
Resources... Είμαι απογοητευμένος μπορώ να πω... BindingList ανώτερο θα έλεγα.&lt;br /&gt;
&lt;br /&gt;
Δεν ταιριάζει με την φιλοφοφία του OOP (αφού μιλάμε για OOP). Καλά εδώ θα μου πείτε, έλα ρε Γιώργο είναι λόγος τώρα αυτός;... Όχι και έχετε δίκιο... τι να κάνω όμως είμαι ψείρας... &lt;br /&gt;
&lt;br /&gt;
Αν μέσα από αυτή την συζήτηση βγει κάποια σχεδίασει που έχει κάποια καλύτερα πλεονεκτήματα βεβαίως να την διαβάσω και να αρχίσω να δουλεύω πάνω σε αυτήν... &lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22047.aspx</link><pubDate>Tue, 12 Dec 2006 18:09:49 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22047</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22047.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22047</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;cap 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 valign="top" class="txt4"&gt;&lt;p&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;papadi 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 valign="top" class="txt4"&gt;&lt;/p&gt;
&lt;p&gt;Η κλάση αρχικοποιείται κάθε φορά από την αρχή για την αποθήκευση ενός dataset, μια φορά όμως αν το dataset περιέχει πολλές εγγραφές σε πολλούς πίνακες. Οπότε δεν είναι singeton ή shared, αλλά καθαρά instances κάθε φορά, μια που δεν έχουν state.&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;/p&gt;
&lt;p&gt;Ωπ. Να μια αφορμή για ερώτηση: Αφού έχεις stateless πράγματα, γιατί δεν φωνάζεις shared methods μιας κλάσης που ΔΕΝ χρησιμοποιεί shared members; Γιατί αρχικοποιείς κάθε φορά ένα ολόκληρο object μόνο για ένα single call; (Ερώτηση είναι, πραγματικά, οχι κριτική). Εκτός βέβαια και αν κινείσαι&amp;nbsp;με βάση την πρόβλεψη οτι θα σου επιτρέψει αυτή η υλοποίηση να προσαρμοστείς και σε πιό σκληρά σενάρια (com+, remoting και δεν συμμαζεύεται).&lt;/p&gt;
&lt;p&gt;Γενικά, τι σε ώθησε να&amp;nbsp;χρησιμοποιήσεις instances για&amp;nbsp;αυτή τη λειτουργία;&lt;/p&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;Σωστές ερωτήσεις! Ομολογώ με προβλημάτισαν για λίγο! Η αλήθεια είναι ότι έχω πιο σκληρά σενάρια (client/server web services), αλλά και σε αυτή την περίπτωση θα μπορούσα να έχω shared methods. Επειδή όμως ο εν λόγω manager διαχειρίζεται όλα αυτά τα layers (data change loging, event loging, permission control, relationship management, sql generator) ήθελαν να έχω πρόσβαση σε κάποια από αυτά με τη μορφή properties, διαφορετικά θα είχα πολύπλοκα method signatures. Τώρα καλώ myManager.Update(myQuery, myData), διαφορετικά θα έπρεπε να έχω πολλά overloads.&lt;br&gt;Π.χ. δεν θέλω να γίνει έλεγχος δικαιωμάτων στην περίπτωση μιας εσωτερικής διαδικασίας που κάνει ο application server (web services), ή δεν θέλω να γίνεται data loging στην περίπτωση αποθήκευσης μεγάλο όγκου δεδομένων (θα καθυστερούσε πολύ η διαδικασία. στην περίπτωση αυτή κάνω data loging με άλλο τρόπο).&lt;br&gt;Δίνει επίσης την ευκαιρία, μια που έχει ένα δικό της connection με την βάση, να εκτελέσω δυο update πολύπλοκων αντικειμένων σε ένα db transaction. Το connection κλείνει στο dispose της κλάσης (using myManager and new manager .......... end using)&lt;br&gt;Οπότε με όλα αυτά τα πλεονεκτήματα που μου δίνει η κλάση αυτή θεωρώ ότι η δημιουργία νέων instances κάθε φορά που την θέλω δεν αποτελεί μειονέκτημα.&lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22043.aspx</link><pubDate>Tue, 12 Dec 2006 10:47:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22043</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22043.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22043</wfw:commentRss><description>&lt;P&gt;&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;papadi 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 valign="top" class="txt4"&gt;&lt;/P&gt;
&lt;P&gt;Η κλάση αρχικοποιείται κάθε φορά από την αρχή για την αποθήκευση ενός dataset, μια φορά όμως αν το dataset περιέχει πολλές εγγραφές σε πολλούς πίνακες. Οπότε δεν είναι singeton ή shared, αλλά καθαρά instances κάθε φορά, μια που δεν έχουν state.&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;/P&gt;
&lt;P&gt;Ωπ. Να μια αφορμή για ερώτηση: Αφού έχεις stateless πράγματα, γιατί δεν φωνάζεις shared methods μιας κλάσης που ΔΕΝ χρησιμοποιεί shared members; Γιατί αρχικοποιείς κάθε φορά ένα ολόκληρο object μόνο για ένα single call; (Ερώτηση είναι, πραγματικά, οχι κριτική). Εκτός βέβαια και αν κινείσαι&amp;nbsp;με βάση την πρόβλεψη οτι θα σου επιτρέψει αυτή η υλοποίηση να προσαρμοστείς και σε πιό σκληρά σενάρια (com+, remoting και δεν συμμαζεύεται).&lt;/P&gt;
&lt;P&gt;Γενικά, τι σε ώθησε να&amp;nbsp;χρησιμοποιήσεις instances για&amp;nbsp;αυτή τη λειτουργία;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22040.aspx</link><pubDate>Tue, 12 Dec 2006 04:26:56 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22040</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22040.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22040</wfw:commentRss><description>Ξέχασα ίσως το πιο σημαντικό. Ο manager αυτός κάνει sql code generation για την επικοινωνία με τη βάση και αναλαμβάνει να δημιουργήσει κώδικα κατάλληλο για sql server ή oracle. Κάνει χρήση του sqlcommandbuilder ή oraclecommandbuilder με κάποιες τροποποιήσεις για τα autoincrement πεδία του sql server.&lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22039.aspx</link><pubDate>Tue, 12 Dec 2006 04:22:01 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22039</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22039.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22039</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;cap 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 valign="top" class="txt4"&gt;Μερικές ερωτήσεις επάνω σε αυτό:&lt;br&gt;
&lt;br&gt;
Ο manager σου αναλαμβάνει να διαχειριστει και τυχόν collections του object που διαχειρίζεται; &lt;br&gt;
&lt;br&gt;
Επίσης, ο manager είναι ένας, πολλοί, shared ή instance; &lt;br&gt;
&lt;br&gt;
Πώς δημιουργείς με αυτή την προσέγγιση ένα νέο, άδειο object;&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;Επειδή και εγώ δουλεύω όπως και ο infoCenter, απαντώ στις ερωτήσεις σου έχοντας στο μυαλό μου τη δική μου προσέγγιση. Άλλωστε, συζήτηση να γίνεται.&lt;br&gt;Για μένα το DTO μου είναι το dataset. Και έχω όπως ο infoCenter μια γενική κλάση που αναλαμβάνει να αποθηκεύσει οποιοδήποτε object (dataset). Η κλάση αρχικοποιείται κάθε φορά από την αρχή για την αποθήκευση ενός dataset, μια φορά όμως αν το dataset περιέχει πολλές εγγραφές σε πολλούς πίνακες. Οπότε δεν είναι singeton ή shared, αλλά καθαρά instances κάθε φορά, μια που δεν έχουν state.&lt;br&gt;Ένα layer που υπάρχει στην κλάση αναλαμβάνει να ελέγξει δικαιώματα (π.χ. αν ο χρήστης μπορεί να κάνει insert/update/delete σε ένα πίνακα).&lt;br&gt;Η αρχική κλάση διαχειρίζεται αποθήκευση πολλών πραγμάτων ταυτόχρονα (π.χ. προσθήκη μιας εγγραφής, χρήση του auto increment για τις child εγγραφές, διαγραφή από άλλο πίνακα). Η σχέση μεταξύ των πινάκων του dataset ορίζεται από ένα object oriented query, το οποίο περιλαμβάνει τους πίνακες που θα αποθηκευτούν, τις σχέσεις μεταξύ τους, κριτήρια (όπως αυτά του nhibernate) στην περίπτωση ανάγνωσης εγγραφών.&lt;br&gt;Ένα άλλο layer στο όλο σύστημα αναλαμβάνει να καλέσει υλοποιήσεις abstract κλάσεων (μια για κάθε πίνακα) οι οποίες περιλαμβάνουν κώδικα τύπου BeforeInsert, AfterInsert, BeforeUpdate, AfterUpdate κλπ, οι οποίες είναι προεραιτικές και μπορεί να περιέχουν business ελέγχους ή ενέργειες.&lt;br&gt;Ένα άλλο layer αναλαμβάνει την καταγραφή της δραστηριότητας (loging).&lt;br&gt;Ο αδύναμος κρίκος είναι το dataset. Θα ήθελα να το αντικαταστήσω με μια δική μου υλοποίηση typed dataset, χρησιμοποιώντας κάποιο code generator. Ουσιαστικά καλύτερα αντικείμενα που θα έχουν από κάτω όμως ένα dataset με όλα τα πλεονεκτήματά του (getchanges, original values κ.α.)&lt;br&gt;Στα υπέρ είναι η ταυτόχρονη αποθήκευση σε πολλούς πίνακες, σε ένα transaction πράγμα χρήσιμο σε client/server εφαρμογές, μια που μειώνει τα roundtrips στο δίκτυο.&lt;br&gt;Επειδή δουλεύω με client/server το caching γίνεται σε άλλα επίπεδα. Ο manager αυτός δουλεύει πάντα με καθαρά δεδομένα.&lt;br&gt;Ορίστε ένα παράδειγμα (ψευδοκώδικας):&lt;br&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; myQuery &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;As&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;New&lt;/span&gt; Query(MyTable)&lt;br /&gt;myQuery.AddJoin(MyChildTable, MyChildTable.fkMyTable)    &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' define child object and related column to the parent table&lt;/span&gt;&lt;br /&gt;myQuery.AddJoin(MyChildTable2, MyChildTable2.fkMyTable)&lt;br /&gt;myQuery.Criteria &lt;span style="color: Red;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;=&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; Criterio(myfield, IsGreaterThan, 54)&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' get data&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; dataManager &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; datamanager&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; data &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; dataset=datamanager.getdata(myquery)&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' use data, make changes, bind to UI, send to client etc.&lt;/span&gt;&lt;br /&gt;data.myChildTable(0).myField=5&lt;br /&gt;&lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' update&lt;/span&gt;&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;Dim&lt;/span&gt; dataManager2 &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;as&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;new&lt;/span&gt; datamanager &lt;span style="color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;' the same of different manager can be used (not recommended to keep reference to this object)&lt;/span&gt;&lt;br /&gt;dataManager2.Update(myQuery, data)&lt;/span&gt;&lt;br&gt;&lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22038.aspx</link><pubDate>Tue, 12 Dec 2006 03:59:25 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22038</guid><dc:creator>Panagiotis Kefalidis</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22038.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22038</wfw:commentRss><description>Εγώ πάλι ακολουθώ κάτι στην μέση θα έλεγα.&lt;br&gt;Έχω χωρίσει το DatabaseEngine απο την υπόλοιπη εφαρμογή.Το κάθε αντικείμενο, έχει δικές του methods (Save,Insert Κλπ) μέσα στις οποίες κάνει επεξεργασία σύμφωνα με το bussiness logic και αντίστοιχα καλεί method απο το DatabaseEngine ώστε να σώσει δεδομένα.Όταν θέλει να διαβάσει δεδομένα και να γεμίσει, το κάνει με τον ίδιο τρόπο. Καλεί οτιδήποτε χρειάζεται απο την βάση και αντίστοιχα κάνει το fetch/assign μέσα στον εαυτό του.Εάν προστεθεί κάποιο νέο πεδίο, έχω μόνο να το προσθέσω στο σημείο όπου γίνεται το fetch/assign και πουθενά αλλού. Έτσι δεν φτιάχνω κάποιο dynamic τρόπο, γιατί πιστεύω οτι δεν μου χρειάζεται.Έτσι κι αλλοιώς απο το να ζητήσω απο κάποιον generator να μου κάνει πάλι generate τον κώδικα, συμπληρώνω τις γραμμές απο μόνος μου.Όταν το αντικείμενο καλεί την method για να γεμίσει τον εαυτό του σαν carrier χρησιμοποιώ ένα dummy dataset reference το οποίο γεμίζει απο κάποιον adapter (ο οποίος γίνεται dynamic generate) σύμφωνα με τις παραμέτρους που του πέρασα.&lt;br&gt;&lt;br&gt;Την εξακρίβωση των δικαιωμάτων την κάνω πριν καλέσω την method.Έτσι μπορώ να πετύχω να ΜΗΝ εμφανίσω καθόλου κάποια κουμπιά/functions στον χρήστη ο οποίος δεν έχει δικαίωμα να τα δει (χωρίς να χρειάζεται να κάνω διπλούς ελέγχους) απο το να χρειάζεται να φορτώσω το Object, να καλέσω το method και μετά να διαπιστώσω ότι ο χρήστης δεν έχει πρόσβαση σε αυτό και να εμφανίσω μήνυμα λάθους.Για τα δικαιώματα κλπ, χρησιμοποιώ το Security Namespace και κάνω extend διάφορα classes τα οποία χρειάζομαι για να τα φέρω στα μέτρα μου.&lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22037.aspx</link><pubDate>Tue, 12 Dec 2006 03:23:05 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22037</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22037.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22037</wfw:commentRss><description>Μερικές ερωτήσεις επάνω σε αυτό:&lt;br /&gt;
&lt;br /&gt;
Ο manager σου αναλαμβάνει να διαχειριστει και τυχόν collections του object που διαχειρίζεται; &lt;br /&gt;
&lt;br /&gt;
Επίσης, ο manager είναι ένας, πολλοί, shared ή instance; &lt;br /&gt;
&lt;br /&gt;
Πώς δημιουργείς με αυτή την προσέγγιση ένα νέο, άδειο object;&lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22036.aspx</link><pubDate>Tue, 12 Dec 2006 03:16:19 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22036</guid><dc:creator>infoCENTER</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22036.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22036</wfw:commentRss><description>Πιστεύω μου είναι πως ένα object δεν θα πρέπει να έχει ιδέα τι γίνεται έξω από αυτό. Οπότε όπως καταλαβαίνεις δεν ακολουθώ στην σχεδίασή μου το εξής :&lt;br /&gt;
&lt;br /&gt;
myCustomer.Save&lt;br /&gt;
&lt;br /&gt;
Αλλα :&lt;br /&gt;
&lt;br /&gt;
myDBManager.Save(Customer)&lt;br /&gt;
&lt;br /&gt;
Τώρα εδώ τίθεται το εξής ερώτημα. Ποιος θα γνωρίζει το SQL Statement με το οποίο θα αποθηκεύεται το myCustomer. Όπως ανέφερα ένα object δεν θα πρέπει να έχει ιδέα σε ποιο περιβάλλον τρέχει και λέγοντας περιβάλλον δεν εννοώ windows ή κάτι άλλο αλλά την εφαρμογή μας και τι κάνει αυτή. Ένα object όμως πάντα θα γνωρίζει πως θα σώζεται, πως θα εκτυπώνεται, είναι υπεύθυνο αυτό να δώσει τις σωστές οδηγίες στο περιβάλλον μέσα στο οποίο τρέχει για να σωθεί π.χ στην βάση ή να εκτυπωθεί. Δεν θα αναλάβει όμως αυτό την διαδικασία για να σωθεί κάπου ή να εκτυπωθεί. &lt;br /&gt;
&lt;br /&gt;
Η συγκεκριμένη προσέγγιση έχει πολλά πλεονεκτήματα που ίσως στην αρχή να μην φαίνονται. Έχουμε φτιάξει μία εφαρμογή και κάποια στιγμή ο πελάτης μας θέλει στν εφαρμογή να ενσωματώσει δικαιώματα χρηστών. Αυτό που έχουμε να κάνουμε είναι να πάμε στους Managers και να προσθέσουμε μόνο εκεί των σχετικό κώδικά. Τα objects μας δεν έχουν ιδέα ότι μέσα στο περιβάλλον στο οποίο τρέχουν υπάρχει αυτή η νέα απαίτηση... &lt;br /&gt;
&lt;br /&gt;
Επόμενη απαίτηση του πελάτη είναι να υπάρχει ένας τρόπος παρακολούθησης το τι κάνει ο κάθε χρήστης στην εφαρμογή. Πάω πάλι στους Managers και προσθέτω εκεί των σχετικό κώδικα που ίσως να δημιουργεί κάποια logging αρχεία ή να ενημερώνει το LogView των Windows. Ή σου λέει ξέρεις κάτι μέχρι τώρα η επαφή με τους πελάτους ήταν να τους εκτυπώνω την κατάστασηή τους και να τους την στέλνω. Θα ήθελα σε παρακαλώ να μου προσθέσεις την δυνατότητα να μπορώ να του στέλνω την καρτέλα του και με email. Αυτό που θα είχες να κάνεις είναι να πας στον ExportΜanager και να έβαζες εκεί αυτό που πρέπει να βάλεις. &lt;br /&gt;
&lt;br /&gt;
Οπότε όπως καταλαβαίνεται παίζω πολύ με interfaces.&lt;br /&gt;
&lt;br /&gt;
Πιστέυω ότι τα παραπάνω, εκτός το τελευταίο, είναι ας πούμε κάποιες από τις μεγάλες αλλαγές που θα χαρακτηρίζαμε σε μία ήδη εγκατεστημένη εφαρμογή που θα έπερνε χρόνο αν ακολουθούσαμε κάποια άλλη σχεδίαση.&lt;br /&gt;
&lt;br /&gt;
Τουλάχιστον σε αυτό το συμπέρασμα κατέληξα εγώ και με αυτόν τον τρόπο δουλεύω. &lt;br /&gt;
&lt;br /&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22028.aspx</link><pubDate>Tue, 12 Dec 2006 01:23:45 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22028</guid><dc:creator>Nassos.NET</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22028.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22028</wfw:commentRss><description>οχι φιλε, σε καμία δεν το περνω προσωπικα! δεν με προσβαλες!!, απλα αν ηταν για το δικο μου, να τεκμηρίωνα!!!lool&lt;br /&gt;
&lt;br /&gt;
Προσωπικα θα το επαιρνα αν με ήξερες προσωπικά, και μου εριχνες κανα κιλο μπινελικια!!&lt;img src="/cs/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;br /&gt;
&lt;br /&gt;
Nassos</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22027.aspx</link><pubDate>Tue, 12 Dec 2006 01:16:47 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22027</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22027.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22027</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;Nassos.NET 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 valign="top" class="txt4"&gt;&lt;p&gt;papadi,&lt;/p&gt;
&lt;p&gt;για το&amp;nbsp;post μου πάει η απαντησή σου?&lt;/p&gt;
&lt;p&gt;Nassos.&lt;/p&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;Για όλα τα posts του thread, οπότε και για το δικό σου. Μην το παίρνεις προσωπικά!&lt;br&gt;</description></item><item><title>Απ: Επικοινωνία Middle-Tier - DAL και πιθανές προσεγγίσεις</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/22026.aspx</link><pubDate>Tue, 12 Dec 2006 01:00:13 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:22026</guid><dc:creator>Nassos.NET</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/22026.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=16&amp;PostID=22026</wfw:commentRss><description>&lt;P&gt;papadi,&lt;/P&gt;
&lt;P&gt;για το&amp;nbsp;post μου πάει η απαντησή σου?&lt;/P&gt;
&lt;P&gt;Nassos.&lt;/P&gt;</description></item></channel></rss>