【问题标题】:Windsor WCF Client for multiple endpoints用于多个端点的 Windsor WCF 客户端
【发布时间】:2016-11-04 16:36:30
【问题描述】:

我有一个服务在多个不同的服务器上运行,配置非常相似。我希望能够使用 Castle Windsor 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);
    }
}

但这对我忘记配置特定端点并不可靠。有没有更优雅的解决方案?

【问题讨论】:

    标签: c# wcf castle-windsor wcffacility


    【解决方案1】:

    我不得不深入研究 WCF 设施源代码,但是是的!有一个更优雅的解决方案:

    WCF 工具与用于在运行时动态创建工厂的类型化工厂工具集成。 WCF 工具向 Typed Factory Facility 添加了功能,用于解析从 IWcfEndpoint 生成服务连接的工厂。

    具体来说,它知道如何解析表单中的工厂方法:

    IService Create(IWcfEndpoint endpoint);
    

    IService 是带有[ServiceContract] 属性的东西。

    首先我让我的服务工厂依赖于Func&lt;IWcfEndpoint,IService&gt;

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

    然后,Windsor 将为任何需要它的东西提供一个 ServiceFactory,并将其连接起来以从主机名生成一个 IService 客户端:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      相关资源
      最近更新 更多