2016-10-27 7 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ファシリティのソースコードを使用しなければなりませんでしたが、はい!

WCF機能は、実行時にファクトリを動的に作成するために使用される型付きファクトリファシリティと統合されています。 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>()); 

ウィンザーは、その後1を要求するものにのServiceFactoryを提供しますホスト名からIServiceクライアントを生成するためにワイヤリングします。

public class FooClass { 
    public FooClass(ServiceFactory serviceFactory){ 
     var service = serviceFactory.GetService("localhost"); 
    } 
} 
関連する問題