2012-03-28 7 views
3

Wie würde ich die Implementierung des Servicevertrags zur Laufzeit wechseln?Die Implementierung des Servicevertrags zur Laufzeit in WCF wechseln

Sagen, ich habe:

[ServiceContract] 
public interface IService { 
    [OperationContract] 
    DoWork(); 
} 

public class ServiceA : IService { 
    public string DoWork() { 
     // .... 
    } 
} 

public class ServiceB : IService { 
    public string DoWork() { 
     // .... 
    } 
} 

ich die Implementierung in der Lage sein möchten, wechseln, der von etwa einer Konfigurationsdatei oder einen Wert in einer Datenbank zwischen den beiden verwendet wird. Wäre es auch möglich, dies zu tun, während der WCF-Dienst heiß ist?

Antwort

3

Sie müssen ein Dienstverhalten schreiben, indem Sie IServiceBehavior implementieren und die Dienstinstanz mithilfe eines Instanzproviders initialisieren. Im Folgenden initialisiert eine neue Service-Instanz, können Sie eine andere Logik implementieren:

public class XInstanceProviderServiceBehavior : Attribute, IServiceBehavior 
{   

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) 
    { 
     foreach (var item in serviceHostBase.ChannelDispatchers) 
     { 
      var dispatcher = item as ChannelDispatcher; 
      if (dispatcher != null) 
      { 
       dispatcher.Endpoints.ToList().ForEach(endpoint => 
       { 
        endpoint.DispatchRuntime.InstanceProvider = new XInstanceProvider(serviceDescription.ServiceType); 
       }); 
      } 
     } 
    } 

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

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

Und Ihre Instanz Provider-Klasse haben IInstanceProvider implementieren und damit verbundene Instanz in GetInstance Methode zurückzukehren.

public XInstanceProvider :IInstanceProvider 
{ 
    ... 

    public object GetInstance(InstanceContext instanceContext, System.ServiceModel.Channels.Message message) 
    { 
     return new ServiceX(); 
    } 
} 

Dann alles, was Sie brauchen, ist servicebehaviour zu Dienst hinzuzufügen; etwas wie

Verwandte Themen