2012-03-28 5 views
3

런타임시 서비스 계약의 구현을 어떻게 전환합니까? WCF에서 런타임에 서비스 계약 구현 전환

내가 가진 말 :

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

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

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

나는 둘 사이에 데이터베이스의 설정 파일이나 값 말에서 사용되는 구현을 전환 할 수 있도록하고 싶습니다. 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