public StreamerController(
            ChunkerConfig chunkerConfig,
            StreamerSessionCfg streamerSessionCfg,
            IDistributedCache cache,
            ITokenBroker tokenBroker,
            ISessionBroker sessionBroker,
            ITokenParser tokenParser,
            IChunkCollector chunkCollector,
            IPlaylistAssembler playlistAssembler)
        {
            _cache             = cache;
            _tokenBroker       = tokenBroker;
            _tokenParser       = tokenParser;
            _sessionBroker     = sessionBroker;
            _chunkCollector    = chunkCollector;
            _playlistAssembler = playlistAssembler;

            _chunkerConfig = chunkerConfig;
            _sessionCfg    = streamerSessionCfg;
        }
        public ProjectExplorerWindow(IServiceProvider serviceProvider)
            : base(serviceProvider, DockState.DockLeft)
        {
            InitializeComponent();

            this.serviceProvider = serviceProvider;

            this.TabText = this.Text;

            //
            // This window is a singleton, so we never want it to be closed,
            // just hidden.
            //
            this.HideOnClose = true;

            this.vsToolStripExtender.SetStyle(
                this.toolStrip,
                VisualStudioToolStripExtender.VsVersion.Vs2015,
                this.vs2015LightTheme);

            this.treeView.Nodes.Add(this.rootNode);

            this.mainForm                = serviceProvider.GetService <IMainForm>();
            this.eventService            = serviceProvider.GetService <IEventService>();
            this.jobService              = serviceProvider.GetService <IJobService>();
            this.projectInventoryService = serviceProvider.GetService <IProjectRepository>();
            this.authService             = serviceProvider.GetService <IAuthorizationAdapter>();
            this.sessionBroker           = serviceProvider.GetService <IGlobalSessionBroker>();

            this.eventService.BindAsyncHandler <ProjectAddedEvent>(OnProjectAdded);
            this.eventService.BindHandler <ProjectDeletedEvent>(OnProjectDeleted);
            this.eventService.BindHandler <SessionStartedEvent>(OnRdpSessionStarted);
            this.eventService.BindHandler <SessionEndedEvent>(OnRdpSessionEnded);

            this.ContextMenuCommands = new CommandContainer <IProjectExplorerNode>(
                this,
                this.contextMenu.Items,
                ToolStripItemDisplayStyle.ImageAndText,
                this.serviceProvider);
            this.ToolbarCommands = new CommandContainer <IProjectExplorerNode>(
                this,
                this.toolStrip.Items,
                ToolStripItemDisplayStyle.Image,
                this.serviceProvider);

            this.viewModel = new ProjectExplorerViewModel(
                serviceProvider.GetService <ApplicationSettingsRepository>());
            this.Disposed += (sender, args) =>
            {
                this.viewModel.Dispose();
            };

            //
            // Bind controls.
            //
            this.linuxInstancesToolStripMenuItem.BindProperty(
                c => c.Checked,
                this.viewModel,
                m => m.IsLinuxIncluded,
                this.Container);
            this.windowsInstancesToolStripMenuItem.BindProperty(
                c => c.Checked,
                this.viewModel,
                m => m.IsWindowsIncluded,
                this.Container);

            this.viewModel.PropertyChanged += (sender, args) =>
            {
                // Refresh tree, and show message on error.
                refreshButton_Click(sender, EventArgs.Empty);
            };
        }