2011-03-20 23 views
13

Bir hizmeti WCF aracılığıyla görüntüleyen bir uygulama yazıyorum. Servis kendi kendini barındırır (konsol uygulaması) ve bir Singleton örneğini kullanması gerekir. Hizmet uygulamasındaki öznitelikleri kullanarak olmadan hizmet yapılandırmasında singleton belirtmeyi anlamaya çalışıyorum. Bir öznitelik olmadan kod içinde singleton belirtmek mümkün mü?Bir WCF kendi kendine barındırılan hizmetinde bir Singleton hizmeti belirtin

sayesinde Erick

cevap

22

Onun yerine bir tür geçme ServiceHost constructor hizmet örneğini geçebilir. Böyle bir durumda, aktarılan örneğiniz singleton olarak kullanılacaktır.

Düzenleme:

Benim eski çözüm çalışmaz. ServiceHost yapıcısına örnek sağlamak, 'u InstanceContextMode.Single ile talep etmektedir. Ama bu çalışması gerekir: sadece bunu almak ve değişim varsayılan değer gerekir böylece bunu belirtmek olmasa bile

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

ServiceBehaviorAttribute dahildir.

+0

WCF için yeni ve ben sınıfına yapılandırma yerine meta veri ile kontrol etmek istediğiniz bir WCF hizmeti var. Lütfen çözümünüzün detaylarını verebilir misiniz? – SJunejo

+0

'InstanceContextMode' öğesini 'PerCall'a zorladım ve bu yöntem de bunun için çalışıyor. – Dan

0

Eğer web.config veya app.config içine bu hareket etmek istiyorsanız, özel bir BehaviorExtensionElement ve IServiceBehavior ile çok yapabilirdi:

IServiceBehavior aslında enum içine yapılandırmasındaki değerini ayrıştırmak ve Ladislav cevabı @ aşağıdaki (o ayarlayacaktır):

:

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; 
    } 
} 

uzatma öğesi yapılandırmasındaki çekin ve IServiceBehavior bunu geçmesine izin verir

Ve sonra config kaydetmek ve kullanabilirsiniz:

<extensions> 
    <behaviorExtensions> 
    <add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/> 
    </behaviorExtensions> 
</extensions> 
... 
    <serviceBehaviors> 
    <behavior name="Default"> 
     <instanceContext contextMode="Single"/> 
İlgili konular