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

 

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

Χρήση Singleton class σε πολλές κλάσεις

Îåêßíçóå áðü ôï ìÝëïò pap. Τελευταία δημοσίευση από το μέλος pap στις 17-02-2009, 13:40. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-02-2009, 14:53 48479

    Χρήση Singleton class σε πολλές κλάσεις

    Γεια σας.

    Έχω την παρακάτω υλοποίηση Singleton:

    using System;
    using System.Data.SqlClient;

    namespace SqlServerLib
    {
      public sealed class Database
      {
        private static SqlConnection _connection;
        private static string _connectionString;

        static Database()
        {
          _connection = new SqlConnection(_connectionString);
        }

        // nested class
        class DatabaseCreator
        {
          static DatabaseCreator() {}

          internal static readonly Database instance = new Database();
        }

        public static Database Instance
        {
          get { return DatabaseCreator.instance; }
        }


        public (static) SqlConnection Connection
        {
          get { return _connection; }
       }

        public static string ConnectionString
        {
          set { _connectionString = value; }
        }
      }
    }

    *To (static) το έχω με παρενθέσεις στο property Connection - χάριν του παραδείγματος, υποδηλώνοντας ότι είναι μη απαραίτητο στην περίπτωση μου. Παρακάτω εξηγώ...

    Ποιος είναι ο καλύτερος τρόπος να έχω access στο property Connection (σε περισσότερες της μίας κλάσης), ώστε να έχω το ίδιο Connection σε όλη την εφαρμογή; Πρέπει να φτιάχνω κάθε φορά instance του Database class με τη μορφή

    Database db = Database.Instance;
    sqlCommand = new SqlCommand(query, db.Connection);

    χωρίς να είναι static το Connection; Ή να μη φτιάχνω καθόλου instance και να έχω access με τη μορφή

    sqlCommand = Database.Connection; 

    Να σημειώσω ότι το property ConnectionString το χρησιμοποιώ μία φορά κατά την εκκίνηση της εφαρμογής. Οπότε με αυτό δεν έχω πρόβλημα.

  •  16-02-2009, 19:01 48481 σε απάντηση της 48479

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Αν γράψεις singleton pattern in c# στο google θα βρεις πολλές υλοποιήσεις. Στο συγκεκριμένο ερώτημά σου δυστυχώς η απάντηση δεν είναι αυτή που περιμένεις.
    Στο ερώτημα "Ποιος είναι ο καλύτερος τρόπος να έχω access στο property Connection (σε περισσότερες της μίας κλάσης), ώστε να έχω το ίδιο Connection σε όλη την εφαρμογή" η απάντηση είναι "ΔΕΝ πρέπει να έχεις το ίδιο connection σε όλη την εφαρμογή". 9 στις 10 περιπτώσεις (δεν λέω 10 στις 10 για να μην φανώ υπερβολικός) το connection πρέπει να χρησιμοποιείται έτσι:
    using (SqlConnection connection = new SqlConnection(....))
    {
         // put your code here
    }
    Αν είσαι σχετικά αρχάριος σε συμβουλεύω να μείνεις σε αυτή τη λογική. Αν αργότερα αισθάνεσαι πιο άνετος με το ADO.NET μπορείς λίγο να ξεφύγεις και να γράψεις λίγο πιο πολύπλοκο κώδικα. Σχεδόν ποτέ όμως (το σχεδόν το λέω πάλι για φιλοσοφικούς λόγους) με σκοπό να κρατήσεις το connection ανοιχτό.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  16-02-2009, 19:05 48482 σε απάντηση της 48481

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Συμφωνώ. Ολο το ado.net έχει βασιστεί επάνω στο disconnected model (ανοίγω connection όταν το θέλω / το κλείνω αμέσως μόλις τελειώσω / δεν κάνω abuse resources).

    Εξάλλου, ο SQL Server (μια και χρησιμοποιείς sqlconnection) φροντίζει να κάνει ένα pool με τα connections που ανοίγουν ωστε να μην υπάρχει το overhead της δημιουργίας νέου connection. Με άλλα λόγια, εσύ ναι μεν το κλείνεις αλλά αφήνεις τον SQL Server να πάρει την απόφαση του πότε αυτό θα κλείσει πραγματικά. Και έτσι θα πρέπει να είναι.

    (Τα λέω καλά Δημήτρη ή θα με βρίσεις; )


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  16-02-2009, 19:10 48483 σε απάντηση της 48482

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    cap:
    Τα λέω καλά Δημήτρη ή θα με βρίσεις;

    Ζαμέ!!! Απλά νομίζω ότι το pooling το κάνει το ADO.NET και όχι ο sql server.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  17-02-2009, 09:42 48490 σε απάντηση της 48483

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Μάλιστα κατάλαβα. Βρίσκομαι σε φάση εκμάθησης/βελτίωσης του κώδικα, οπότε ως προς αυτό είμαι σε πρώϊμο στάδιο ακόμα. Αν δω τον κώδικά σας δηλαδή, θα πάθω σίγουρα πολιτισμικό σοκStick out tongue.

    Πέρα απ' αυτό μου έχει μείνει η γενική απορία, δηλαδή ποιος είναι ο πιο σωστός τρόπος να έχουμε access στο instance μιας κλάσης Singleton από διάφορες κλάσεις. Δημιουργούμε διαφορετικά instance σε κάθε κλάση; Όσα παραδείγματα έχω βρει στο internet, δείχνουν μόνο μια κλάση που έχει access σ' αυτό.

  •  17-02-2009, 11:53 48493 σε απάντηση της 48483

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Dimitris Papadimitriou:

    Ζαμέ!!! Απλά νομίζω ότι το pooling το κάνει το ADO.NET και όχι ο sql server.

    Ναι, ρίχνοντας μια ματιά διαπίστωσα οτι έχεις δίκιο.

     


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  17-02-2009, 12:05 48494 σε απάντηση της 48490

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    pap:

    Πέρα απ' αυτό μου έχει μείνει η γενική απορία, δηλαδή ποιος είναι ο πιο σωστός τρόπος να έχουμε access στο instance μιας κλάσης Singleton από διάφορες κλάσεις. Δημιουργούμε διαφορετικά instance σε κάθε κλάση; Όσα παραδείγματα έχω βρει στο internet, δείχνουν μόνο μια κλάση που έχει access σ' αυτό.

    Ειναι λίγο μπερδεμένη η ερώτησή σου, όσον αφορά το context στο οποίο γίνεται! :) Βασικά, η Singleton class έχει ως σκοπό να "σερβίρει" ένα και μόνο ένα instance της σε όποιον την καλεί. Αυτό το πετυχαίνει διατηρώντας μια static method (η οποία ως γνωστόν δεν είναι προσβάσιμη από κάποιο instance αλλά από την ίδια την κλάση) η οποία φροντίζει να παρέχει πάντα ως return value το ίδιο instance. Αρα:

    - Δημιουργούμε διαφορετικά instance σε κάθε κλάση: Αν εννοείς εσωτερικά, όχι. Αλλιώς δεν θα ήταν singleton αλλά multi-ton (ή κάπως έτσι :) )

    - "Δείχνουν μόνο μια κλάση που έχει access σε αυτό": Πιστεύω οτι εννοείς την static method της singleton κλάσης.

    Δεν μπορώ να κατανοήσω πλήρως από τα ως τώρα γραφόμενα πώς το έχεις στο μυαλό σου και πού ακριβώς σου δημιουργήθηκε η απορία, αλλά εδώ είμαστε αν χρειάζεσαι παραπάνω βοήθεια να το ξεκαθαρίσεις!

     


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

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  17-02-2009, 12:10 48495 σε απάντηση της 48490

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Χμμμ... Ή κάτι δεν έχεις καταλάβει ως προς το singleton ή δεν εκφράζεις σωστά την ερώτησή σου ή εγώ δεν καταλαβαίνω τι ρωτάς.

    Μια κλάση singleton χαρακτηρίζεται από το ότι όλοι όσοι την χρησιμοποιούν, χρησιμοποιούν ένα και μόνο ένα, ίδιο, instance. Ο πρώτος που τη χρησιμοποιεί δημιουργεί το instance και όλοι οι υπόλοιποι το βρίσκουν έτοιμο. Για παράδειγμα για τη κλάση Console. Δεν λές ποτέ

    Console con = New Console();
    con.WriteLine("test");

    Λες κατευθείαν

    Console.WriteLine("test");

    γιατί η κονσόλα είναι μόνο μία οπότε δεν έχει νόημα να έχεις instances. Άρα, υλοποιώντας μια κλάση singleton, έτσι κι αλλιώς έχεις καλύψει το ζητούμενο που είναι να έχουν όλοι access στο ίδιο instance της κλάσης. Μήπως το ερώτημα αφορά στο ΠΩΣ να φτιάξεις μια singleton κλάση;

     


    Vir prudens non contra ventum mingit
  •  17-02-2009, 13:40 48496 σε απάντηση της 48495

    Απ: Χρήση Singleton class σε πολλές κλάσεις

    Κατάλαβα πως να φτιάξω την κλάση, είμαι ok με αυτό το θέμα. Να ναι καλά το internetStick out tongue Αυτό που δεν καταλάβαινα ήταν πως τη χρησιμοποιούμε, αλλά τώρα τα ξεκαθάρισα με τη βοήθειά σας.

    Ευχαριστώ πολύ παιδιάYes.

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