tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
678
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Blackhawk50000
    Blackhawk50000 Blackhawk50000 ist offline Mitglied Brokat
    Registriert seit
    Oct 2007
    Ort
    Erding As, Bayern, Germany, Germany
    Beiträge
    328
    Hallo, ich habe ein Programm welches 3 Projekte enthalten soll.
    Die GUI, eine BusinessLogic und einen DataLayer.

    Im DataLayer soll der Webservice eingebunden sein mit dem es zu entwickeln gilt.

    nehmen wir an, ich habe in der GUI eine textbox und will dort einen Text aus einem Webserviceaufruf einschreiben.

    Wie mache ich das korrekt?

    Wir würden die einzelnen Aufrufe aussehen? Denn momentan bekomme ich den webserviceaufruf hin, und meine Daten landen auch ´wieder im Datalayer. Da das ganze aber Asyncron abläuft habe ich keine Ahnung wie ich die empfangenen Daten zur GUI bekomme um dort meine Textbox zu füllen.

    Es wäre wirklich lieb wenn ihr mir hier schnell helfen könntent.
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Dann mach deine Aufrufe von oben nach unten am besten durchgehend asynchron.
    Das hat den Vorteil, dass deine Anwendung immer bedienbar ist.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    Avatar von Blackhawk50000
    Blackhawk50000 Blackhawk50000 ist offline Mitglied Brokat
    Registriert seit
    Oct 2007
    Ort
    Erding As, Bayern, Germany, Germany
    Beiträge
    328
    genau so wollte ichs ja machen, die GUI ruft eine Methode in der BusinessLogik auf und die wiederum den Webserviceaufruf im DaytaLayer.

    nehmen wir mal an wir haben die GUI

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    Using ......
    Using.......
    Using Business.Logic
     
    NameSpace ......
    {
          Class .....
          {
                      testboxtext.Text = ************************
          }
    }


    dann habe ich noch meine Business Logic

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    Using ......
    Using.......
    Using Data.Layer
     
    NameSpace ......
    {
    public class BusinessLogic
        {
            public BusinessLogic()
            {
     
            }
     
            DataLayer.DataLayer _dataAccess = new DataLayer.DataLayer();
     
            public void LadeTestDaten(int id)
            {
                _dataAccess.GetPromoImage(id);
            }
        }
    }


    und ich habe meine DataLayer der bei mir MOMENTAN so aussieht

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    using CVPnet.DataLayer.WebService;
     
    namespace CVPnet.DataLayer
    {
        public class DataLayer
        {
            public DataLayer()
            {
                
            }
     
            CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();
     
            public void GetPromoImage(int ID)
            {
                _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
                _wrapper.LadeWerbeBildAsync(1);
            }
     
            private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
            {
                object test = e.Result;
            }
    }


    Wie würde das ganze aussehen damit meine Textbox die Daten erhällt... ODER meines wegen ne ImageBox oder was auch immer?
     

  4. #4
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Du musst bei allen Methoden einen Callback mit geben, über den dich der aufgerufene wieder reicht. (also eine Adresse zu einer Methode, die das Ergebnis entgegen nimmt.

    Infos dazu hier: http://openbook.galileocomputing.de/...arp_09_006.htm
    und hier http://support.microsoft.com/kb/315582/de
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  5. #5
    Avatar von Blackhawk50000
    Blackhawk50000 Blackhawk50000 ist offline Mitglied Brokat
    Registriert seit
    Oct 2007
    Ort
    Erding As, Bayern, Germany, Germany
    Beiträge
    328
    Nur noch mal so eine frage, wie würde das ganze denn aussehen, wenn ich im DataLayer ein Event erstelle und dass bei ankunft der Daten auslöse.
    Dann könnte ich von meiner BusinessLogic auf dieses Event hören und mir die Daten vom Datalayer holen, dann wären sie schon mal in der BusinessLogic, wie sehe das denn aus? könntest du diese 3 oder 4 Codezeilen bitte mal eben durchgeben?


    momentan sieht mein datalayer so aus

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    using CVPnet.DataLayer.WebService;
     
    namespace CVPnet.DataLayer
    {
        public class DataLayer
        {
            public DataLayer()
            {
                
            }
     
            CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();
     
            public event EventHandler<object> WerbeBildResult;
     
            public void GetPromoImage(int ID)
            {
                _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
                _wrapper.LadeWerbeBildAsync(1);
            }
     
            private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
            {
                WerbeBildResult(this, e.Result);
                object test = e.Result;
            }
    }
    Geändert von Blackhawk50000 (03.08.11 um 17:46 Uhr)
     

  6. #6
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hoi..

    Zitat Zitat von Blackhawk50000 Beitrag anzeigen
    Nur noch mal so eine frage, wie würde das ganze denn aussehen, wenn ich im DataLayer ein Event erstelle und dass bei ankunft der Daten auslöse.
    Dann könnte ich von meiner BusinessLogic auf dieses Event hören und mir die Daten vom Datalayer holen, dann wären sie schon mal in der BusinessLogic, wie sehe das denn aus? könntest du diese 3 oder 4 Codezeilen bitte mal eben durchgeben?

    Najo, wie solls dann großartig aussehen?

    Z.B. so: (oder was genau war noch unklar? )

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    
     
    public FakeDataEventArgs : EventArgs
    {
      // ..
      public FakeDataObject Image { get; set; }
    }
     
    public FakeErrorEventArgs : EventArgs
    {
      // ..
      public FakeErrorData Data { get; set; }
    }
     
    public FakeDataEventHandler : EventHandler<FakeDataEventArgs>
    {
    }
    public FakeErrorEventHandler : EventHandler<FakeErrorEventArgs>
    {
    }
     
    public class FakeDataProducer
    {
        protected FakeSoapClient client = new FakeSoapClient();
        
        public event FakeErrorEventHandler Error;
        public event FakeDataEventHandler DataAvailable;
        
        protected void OnError(FakeErrorData data)
        {
            var handler = Error;
            var args = new FakeErrorEventArgs(data);
            
            if (handler != null)
                handler(this, args);
        }
        
        protected void OnDataAvailable(FakeDataObject obj)
        {
            var handler = DataAvailable;
            var args = new FakeDataEventArgs(obj)
            
            if (handler != null)
                handler(this, args);
        }
        
        public FakeDataProducer()
        {
            client.LoadCompleted += LoadCompletedHandler;
        }
        
        public void GetDataAsync(..)
        {
            client.LoadAsync(..);
        }
        
        protected void LoadCompletedHandler(object sender, LoadCompletedEventArgs ea)
        {
            if (ea.Error != null)
                OnDataAvailable( .. );
            else
                OnError( .. );
        }
    }
     
     
    public class FakeDataConsumer
    {
        private FakeDataProducer producer;
        
        public FakeDataConsumer()
        {
            this.producer = = new FakeDataProducer();
            this.producer.Error += ProducerError;
            this.producer.DataAvailable += ProducerDataAvailable;
            
        }
        
        public void RequestData()
        {
            this.producer.GetDataAsync();
        }
        
        private void ProducerError(object sender, FakeErrorEventArgs ea)
        {
            // MessageBox.Show("oh noes");
        }
        
        private void ProducerDataAvailable(object sender, FakeDataEventArgs ea)
        {
            // MessageBox.Show("oh yes");
        }
    }


    lg,..
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  7. #7
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Würde auch gehen, hat aber nichts mit asynchronen Methodenaufrufen zu tun. Der Client hat vor allem ein Problem, wenn er dein Event nicht abonniert.

    Bei der Übergabe einer Zielmethode kannst du sicher sein, dass diese auch aufgerufen wird
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  8. #8
    Avatar von Blackhawk50000
    Blackhawk50000 Blackhawk50000 ist offline Mitglied Brokat
    Registriert seit
    Oct 2007
    Ort
    Erding As, Bayern, Germany, Germany
    Beiträge
    328
    wie kann es denn passieren, dass der client mein event nicht abonniert? Wenn ich dem das so sage, dann wird der das doch auch so machen, oder etwa nicht.

    Die sache mit den Events habe ich hinbekommen. Aber für die Sache mit dem Callback (was ich nun so lange verstehe, fehlen mir irgendwie die Basics was das angeht.

    Ich verstehe, dass ich in meiner BusinessLogic einen delegate deklarieren muss und dass ich den anschließend instanziieren muss und ihm gleichzeitig den namen meiner aufzugufenden Methode übergeben muss.

    Was mir aber leider noch nicht in den kopf will (und da fehlt mir auch leider ein wenig die Zeit) ist, wie ich das mache, wenn meine aufzurufende Methode im DataLayer ja ein Event auslösßt wenn die Daten angekommen sind, und das Event bzw. der Handler dann das Result des Webaufrufes hat. Siehe Post Nr. 3 und 5.

    Ich würds wirklich gerne so machen, wie es sich für Asyncone Methodenaufrufe gehört, aber ich blicks nicht....

    mit dem was ich verstanden habe sehen meine beiden klassen nun so aus:

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
     
     
        public class BusinessLogic
        {
            public BusinessLogic()
            {
     
            }
     
            public delegate void Testdel(int id);
            private Testdel del;
     
     
            DataLayer.DataLayer _dataAccess = new DataLayer.DataLayer();
     
            public void LadeTestDaten(int id)
            {
     
                del = new Testdel(_dataAccess.GetPromoImage);
                AsyncCallback callback = new AsyncCallback(testmethod);
     
                del.BeginInvoke(1, callback, null);
     
               (_dataAccess_WerbeBildResult);            
            }
     
            object _dataAccess_WerbeBildResult(object sender, LadeWerbeBildCompletedEventArgs args)
            {
                return args.Result;
            }
     
            private void testmethod(IAsyncResult ar)
            {
                object test = ar;
            }
        }


    und der DataLayer

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
     
        public class DataLayer
        {
            public DataLayer()
            {
                
            }
     
            CVPiServiceSoapClient _wrapper = new CVPiServiceSoapClient();    
     
            public delegate object WerbeBildResultEvent(object sender, LadeWerbeBildCompletedEventArgs args);
            public event WerbeBildResultEvent WerbeBildResult;
     
            public void GetPromoImage(int ID)
            {
     
     
     
     
                _wrapper.LadeWerbeBildCompleted += new EventHandler<LadeWerbeBildCompletedEventArgs>(GetPromoImageTeil02);
                _wrapper.LadeWerbeBildAsync(1);
            }
     
            private void GetPromoImageTeil02 (object sender, LadeWerbeBildCompletedEventArgs e)
            {
                WerbeBildResult(this, e);
                object test = e.Result;
            }
     
            public void GetZahler()
            {
                _wrapper.RS_GetZahlerdatenCompleted += new EventHandler<RS_GetZahlerdatenCompletedEventArgs>(GetZahlerTeil02);
                _wrapper.RS_GetZahlerdatenAsync(Application.Current.Host.InitParams["SessionId"].ToString());
            }
     
            private void GetZahlerTeil02(object sender, RS_GetZahlerdatenCompletedEventArgs e)
            {
                object test = e.Result;
            }
        }


    wie bekomme ich nun die daten zurück zur BusinessLogic?
    Geändert von Blackhawk50000 (04.08.11 um 11:13 Uhr)
     

  9. #9
    Avatar von Alexander Schuc
    Alexander Schuc Alexander Schuc ist offline admin | crazy-weasel
    tutorials.de Administrator
    Registriert seit
    Aug 2001
    Ort
    Österreich, Stmk, Graz
    Beiträge
    2.783
    Hi..

    wenn du dir mit den Events leichter tust, bleib ruhig dabei. Nennt sich dann halt Event-based Asynchronous Pattern.

    Andere Async-Pattern sind in der MSDN natürlich auch beschrieben.. Asynchronous Programming Design Patterns

    lg
     
    With the first link the chain is forged. The first speech censored, the first thought forbidden, the first freedom denied, chains us all irrevocably.
    Aaron Satie

    Legends... are the spice of the universe, Mr. Data, because they have a way of sometimes coming true.
    Captain Jean-Luc Picard, Stardate ~41294.5

    Tutorials.de chattet. Hier gibts auch .net Support ^^
    Klickt auf chattet und nutzt den Webchat, oder verbindet euch zu irc.tutorials.de - Channel #Tutorials.de

    (moo)blog furred.net // SiteInfo für WP7 // Pastebin für WP7 // BlogEngine.net Extensions

  10. #10
    Avatar von Blackhawk50000
    Blackhawk50000 Blackhawk50000 ist offline Mitglied Brokat
    Registriert seit
    Oct 2007
    Ort
    Erding As, Bayern, Germany, Germany
    Beiträge
    328
    okay super =) danke schön =)
     

Ähnliche Themen

  1. C# Webservice unter PHP aufrufen
    Von saschagoetz im Forum PHP
    Antworten: 0
    Letzter Beitrag: 10.01.08, 09:12
  2. Bestehenden Webservice aufrufen
    Von Ronn im Forum PHP
    Antworten: 7
    Letzter Beitrag: 02.08.07, 14:14
  3. .NET Webservice in PHP aufrufen
    Von c_csiebert im Forum PHP
    Antworten: 1
    Letzter Beitrag: 16.06.07, 18:57
  4. Webservice aus dem WTK 2.3 aufrufen
    Von kroesi im Forum Java
    Antworten: 5
    Letzter Beitrag: 07.11.06, 18:44
  5. Webservice mit C++ aufrufen
    Von BugsBastard im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 04.03.04, 10:27