2016-10-27 2 views
0

매우 유사한 구성을 가진 여러 다른 서버에서 실행되는 서비스가 있습니다. Castle Windsor WCF Facility를 사용하여 임의의 종점 주소에 대한 클라이언트를 생성 할 수 있기를 원합니다.여러 엔드 포인트 용 Windsor WCF 클라이언트

public class ServiceFactory { 
    public IService GetService(string hostName){ 
     .... 
    } 
} 

지금, 나는 내 모든 서비스가 될 것입니다 무엇을 컴파일 타임에 알, 그래서이 할 수 있습니다 :이처럼 내 ServiceFactory를

var container = new WindsorContainer(); 

// ... 

container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero); 
container.Register(Component.For<IService>().AsWcfClient(new DefaultClientModel() 
{ 
    Endpoint = WcfEndpoint.BoundTo(new NetTcpBinding()).At("net.tcp://hostname:port") 
}).Named("hostname")); 

을 그리고 수행

public class ServiceFactory 
{ 
    private readonly IWindsorContainer _container; 

    public ServiceFactory(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IService GetService(string hostName) 
    { 
     return _container.Resolve<IService>(hostName); 
    } 
} 

그러나 이것은 특정 엔드 포인트를 구성하는 것을 잊어 버리는 것에 대해 강력하지 않습니다. 보다 우아한 솔루션이 있습니까?

답변

0

나는 WCF Facility 소스 코드를 통해 철저히 조사해야했지만 예! 보다 세련된 솔루션이 있습니다 :

WCF 기능은 런타임에 팩토리를 동적으로 생성하는 데 사용되는 Typed Factory Facility와 통합됩니다. WCF 기능은 IWcfEndpoint에서 서비스 연결을 생성하는 팩토리를 해결하기 위해 Typed Factory Facility에 기능을 추가합니다.

구체적으로는 형태의 팩토리 메소드를 해결하는 방법을 알고 :

IService Create(IWcfEndpoint endpoint); 

을 IService가 [ServiceContract] 속성이 무엇인가이다.

먼저 나는 Func<IWcfEndpoint,IService>에 따라 내 서비스 공장을 : 설치할 때, 내가 추가

public class ServiceFactory { 
    public ServiceFactory(Func<IWcfEndpoint, IService> resolveService){ 
     _resolveService = resolveService; 
    } 

    public IService GetService(string hostName){ 
     return _resolveService(WcfEndpoint.BoundTo(new NetTcpBinding()).At($"net.tcp://{hostName}:port")); 
    } 
} 

을 그 다음 TypedFactoryFacility :

var container = new WindsorContainer(); 

// ... 

container.AddFacility<TypedFactoryFacility>(); 
container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero); 
container.Register(
    Component.For<Func<IWcfEndpoint, IService>>().AsFactory(), 
    Component.For<ServiceFactory>().ImplementedBy<ServiceFactory>()); 

윈저 다음을 요청 아무것도에 ServiceFactory를 제공합니다 호스트 이름에서 IService 클라이언트를 생성하기 위해 연결합니다.

public class FooClass { 
    public FooClass(ServiceFactory serviceFactory){ 
     var service = serviceFactory.GetService("localhost"); 
    } 
} 
관련 문제