2014-12-15 2 views
0

Windsor에 WCF 클라이언트로 등록하고 WCF 검색을 사용하여 끝점을 찾는 데 필요한 일련의 인터페이스가 있습니다.성 Windsor WCF Facility 모든 Client를 Custom ClientModel에 등록하십시오.

[TestMethod] 
    public void TestMethod1() 
    { 
     var container = new WindsorContainer(); 
     container.AddFacility<WcfFacility>(); 
     container.Register(Component.For<IWcfClientModel>().ImplementedBy<WcfDiscoveryClientModel>()); 

     // NOTE: ISampleService wasn't installed on purpose 
     // to force the container to generate a WCF proxy 
     var x = container.Resolve<ISampleService>(); 
     Assert.IsNotNull(x); 
    } 

WcfDiscoveryClientModel는 다음과 같이 정의된다 :

public class WcfDiscoveryClientModel : WcfClientModelBase 
{ 
    public WcfDiscoveryClientModel() 
    { 
     Endpoint = WcfEndpoint.Discover(); 
    } 
} 

그러나 물론

WcfDiscoveryClientModel에는 코드가 지금까지 실행되지 않습니다 나는이만큼 간단한 뭔가를 기대했다. 시설 출처를 살펴보면 Resolve()에 인수를 전달하지 않는 한 DefaultClientModel 만 사용하는 것처럼 보입니다. 나는 인수로서 무엇을 전달할 것인지 완전히 확신하지는 않지만이 클라이언트가 웹 응용 프로그램에서 사용될 것이므로이 경로를 피하고 싶습니다.

내 질문은 : 기본 클라이언트 모델 선택을 무시하는 가장 좋은 방법은 무엇입니까?

답변

1

서비스가 발견 가능하도록 설정되었다고 가정하면 잘못된 경로에있을 수 있다고 생각합니다. 클라이언트 엔드 포인트에 서비스를 검색하도록 지시하는 것만으로도 충분합니다. 다음은 그 예입니다.

  using (var clientContainer = new WindsorContainer()) 
      { 
       clientContainer.AddFacility<WcfFacility>(); 

       var b = new NetNamedPipeBinding() 
       { 
        TransactionFlow = true, 
        MaxBufferPoolSize = 2147483647, 
        MaxBufferSize = 2147483647, 
        MaxReceivedMessageSize = 2147483647, 
        ReaderQuotas = new XmlDictionaryReaderQuotas 
        { 
         MaxDepth = 2147483647, 
         MaxArrayLength = 2147483647, 
         MaxStringContentLength = 2147483647, 
         MaxNameTableCharCount = 2147483647, 
         MaxBytesPerRead = 2147483647 
        } 
       }; 

       //Notice the .Discover here, not a hard-coded address 
       var endpoint = WcfEndpoint.BoundTo(b).Discover(); 

       clientContainer.Register(Castle.MicroKernel.Registration.Component 
           .For<IYourServiceContract>() 
           .AsWcfClient(endpoint) 
           .LifeStyle.Transient); 

       var clientProxy = clientContainer.Resolve<IYourServiceContract>(); 

       clientProxy.SomeOperation(); 

       clientContainer.Release(dm); 
      } 
관련 문제