2011-03-20 11 views
13

मैं एक ऐसा एप्लीकेशन लिख रहा हूं जो डब्ल्यूसीएफ के माध्यम से एक सेवा का खुलासा करता है। सेवा स्वयं-होस्ट (कंसोल ऐप) है और सिंगलटन इंस्टेंस का उपयोग करने की आवश्यकता है। मैं सेवा कार्यान्वयन पर विशेषताओं का उपयोग कर के बिना सेवा कॉन्फ़िगरेशन में सिंगलटन को निर्दिष्ट करने का तरीका जानने का प्रयास कर रहा हूं। क्या बिना किसी विशेषता के कोड में सिंगलटन निर्दिष्ट करना संभव है?डब्ल्यूसीएफ स्वयं होस्टेड सेवा में सिंगलटन सेवा निर्दिष्ट करें

धन्यवाद, एरिक

उत्तर

22

आप सेवा का उदाहरण ServiceHost constructor के बजाय एक प्रकार गुजर के पास कर सकते हैं। ऐसे मामले में आपका उत्तीर्ण उदाहरण सिंगलटन के रूप में उपयोग किया जाएगा।

संपादित करें:

मेरे पूर्व समाधान काम नहीं करता। ServiceHost कन्स्ट्रक्टर को उदाहरण प्रदान करना अभी भी InstanceContextMode.Single के साथ मांगता है। लेकिन इस एक काम करना चाहिए: तो तुम सिर्फ इसे पाने और परिवर्तन डिफ़ॉल्ट मान की जरूरत है भले ही आप इसे निर्दिष्ट नहीं करते

var host = new ServiceHost(typeof(Service)); 
var behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
behavior.InstanceContextMode = InstanceContextMode.Single; 
host.Open(); 

ServiceBehaviorAttribute शामिल है।

+0

मैं WCF करने के लिए नया हूँ और मैं एक WCF सेवा है जो मैं के बजाय वर्ग पर विन्यास मेटाडाटा के साथ नियंत्रित करने के लिए चाहते हैं। क्या आप कृपया अपने समाधान का विवरण प्रदान कर सकते हैं। – SJunejo

+0

मुझे 'InstanceContextMode' को' PerCall' पर बल देने की आवश्यकता है, और यह विधि इसके लिए भी काम करती है। – Dan

0

आप web.config या app.config में इस ले जाना चाहते हैं, तो आप एक कस्टम BehaviorExtensionElement और IServiceBehavior के साथ ऐसा कर सकता है:

IServiceBehavior वास्तव में enum में config से मान पार्स और इसे सेट (निम्नलिखित @ Ladislav का जवाब होगा):

:

public class InstanceContextServiceBehavior : IServiceBehavior 
{ 
    InstanceContextMode _contextMode = default(InstanceContextMode); 

    public InstanceContextServiceBehavior(string contextMode) 
    { 
     if (!string.IsNullOrWhiteSpace(contextMode)) 
     { 
      InstanceContextMode mode; 

      if (Enum.TryParse(contextMode, true, out mode)) 
      { 
       _contextMode = mode; 
      } 
      else 
      { 
       throw new ArgumentException($"'{contextMode}' Could not be parsed as a valid InstanceContextMode; allowed values are 'PerSession', 'PerCall', 'Single'", "contextMode"); 
      } 
     } 
    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) 
    { 
     var behavior = serviceDescription.Behaviors.Find<ServiceBehaviorAttribute>(); 
     behavior.InstanceContextMode = _contextMode; 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     return; 
    } 

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

विस्तार तत्व आप config से निकालें और उसे IServiceBehavior को पारित करने के लिए अनुमति देता है

और तुम तो अपने config में यह रजिस्टर और इसका इस्तेमाल कर सकते हैं:

<extensions> 
    <behaviorExtensions> 
    <add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/> 
    </behaviorExtensions> 
</extensions> 
... 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <instanceContext contextMode="Single"/> 
संबंधित मुद्दे