public DefaultDiscoveryService(
            DiscoveryServiceExtension discoveryServiceExtension,
            DiscoveryMessageSequenceGenerator discoveryMessageSequenceGenerator,
            int duplicateMessageHistoryLength)
            : base(discoveryMessageSequenceGenerator, duplicateMessageHistoryLength)

        {
            Fx.Assert(discoveryServiceExtension != null, "The discoveryServiceExtension must be non null.");
            this.publishedEndpoints = discoveryServiceExtension.PublishedEndpoints;
        }
        void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            if (serviceDescription == null)
            {
                throw FxTrace.Exception.ArgumentNull("serviceDescription");
            }
            if (serviceHostBase == null)
            {
                throw FxTrace.Exception.ArgumentNull("serviceHostBase");
            }

            List <ServiceEndpoint> appEndpoints = this.GetApplicationEndpoints(serviceDescription);

            DiscoveryServiceExtension discoveryServiceExtension =
                serviceHostBase.Extensions.Find <DiscoveryServiceExtension>();

            if (discoveryServiceExtension == null)
            {
                if (serviceDescription.Endpoints.Count > appEndpoints.Count)
                {
                    discoveryServiceExtension =
                        new DefaultDiscoveryServiceExtension(DiscoveryDefaults.DuplicateMessageHistoryLength);
                }
                else
                {
                    discoveryServiceExtension =
                        new DefaultDiscoveryServiceExtension(0);
                }

                serviceHostBase.Extensions.Add(discoveryServiceExtension);
            }

            for (int i = 0; i < appEndpoints.Count; i++)
            {
                appEndpoints[i].Behaviors.Add(
                    new EndpointDiscoveryMetadataInitializer(
                        discoveryServiceExtension.InternalPublishedEndpoints));
            }
        }
        void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
            if (serviceDescription == null)
            {
                throw FxTrace.Exception.ArgumentNull("serviceDescription");
            }
            if (serviceHostBase == null)
            {
                throw FxTrace.Exception.ArgumentNull("serviceHostBase");
            }

            DiscoveryServiceExtension discoveryServiceExtension = serviceHostBase.Extensions.Find <DiscoveryServiceExtension>();

            if (discoveryServiceExtension != null)
            {
                DiscoveryService discoveryService = discoveryServiceExtension.ValidateAndGetDiscoveryService();

                ServiceDiscoveryBehavior.SetDiscoveryImplementation(serviceHostBase, discoveryService);

                if (this.announcementEndpoints.Count > 0)
                {
                    serviceHostBase.ChannelDispatchers.Add(
                        new OnlineAnnouncementChannelDispatcher(
                            serviceHostBase,
                            this.announcementEndpoints,
                            discoveryServiceExtension.InternalPublishedEndpoints,
                            discoveryService.MessageSequenceGenerator));

                    serviceHostBase.ChannelDispatchers.Insert(0,
                                                              new OfflineAnnouncementChannelDispatcher(
                                                                  serviceHostBase,
                                                                  this.announcementEndpoints,
                                                                  discoveryServiceExtension.InternalPublishedEndpoints,
                                                                  discoveryService.MessageSequenceGenerator));
                }
            }
        }
 internal DiscoveryEndpointPublisherBehavior(DiscoveryServiceExtension extension)
 {
     this.extension = extension;
 }