public RoutingInfoPublisher(RoutingInfoCommunicator dataBackplane, IReadOnlyCollection <Type> hanledMessageTypes, IReadOnlyCollection <Type> publishedMessageTypes, ReadOnlySettings settings, TimeSpan heartbeatPeriod)
 {
     this.dataBackplane         = dataBackplane;
     this.hanledMessageTypes    = hanledMessageTypes;
     this.publishedMessageTypes = publishedMessageTypes;
     this.settings        = settings;
     this.heartbeatPeriod = heartbeatPeriod;
 }
    protected override void Setup(FeatureConfigurationContext context)
    {
        var settings              = context.Settings;
        var conventions           = settings.Get <Conventions>();
        var uniqueKey             = settings.InstanceSpecificQueue() ?? settings.LocalAddress();
        var unicastRoutingTable   = settings.Get <UnicastRoutingTable>();
        var endpointInstances     = settings.Get <EndpointInstances>();
        var publishers            = settings.Get <Publishers>();
        var connectionString      = settings.Get <string>("NServiceBus.AutomaticRouting.ConnectionString");
        var messageTypesPublished = settings.Get <Type[]>("NServiceBus.AutomaticRouting.PublishedTypes");

        #region Feature

        // Create the infrastructure
        var dataAccess   = new SqlDataAccess(uniqueKey, connectionString);
        var communicator = new RoutingInfoCommunicator(dataAccess);
        context.RegisterStartupTask(communicator);

        // Register the routing info publisher
        context.RegisterStartupTask(builder =>
        {
            var handlerRegistry     = builder.Build <MessageHandlerRegistry>();
            var messageTypesHandled = GetHandledMessages(handlerRegistry, conventions);
            return(new RoutingInfoPublisher(
                       dataBackplane: communicator,
                       hanledMessageTypes: messageTypesHandled,
                       publishedMessageTypes: messageTypesPublished,
                       settings: settings,
                       heartbeatPeriod: TimeSpan.FromSeconds(5)));
        });

        // Register the routing info subscriber
        context.RegisterStartupTask(builder =>
        {
            var handlerRegistry     = builder.Build <MessageHandlerRegistry>();
            var messageTypesHandled = GetHandledMessages(handlerRegistry, conventions);
            var subscriber          = new RoutingInfoSubscriber(
                routingTable: unicastRoutingTable,
                endpointInstances: endpointInstances,
                messageTypesHandledByThisEndpoint: messageTypesHandled,
                publishers: publishers,
                sweepPeriod: TimeSpan.FromSeconds(5),
                heartbeatTimeout: TimeSpan.FromSeconds(20));
            communicator.Changed = subscriber.OnChanged;
            communicator.Removed = subscriber.OnRemoved;
            return(subscriber);
        });

        context.Pipeline.Register(
            stepId: "VerifyAdvertisedBehavior",
            behavior: new VerifyAdvertisedBehavior(messageTypesPublished),
            description: "Verifies if all published types has been advertised.");

        #endregion
    }