2008-09-26 12 views
14

पर संदेश भेजना मेरे पास एक डब्ल्यूसीएफ सेवा होस्ट करने वाला एक कंसोल एप्लिकेशन है। मैं डब्ल्यूसीएफ सेवा में एक विधि से एक घटना को आग लगाने में सक्षम होना चाहता हूं और डब्ल्यूसीएफ सेवा की होस्टिंग प्रक्रिया में घटना को संभालना चाहता हूं। क्या यह संभव है? यह मैं कैसे करूंगा? क्या मैं ServiceHost से एक कस्टम क्लास प्राप्त कर सकता हूं?डब्ल्यूसीएफ होस्ट प्रक्रिया

उत्तर

14

आपको ServiceHost से प्राप्त करने की आवश्यकता नहीं है। आपकी समस्या के अन्य दृष्टिकोण हैं।

आप ServiceHost पर किसी प्रकार की बजाय सेवा कक्षा का एक उदाहरण पास कर सकते हैं। इस प्रकार, आप ServiceHost शुरू करने से पहले उदाहरण बना सकते हैं, और अपने स्वयं के ईवेंट हैंडलर को किसी भी घटना के लिए जोड़ सकते हैं। के बारे में

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

कुछ चेतावनियां जब इस दृष्टिकोण का उपयोग कर, http://msdn.microsoft.com/en-us/library/ms585487.aspx

में वर्णित के रूप या फिर आप एक प्रसिद्ध सिंगलटन वर्ग हो सकता है, कि आपकी सेवा उदाहरणों पता:

यहां कुछ नमूना कोड है और जब घटनाएं होती हैं तो स्पष्ट रूप से इसकी विधियों को कॉल करें।

+0

अच्छा! दोनों दृष्टिकोण मुझे सही समझ में आता है; मुझे मूर्ख लगता है मैंने उन में से किसी एक के बारे में नहीं सोचा था। मुझे लगता है कि मुझे डब्ल्यूसीएफ की जटिलता से खुद को अंधा कर दिया गया है, क्योंकि यह मेरे लिए नया है। – 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; 
    } 
} 

आप 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; 
     ... 
     ... 
    } 
संबंधित मुद्दे