string listenUriRelativeAddress,
ListenUriMode listenUriMode)
{
- this.binding = binding;
+ this.binding = new CustomBinding (binding);
parameters = new BindingParameterCollection ();
foreach (var item in parms)
parameters.Add (item);
public IChannelFactory<TChannel>
BuildInnerChannelFactory<TChannel> ()
{
- return DequeueBindingElement ().BuildChannelFactory<TChannel> (this);
+ BindingContext ctx = this.Clone ();
+ return ctx.DequeueBindingElement ().BuildChannelFactory<TChannel> (ctx);
}
#if !NET_2_1
BuildInnerChannelListener<TChannel> ()
where TChannel : class, IChannel
{
- var be = DequeueBindingElement (false);
+ BindingContext ctx = this.Clone ();
+ var be = ctx.DequeueBindingElement (false);
if (be == null)
throw new InvalidOperationException ("There is likely no TransportBindingElement that can build a channel listener in this binding context");
- return be.BuildChannelListener<TChannel> (this);
+ return be.BuildChannelListener<TChannel> (ctx);
}
#endif
public bool CanBuildInnerChannelListener<TChannel> ()
where TChannel : class, IChannel
{
- var be = DequeueBindingElement (false);
+ BindingContext ctx = this.Clone ();
+ var be = ctx.DequeueBindingElement (false);
if (be == null)
throw new InvalidOperationException ("There is likely no TransportBindingElement that can build a channel listener in this binding context");
- return be.CanBuildChannelListener<TChannel> (this);
+ return be.CanBuildChannelListener<TChannel> (ctx);
}
#endif
public T GetInnerProperty<T> () where T : class
{
- BindingElement e = DequeueBindingElement (false);
- return e == null ? default (T) : e.GetProperty<T> (this);
+ BindingContext ctx = this.Clone ();
+ BindingElement e = ctx.DequeueBindingElement (false);
+ return e == null ? default (T) : e.GetProperty<T> (ctx);
}
public BindingContext Clone ()
ctx = new BindingContext (binding, pl);
Assert.IsNull (ctx.GetInnerProperty<ClientCredentials> ());
}
+
+ [Test]
+ public void RemainingBindingElements ()
+ {
+ var b = new CustomBinding (
+ new BinaryMessageEncodingBindingElement (),
+ new InterceptorBindingElement2 (),
+ new HttpTransportBindingElement ());
+ Assert.AreEqual (3, new BindingContext (b, new BindingParameterCollection ()).RemainingBindingElements.Count, "#1");
+ Assert.IsTrue (b.CanBuildChannelFactory<IRequestChannel> (), "#2");
+
+ }
+
+ [Test]
+ public void RemainingBindingElements2 ()
+ {
+ var b = new CustomBinding (
+ new BindingElement2 (),
+ new InterceptorBindingElement3 (),
+ new BindingElement3 ());
+
+ Assert.AreEqual (3, new BindingContext (b, new BindingParameterCollection ()).RemainingBindingElements.Count, "New BindingContext element count");
+ Assert.IsTrue (b.CanBuildChannelFactory<IRequestChannel> (), "supports IRequestChannel?");
+ }
+
+ public class InterceptorBindingElement2 : BindingElement
+ {
+ public override bool CanBuildChannelFactory<TChannel> (BindingContext bc)
+ {
+ Assert.AreEqual (1, bc.Clone ().RemainingBindingElements.Count, "#i1");
+ Assert.IsNull (bc.GetInnerProperty<MessageEncodingBindingElement> (), "#i2");
+ Assert.IsNull (bc.GetInnerProperty<MessageEncoder> (), "#i3");
+ Assert.IsNull (bc.GetInnerProperty<MessageEncoderFactory> (), "#i4");
+ Assert.AreEqual (1, bc.RemainingBindingElements.Count, "#i5");
+ Assert.IsTrue (bc.RemainingBindingElements [0] is HttpTransportBindingElement, "#i6");
+ Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "#i7");
+ return base.CanBuildChannelFactory<TChannel> (bc);
+ }
+
+ public override BindingElement Clone ()
+ {
+ return new InterceptorBindingElement2 ();
+ }
+
+ public override T GetProperty<T> (BindingContext bc)
+ {
+ return null;
+ }
+ }
+
+ public class InterceptorBindingElement3 : BindingElement {
+ public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+ if (this is BindingElement2) {
+ Assert.AreEqual (2, bc.Clone ().RemainingBindingElements.Count, "1- Cloned context element count");
+ Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "1- Original binding element count");
+ Assert.IsTrue (bc.RemainingBindingElements [0] is InterceptorBindingElement3, "1- binding element 1 type");
+ Assert.IsTrue (bc.RemainingBindingElements [1] is BindingElement3, "1- binding element 2 type");
+ } else {
+ Assert.AreEqual (1, bc.Clone ().RemainingBindingElements.Count, "2- Cloned context element count");
+ Assert.AreEqual (3, bc.Binding.CreateBindingElements ().Count, "2- Original binding element count");
+ Assert.IsTrue (bc.RemainingBindingElements [0] is BindingElement3, "2- binding element 1 type");
+ }
+ return base.CanBuildChannelFactory<TChannel> (bc);
+ }
+ public override BindingElement Clone () {
+ return new InterceptorBindingElement3 ();
+ }
+
+ public override T GetProperty<T> (BindingContext bc) {
+ return null;
+ }
+ }
+
+ public class BindingElement2 : InterceptorBindingElement3 {
+
+ public override BindingElement Clone () {
+ return new BindingElement2 ();
+ }
+ public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+ return base.CanBuildChannelFactory<TChannel> (bc);
+ }
+
+ }
+
+ public class BindingElement3 : HttpTransportBindingElement {
+
+ public override BindingElement Clone () {
+ return new BindingElement3 ();
+ }
+ public override bool CanBuildChannelFactory<TChannel> (BindingContext bc) {
+ return base.CanBuildChannelFactory<TChannel> (bc);
+ }
+
+ }
+
}
}
+