2012-03-28 14 views
3

実行時にサービス契約の実装をどのように切り替えることができますか?実行時にWCFで実行時にサービス契約の実装を切り替えます

は、私が持っていると言う:

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

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

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

私は、configファイルまたは両者の間に、データベース内の値と言うから使用されている実装を切り替えることができるようにしたいと思います。 WCFサービスが暑い間にこれを行うことも可能でしょうか?

答えて

3

IServiceBehaviorを実装してサービス行動を記述し、インスタンスプロバイダを使用してサービスインスタンスを初期化する必要があります。以下は、新しいサービスインスタンスを初期化し、あなたは別のロジックを実装可能性があります

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) 
    { 
    } 
} 

をそして、あなたのインスタンスプロバイダクラスがIInstanceProviderを実装し、GetInstanceメソッドに関連するインスタンスを返しています。

public XInstanceProvider :IInstanceProvider 
{ 
    ... 

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

サービスにservicebehaviourを追加するだけで済みます。 〜のようなもの

[XInstanceProviderServiceBehavior()]  
    public class MyService : IMyService 
関連する問題