0

我有一组接口,我想在 Windsor 中注册为 WCF 客户端,并让它们都使用 WCF 发现来查找端点。我希望做一些像这样简单的事情:

    [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从来没有执行过任何代码。从设施来源来看,DefaultClientModel除非我将某些内容传递给Resolve(). 我不完全确定我会作为参数传递什么,但我真的很想避免这条路线,因为这些客户端将在网络应用程序中使用。

所以,我的问题是:覆盖默认客户端模型选择的最佳方法是什么?

4

1 回答 1

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);
            }
于 2015-03-27T20:49:28.890 回答