2009-12-15 7 views
6

मैं सिर्फ एमईएफ में जा रहा हूं और मुझे एक ऐसी समस्या आई है जिसे मैं हल नहीं कर सकता। मेरे पास एक विंडोज़ सेवा है जो मेरे डीएलएल (एमईएफ के माध्यम से) में पढ़ रही है और प्रत्येक डीएलएल एक डब्ल्यूसीएफ सेवा होस्ट है। जब मैं अपनी विंडोज़ सेवा चलाता हूं और डीएलएल में पढ़ता हूं तो सब ठीक हो जाता है, सिवाय इसके कि जब भी डब्ल्यूसीएफ डीएलएल में से कोई भी "गतिविधि" प्राप्त करता है तो वे फिर से शुरू हो जाते हैं और फिर आने वाले डेटा को संसाधित करते हैं। मुझे शुरुआत में एक बार तुरंत चालू करने की आवश्यकता है। क्या यह संभव है?एमईएफ + डब्ल्यूसीएफ सेवा होस्ट?

उत्तर

4

WCF सेवाओं डिफ़ॉल्ट। इसका मतलब यह है कि प्रत्येक आने वाली विधि आमंत्रण के लिए आपकी डब्ल्यूसीएफ सेवा का एक नया उदाहरण तत्काल है। ऐसा लगता है कि आप जो चाहते हैं वह सिंगलटन इंस्टेंस मोड है, लेकिन यदि आप स्केबिलिटी एक समस्या है तो आप वास्तव में इससे बचना चाहते हैं।

जिस तरह से मैंने इसे प्राप्त किया है, प्रति कॉल इंस्टेंस मोड का उपयोग करना है, लेकिन दृश्यों के पीछे एक स्थिर डेटा स्टोर है जिसे मैं एक्सेस सिंक्रनाइज़ करता हूं। यह कम से कम ग्राहकों को कनेक्ट करने की अनुमति देता है, भले ही उन्हें कनेक्शन स्थापित होने के बाद डेटा स्टोर का उपयोग करने के दौरान क्षणिक रूप से अवरुद्ध करना पड़े।

अधिक जानकारी के लिए System.ServiceModel.InstanceContextMode पर एमएसडीएन सहायता का संदर्भ लें।

4

आप एक IServiceBehavior और एक IInstanceProvider को लागू करने, OnStart में IServiceBehavior की मेरी implmentation पंजीकृत करना, और IInstanceProvider आप के लिए वस्तु जीवन का प्रबंधन होने से इस संभाल कर सकते हैं। विशेष रूप से, आप नियंत्रण कंटेनर का एक उलटा उपयोग कर सकते हैं जो प्रत्येक अनुरोध पर आपके सेवा प्रकार के समान उदाहरण को प्रस्तुत करता है (यानी, एकलटन के बिना सिंगलटन-जैसे व्यवहार)। कॉल उदाहरण मोड प्रति एक को

public partial class MyServiceHost : ServiceBase { 
    // details elided 

    protected override void OnStart(string[] args) { 
      this.Host = new ServiceHost(typeof(MySerivce)); 
      this.Host.Description.Behaviors.Add(new MyServiceBehavior()); 
      this.Host.Open(); 
    } 
} 

public class MyServiceBehavior : IServiceBehavior { 
    public void AddBindingParameters(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase, 
     Collection<ServiceEndpoint> endpoints, 
     BindingParameterCollection bindingParameters 
    ) { } 

    public void ApplyDispatchBehavior(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase) { 
      IIoCContainer container = new IocContainer(); 
      foreach (var cdBase in serviceHostBase.ChannelDispatchers) { 
       ChannelDispatcher cd = cdBase as ChannelDispatcher; 
       if (cd != null) { 
        foreach (EndpointDispatcher ed in cd.Endpoints) { 
         ed.DispatchRuntime.InstanceProvider = new MyInstanceProvider(
          container, 
          serviceDescription.ServiceType 
         ); 
        } 
       } 
      } 
     } 

    public void Validate(
     ServiceDescription serviceDescription, 
     ServiceHostBase serviceHostBase 
    ) { } 
} 

public class MyInstanceProvider : IInstanceProvider { 
    readonly IIocContainer _container; 
    readonly Type _serviceType; 

    public InstanceProvider(IIoCContainer container, Type serviceType) { 
     _container = container; 
     _serviceType = serviceType; 
    } 

    public object GetInstance(InstanceContext instanceContext, Message message) { 
     return _container.Resolve(_serviceType); 
    } 

    public object GetInstance(InstanceContext instanceContext) { 
     return GetInstance(instanceContext, null); 
    } 

    public void ReleaseInstance(InstanceContext instanceContext, object instance) { }  
} 
+0

मुझे लगता है कि आप मुझे एक छोटा नमूना दे सकते हैं या शायद अधिक जानकारी में जा सकते हैं। मैं एमईएफ या डब्ल्यूसीएफ में निर्यात का मतलब नहीं हूं। – Travyguy9

+0

मैंने जो कुछ भी बात की है, उसके बारे में मैंने एक बेयरबोन कार्यान्वयन जोड़ा। कुंजी नियंत्रण कंटेनर का उलटा है जो वस्तु जीवनकाल का प्रबंधन करता है। – jason

+0

IIocContainer कौन सा असेंबली स्थित है? – Travyguy9

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^