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

 

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

Interface programming

Îåêßíçóå áðü ôï ìÝëïò axaros. Τελευταία δημοσίευση από το μέλος axaros στις 25-10-2005, 11:19. Υπάρχουν 64 απαντήσεις.
Σελίδα 1 από 5 (65 εγγραφές)   1 2 3 4 5 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  23-08-2005, 14:26 4545

    Interface programming

    Αγαπητοί φίλοι ,

    θέλω να μου πείτε τη γνώμη σας για το interface που θα δείτε παρκάτω καθώς και τα implementations του.
    Θέλω να φτιάξω ένα mid-tier που να υποστηρίζει ένα μεγάλο αριθμό datasources. Είμαι στο σωστό δρόμο;
    Για αρχή SQL Server (με serviced component implementation) + MSAccess

    Imports System.EnterpriseServices
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Data.OleDb

    Namespace SINPRepMid

       Public Interface IMid
          
    Inherits IDisposable
          Function GetData(ByVal ConString As String) As DataSet
       End Interface

       <Description("Mid Tier Interface Test component handling the various data selecting functions"), _
       Transaction(TransactionOption.NotSupported), _
       ObjectPooling(
    True, 1, 5), _
       JustInTimeActivation(
    True)> _

       Public Class SMid
          
    Inherits ServicedComponent 
          
    Implements IMid

          Public Function GetData(ByVal ConString As String) As DataSet Implements IMid.GetData
             Dim MyCon As SqlConnection
             
    Dim MyAdapter As SqlDataAdapter
             
    Dim MyData As DataSet

             Try
                   
    MyCon = New SqlConnection(ConString)
                   MyAdapter =
    New SqlDataAdapter("Select * From tblTest", MyCon)
                   MyData =
    New DataSet
                   MyAdapter.Fill(MyData, "Test")

                   If MyData.Tables(0).Rows.Count = 0 Then
                      
    Throw New SystemException("No SQL SERVER data found")
                   
    End If

                   Return MyData

             Finally

                If Not MyCon Is Nothing Then
                   
    With MyCon
                      .Close()
                      .Dispose()
                   
    End With
                
    End If

                If Not MyAdapter Is Nothing Then
                   MyAdapter.Dispose()
                
    End If

                If Not MyData Is Nothing Then
                   
    MyData.Dispose()
                
    End If

             End Try
          End Function
       
    End Class

       Public Class AMid
          
    Implements IMid
          Implements IDisposable
          Private disposed As Boolean

          Public Sub New()
             disposed =
    False
          End Sub

          Public Function GetData(ByVal ConString As String) As DataSet Implements IMid.GetData
             
    Dim MyCon As OleDbConnection
             Dim MyAdapter As OleDbDataAdapter
             Dim MyData As DataSet

             Try

                MyCon = New OleDbConnection(ConString)
                MyAdapter =
    New OleDbDataAdapter("Select * From tblTest", MyCon)
                MyData =
    New DataSet
                MyAdapter.Fill(MyData, "Test")
                If MyData.Tables(0).Rows.Count = 0 Then
                   
    Throw New SystemException("No MSAccess data found")
                End If

                Return MyData

             Finally

                If Not MyCon Is Nothing Then
                   
    With MyCon
                      .Close()
                      .Dispose()
                   
    End With
                
    End If

                If Not MyAdapter Is Nothing Then
                   MyAdapter.Dispose()
                
    End If

                If Not MyData Is Nothing Then
                   
    MyData.Dispose()
                
    End If

             End Try

          End Function

          Public Sub Dispose() Implements IDisposable.Dispose

             If Not disposed Then
                disposed = True
                GC.SuppressFinalize(Me)
             End If

          End Sub

          Protected Overrides Sub Finalize()
             Dispose()
          End Sub

       End Class

    End Namespace

     

    Τα καλώ από μία win εφαρμογή στα αντίστοιχα button clicks και γεμίζω ένα grid :

       Public Function GetData(ByVal MyOb As SinpMidTier.SINPRepMid.IMid, _
                                                 
    ByVal ConString As String) As DataSet

          Dim TempData As New DataSet

          Try
             
    With MyOb
                TempData = .GetData(ConString)
                .Dispose()
             
    End With

             Return TempData

          Finally

             If Not TempData Is Nothing Then
                
    TempData.Dispose()
             
    End If

          End Try

       End Function

       Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
          
    Dim MyOb As New SinpMidTier.SINPRepMid.AMid

          Try

             grdTest.DataSource = Nothing
             
    Application.DoEvents()


             
    With grdTest
                .DataSource = GetData(MyOb, "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                                                                       "Data Source=C:\" & _
                                                                       "Databases\Test.mdb;" )

             End With

             Catch ex As Exception
                MsgBox(ex.Message.ToString, _
                               MsgBoxStyle.Critical, _
                               "Error")

             End Try
       End Sub

       Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
          Dim MyOb As New SinpMidTier.SINPRepMid.SMid 
          
    Try
             
    grdTest.DataSource = Nothing
             
    Application.DoEvents()
             
    With grdTest
                .DataSource = GetData(MyOb, "Server=TESTSERVER;Network Library=DBMSSOCN;" & _
                                                                       "Initial Catalog=TESTDB;Integrated Security=SSPI;" & _
                                                                       "Min Pool Size=5;Max Pool Size=60;Connect Timeout=10;")
             
    End With

          Catch ex As Exception
             MsgBox(ex.Message.ToString, _
                            MsgBoxStyle.Critical, _
                            "Error")
          
    End Try

       End Sub

     


    Πάνος Αβραμίδης
  •  23-08-2005, 20:01 4568 σε απάντηση της 4545

    Απ: Interface programming

    Παναγιώτη καλή η υλοποίηση, αλλά θα έπρεπε να την δουλέψεις ακόμα λίγο...

    Καλό το πρώτο Interface. Μετά θα έπρεπε να φτιάξεις μια Abstract class: Η χρήση του Dataset/DataReader για το γέμισμα και την μεταφορά των δεμομένων, θα είναι κοινό για όλα τα class που θα φτιάξεις. Οπότε αυτό το κομάτι του κώδικα θα πρέπει να είναι μέσα στο Abstract class. Αντί για SqlConnection και OledbConnection θα πρέπει να χρησιμοποιήσεις ένα function που θα φορτώνει τον αντίστοιχο provider δυναμικά όπως:

                object newObject = null;
                if(type != null)
                {
                    newObject =  Activator.CreateInstance(type,new object[]{connectionString}); 
                }
               
                if(newObject == null)
                    throw new exception("Cannot create object!");;

                return newObject;

    Μετά θα κάνεις implement τα τελικά classes, που θα είναι specific για SQLServer, Access, κτλ...

     

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  24-08-2005, 10:07 4590 σε απάντηση της 4568

    Απ: Interface programming

    Γιώργο σε έχασα ...

    Θέλω να πω αφού έχω ένα generic call (

    Public Function GetData(ByVal MyOb As SinpMidTier.SINPRepMid.IMid, ByVal ConString As String) As DataSet)

    που δέχεται ένα generic object (interface parameter SinpMidTier.SINPRepMid.IMid) έτσι ώστε κάθε φορά
    στην προκειμένη σε αντίστοιχο button click να του στέλνω το object που με ενδιαφέρει:

    Private
    Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim MyOb As New SinpMidTier.SINPRepMid.AMid

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim MyOb As New SinpMidTier.SINPRepMid.SMid

    γιατί να φτιάξω το abstract class;


    Πάνος Αβραμίδης
  •  24-08-2005, 21:49 4625 σε απάντηση της 4590

    Απ: Interface programming

    Κατ' αρχήν, γιατί θέλεις interfaces; Surprise [:O]

    Εξηγούμαι:
    - Θέλεις να χρησιμοποιείς διάφορα (αλλά παρόμοια) classes για να κάνεις συγκεκριμένη δουλειά (έτσι μου φάνηκε...);. Σε αυτή την περίπτωση, ένα abstract class συνηθίζεται, εάν υπάρχει αρκετός ίδιος κώδικας στα τελικά classes. Επίσης, συνηθίζεται η υλοποίηση ενός Factory που επιστρέφει (με cast στο abstract class ή στο interface) το προς χρήση object.
    - Θέλεις να χρησιμοποιήσεις remoting και να αποφύγεις να έχεις το implementation του remote object στον client; Αυτός είναι, συνήθως, ο σωστός (αν και μπελαλίδικος) τρόπος.
    - Προσπαθείς να παρακάμψεις το single inheritance model του .Net;

    Άρης

     


    Aris
  •  25-08-2005, 01:35 4628 σε απάντηση της 4590

    Απ: Interface programming

     axaros wrote:
    Γιώργο σε έχασα ...

    Μάλλον δεν στο εξήγησα αρκετά. Ο Άρης το έθεσε πιο καλά από μένα. Ο κώδικας που έφτιαξες και στις τρεις κλάσεις είναι ο ίδιος. Θα μπορούσες να φτιάξεις μια abstract κλάση που να κάνει την δουλειά και για τα τρεις που έφτιαξες...

     

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  25-08-2005, 09:03 4632 σε απάντηση της 4625

    Απ: Interface programming

     Aris wrote:

    Κατ' αρχήν, γιατί θέλεις interfaces; Surprise [:O]

    Εξηγούμαι:
    - Θέλεις να χρησιμοποιείς διάφορα (αλλά παρόμοια) classes για να κάνεις συγκεκριμένη δουλειά (έτσι μου φάνηκε...);. Σε αυτή την περίπτωση, ένα abstract class συνηθίζεται, εάν υπάρχει αρκετός ίδιος κώδικας στα τελικά classes. Επίσης, συνηθίζεται η υλοποίηση ενός Factory που επιστρέφει (με cast στο abstract class ή στο interface) το προς χρήση object.

    Αυτό ακριβώς ...
    Σε σχέση με το κώδικα μου μπορείτε να μου δώσετε ένα παράδειγμα με  abstract class;

    Επίσης παραθέτω μία σχετική με το θέμα παράγραφο από το άρθρο :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnguinet/html/drguinet2_update.asp

    Interfaces vs. Abstract Base Classes

    One of the interesting arguments is whether you should use an interface or an abstract class to describe a set of methods and properties inherited classes must implement.

    Dr. GUI solves this using the "IS A" rule: If the essential type of the derived classes "IS A" specialization of the base type, then inherit from an abstract class. Use an interface if the interface is not related to the essential type of the actual objects, because interfaces express what an object "CAN DO," not what it essentially is.

    So, because a circle "IS A" generic drawable object, we derive the circle class from the generic drawable object abstract base class to express that relationship. But the circle also "CAN DO" cloning, so we implement the IClonable interface.

    There are other ways of looking at this as well—for instance, you might note that you can inherit partial implementation of an abstract class but that you can't inherit implementation of an interface, so you might prefer an interface if there's no common implementation to inherit, especially if the interface can be implemented by a wide variety of classes from many inheritance hierarchies (for example, ICloneable). On the other hand, you might prefer an abstract class for closely related classes that share their implementations and that you want to version at the same time.

    For more on this, check out the recommendations in the Visual Basic and Microsoft Visual C#™ product documentation. You might also want to read the entire section on programming with components.

    An important note: Be careful when you design your interfaces—once you've published them, you shouldn't change them, even to add a method. (If you add a method, every class that implements your interface will also have to implement that method—and they'll be broken until they do.) You can add methods to classes without breaking derived classes, however.

     


    Πάνος Αβραμίδης
  •  25-08-2005, 19:39 4649 σε απάντηση της 4632

    Απ: Interface programming

    Αν παραταύτα δουλέψω με Interface :

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim hdlSample As ObjectHandle
       Dim MyOb As MyMidTier.IMid

       hdlSample = Activator.CreateInstanceFrom("MyMidTier.dll", "MyMidTier.SMid")
       MyOb =
    CType(hdlSample.Unwrap, MyMidTier.IMid)

       Try
          
    grdTest.DataSource = Nothing
          
    With grdTest
             .DataSource = GetData(MyOb, "Server=PC-PAVRM;Network Library=DBMSSOCN;" & _
                                                                     "Initial Catalog=TEST;Integrated Security=SSPI;" & _
                                                                     "Min Pool Size=5;Max Pool Size=60;Connect Timeout=10;")
       
    End With

       MyOb.Dispose()

       Catch ex As Exception
             MsgBox(ex.Message.ToString, _
                             MsgBoxStyle.Critical, _
                            "Error")

       End Try


    End Sub

    Αντίστοιχα καλώ και το class που κάνει implement το datamanagement με MSAccess backend
    Πραγματικά θα ήθελα τα σχόλια σας ...


    Πάνος Αβραμίδης
  •  25-08-2005, 22:26 4654 σε απάντηση της 4545

    Interface programming

    (Βιαστικά)
    Εάν υπάρχει ΚΟΙΝΟΣ κώδικσς στις υλοποιήσεις του interface, τον βάζεις σε ένα abstract class (για να μην επεναλαμβάνετια - και να συντηρήται ευκολότερα)

    Άρης
    Aris
  •  26-08-2005, 12:01 4682 σε απάντηση της 4654

    Απ: Interface programming

    Άρη μπορείς όταν ευκαιρείς να μου δώσεις ένα παράδειγμα ;

    Επίσης

    Μάλλον δεν στο εξήγησα αρκετά. Ο Άρης το έθεσε πιο καλά από μένα. Ο κώδικας που έφτιαξες και στις τρεις κλάσεις είναι ο ίδιος. Θα μπορούσες να φτιάξεις μια abstract κλάση που να κάνει την δουλειά και για τα τρεις που έφτιαξες...

    Το class που κάνει implement το data management με SQL server back-end θέλω να είναι serviced component ενώ το αντίστοιχο με MS Access όχι.


    Πάνος Αβραμίδης
  •  29-08-2005, 09:51 4739 σε απάντηση της 4545

    Απ: Interface programming

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

    Κατ' αρχήν αυτή είναι η αρχική προσέγκισή σου σε UML:

    Βλέποντάς το αυτό ο gcapnias σου πρότεινε το εξής:

    Σε συνέχεια των παραπάνω ο aris ορθώς το έκανε πιο συγκεκριμένο ως ακολούθως:

    Και μια και φτάσαμε ως εδώ, είπα κι εγώ ν απω τη γνώμη μου:

     

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

    Ελπίζω να μπορείς να το ξεδιαλύνεις με τα παραπάνω διαγράμματα. Αν σε μπέρδεψα περισσότερο, εδώ είμαστε...

    Φιλικά
    rousso

    υ/γ: Τα διαγράμματα τα έφτιαξα λίγο βιαστικά και έχουν λαθάκια στα κείμενα. αλλά νομίζω ότι τελικά βγαίνει το νόημα ούτως ή άλλως. Παρακαλώ να με συγχωρέσετε για την βιασύνη...


    rousso
  •  29-08-2005, 10:06 4740 σε απάντηση της 4739

    Απ: Interface programming

    Πιο τεκμηριωμένη απάντηση δεν έχω ξαναδεί στο DNZ μέχρι τώρα !!!!
    Γιάννη σε ευχαριστώ θερμά !!!!!!!!


    Πάνος Αβραμίδης
  •  29-08-2005, 10:10 4741 σε απάντηση της 4740

    Απ: Interface programming

    Embarrassed [:$] you are welcome... Smile [:)]

    rousso


    rousso
  •  29-08-2005, 10:26 4742 σε απάντηση της 4741

    Απ: Interface programming

    Sparx χρησιμοποιείς rousso;
    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  29-08-2005, 10:29 4743 σε απάντηση της 4742

    Απ: Interface programming

    ναι sparx
    rousso
  •  29-08-2005, 10:39 4744 σε απάντηση της 4743

    Απ: Interface programming

    Τώρα αν ζητήσω forum για UML design θα με πείτε γκρινιάρη ;


    Πάνος Αβραμίδης
Σελίδα 1 από 5 (65 εγγραφές)   1 2 3 4 5 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems