2008-09-26 11 views
14

Mam aplikację konsoli obsługującą usługę WCF. Chciałbym móc wystrzelić zdarzenie z metody w usłudze WCF i obsługiwać zdarzenie w procesie hostowania usługi WCF. czy to możliwe? Jak to zrobić? Czy mogę wyprowadzić niestandardową klasę z ServiceHost?Wysyłanie komunikatów do procesora hosta WCF

Odpowiedz

14

Nie musisz dziedziczyć po ServiceHost. Istnieją inne podejścia do twojego problemu.

Można przekazać wystąpienie klasy usług zamiast typu do ServiceHost. W ten sposób można utworzyć instancję przed uruchomieniem ServiceHost i dodać własne procedury obsługi zdarzeń do wszystkich wyda- wanych zdarzeń.

Oto niektóre przykładowy kod:

MyService svc = new MyService(); 
svc.SomeEvent += new MyEventDelegate(this.OnSomeEvent); 
ServiceHost host = new ServiceHost(svc); 
host.Open(); 

Istnieją pewne zastrzeżenia przy stosowaniu tej metody, jak opisano w http://msdn.microsoft.com/en-us/library/ms585487.aspx

Albo można mieć znaną singleton klasy, że instancje usług wiedzieć i jawnie wywoływać jego metody, gdy zdarzają się zdarzenia.

+0

Nice! Oba podejścia mają dla mnie sens; Czuję się głupio, nie myślałem o żadnym z nich. Chyba właśnie oślepiło mnie złożoność samego WCF, ponieważ jest to dla mnie nowe. – dotnetengineer

0
using ... 
using ... 

namespace MyWCFNamespace 
{ 
    class Program { 

     static void Main(string[] args){ 
      //instantiate the event receiver 
      Consumer c = new Consumer(); 

      // instantiate the event source 
      WCFService svc = new WCFService(); 
      svc.WCFEvent += new SomeEventHandler(c.ProcessTheRaisedEvent); 

      using(ServiceHost host = new ServiceHost(svc)) 
      { 
       host.Open(); 
       Console.Readline(); 
      } 
     } 
    } 


    public class Consumer() 
    { 
     public void ProcessTheRaisedEvent(object sender, MyEventArgs e) 
     { 
      Console.WriteLine(e.From.toString() + "\t" + e.To.ToString()); 
     } 
    } 
} 


namespace MyWCFNamespace 
{ 
    public delegate void SomeEventHandler(object sender,MyEventArgs e) 

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
    public class WCFService : IWCFService 
    { 
     public event SomeEventHandler WCFEvent; 

     public void someMethod(Message message) 
     { 
      MyEventArgs e = new MyEventArgs(message); 
      OnWCFEvent(e); 
     } 

     public void OnWCFEvent(MyEventArgs e) 
     { 
      SomeEventHandler handler = WCFEvent; 
      if(handler!=null) 
      { 
       handler(this,e); 
      } 
     } 

    // to do 
    // Implement WCFInterface methods here 
    } 


    public class MyEventArgs:EventArgs 
    { 
     private Message _message; 
     public MyEventArgs(Message message) 
     { 
      this._message=message; 
     } 
    } 
    public class Message 
    { 
     string _from; 
     string _to; 
     public string From {get{return _from;} set {_from=value;}} 
     public string To {get{return _to;} set {_to=value;}} 
     public Message(){} 
     public Message(string from,string to) 
     this._from=from; 
     this._to=to; 
    } 
} 

Możesz zdefiniować swoją usługę WCF pod numerem InstanceContextMode = InstanceContextMode.Single.

TestService svc = new TestService(); 
svc.SomeEvent += new MyEventHandler(receivingObject.OnSomeEvent); 
ServiceHost host = new ServiceHost(svc); 
host.Open(); 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] // so that a single service instance is created 
    public class TestService : ITestService 
    { 
     public event MyEventHandler SomeEvent; 
     ... 
     ... 
    } 
Powiązane problemy