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()。引数として何を渡すかは完全にはわかりませんが、これらのクライアントは Web アプリで使用されるため、そのルートは避けたいと思います。

だから、私の質問は: デフォルトのクライアント モデルの選択をオーバーライドする最良の方法は何ですか?

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 に答える