2016-10-27 358 views
0

我有一個服務運行在多個不同的服務器上,配置非常相似。我希望能夠使用Castle Windsor WCF工具爲任意端點地址生成客戶端。現在溫莎WCF多客戶端客戶端

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

,我會在編譯時知道什麼我所有的服務將是,這樣我就可以做到這一點:

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")); 

然後做我的ServiceFactory是這樣的:

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源代碼拼寫,但YES!有一個更優雅的解決方案:

WCF工具與Typed Factory Facility集成,用於在運行時動態創建工廠。 WCF工具爲Typed Factory Facility添加了功能,用於解析IWcfEndpoint生成服務連接的工廠。

具體來說,它知道如何在形式解決工廠方法:

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>()); 

溫莎然後將提供一個服務工廠到任何詢問一個,並將其連線以從主機名生成IService客戶端:

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