//------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //------------------------------------------------------------ namespace System.ServiceModel { using System.Runtime; using System.ServiceModel.Channels; using System.ServiceModel.Description; sealed class ProgrammaticEndpointTrait : EndpointTrait where TChannel : class { EndpointAddress remoteAddress; Binding binding; InstanceContext callbackInstance; public ProgrammaticEndpointTrait(Binding binding, EndpointAddress remoteAddress, InstanceContext callbackInstance) : base() { this.binding = binding; this.remoteAddress = remoteAddress; this.callbackInstance = callbackInstance; } public override bool Equals(object obj) { ProgrammaticEndpointTrait trait1 = obj as ProgrammaticEndpointTrait; if (trait1 == null) return false; if (!object.ReferenceEquals(this.callbackInstance, trait1.callbackInstance)) return false; // EndpointAddress.Equals is used. if (this.remoteAddress != trait1.remoteAddress) return false; if (!object.ReferenceEquals(this.binding, trait1.binding)) return false; return true; } public override int GetHashCode() { int hashCode = 0; if (this.callbackInstance != null) { hashCode ^= this.callbackInstance.GetHashCode(); } Fx.Assert(this.remoteAddress != null, "remoteAddress should not be null."); hashCode ^= this.remoteAddress.GetHashCode(); Fx.Assert(this.binding != null, "binding should not be null."); hashCode ^= this.binding.GetHashCode(); return hashCode; } public override ChannelFactory CreateChannelFactory() { if (this.callbackInstance != null) return CreateDuplexFactory(); return CreateSimplexFactory(); } DuplexChannelFactory CreateDuplexFactory() { Fx.Assert(this.remoteAddress != null, "remoteAddress should not be null."); Fx.Assert(this.binding != null, "binding should not be null."); return new DuplexChannelFactory(this.callbackInstance, this.binding, this.remoteAddress); } ChannelFactory CreateSimplexFactory() { Fx.Assert(this.remoteAddress != null, "remoteAddress should not be null."); Fx.Assert(this.binding != null, "binding should not be null."); return new ChannelFactory(this.binding, this.remoteAddress); } } }