public void AuthenticateAsync()
        {
            _identity      = _session.CreateIdentity();
            _authenticator = _authenticatorFactory(this);

            _responseProcessors.Add(_authenticator);

            _serviceManager.Request(ServiceUris.AuthenticationService)
            .Then(service =>
            {
                _authorisationService = service;

                _securityEntitlementsManager = new SecurityEntitlementsManager(_session, _authorisationService, _identity);
                _responseProcessors.Add(_securityEntitlementsManager);

                _userEntitlementsManager = new UserEntitlementsManager(_session, _authorisationService, _identity);
                _responseProcessors.Add(_userEntitlementsManager);

                return(_authenticator.Request(_session, service, _identity));
            })
            .Then(isAuthenticated =>
            {
                RaiseEvent(AuthenticationStatus, new EventArgs <bool>(isAuthenticated));
                return(isAuthenticated ? Promise.Resolved() : Promise.Rejected(new ApplicationException("Authentication failed")));
            })
            .ThenAll(() => new[]
            {
                _serviceManager.Request(ServiceUris.ReferenceDataService)
                .Then(service =>
                {
                    _referenceDataService = service;

                    _referenceDataManager = new ReferenceDataManager(_session, _referenceDataService, _identity);
                    _responseProcessors.Add(_referenceDataManager);

                    _historicalDataManager = new HistoricalDataManager(_session, _referenceDataService, _identity);
                    _responseProcessors.Add(_historicalDataManager);

                    _intradayBarManager = new IntradayBarManager(_session, _referenceDataService, _identity);
                    _responseProcessors.Add(_intradayBarManager);

                    _intradayTickManager = new IntradayTickManager(_session, _referenceDataService, _identity);
                    _responseProcessors.Add(_intradayTickManager);

                    return(Promise.Resolved());
                }),
                _serviceManager.Request(ServiceUris.MarketDataService)
                .Then(service =>
                {
                    _marketDataService   = service;
                    _subscriptionManager = new SubscriptionManager(_session, _identity);
                    return(Promise.Resolved());
                })
            }).Done(
                () => RaiseEvent(InitialisationStatus, new EventArgs <bool>(true)),
                _ => RaiseEvent(InitialisationStatus, new EventArgs <bool>(false)));
        }
        public void Start()
        {
            if (!_session.Start())
            {
                throw new Exception("Failed to start session");
            }

            _identity = _session.CreateIdentity();

            _authorisationService = OpenService(ServiceUris.AuthenticationService);

            _securityEntitlementsManager = new SecurityEntitlementsManager(_session, _authorisationService, _identity);
            _responseProcessors.Add(_securityEntitlementsManager);

            _userEntitlementsManager = new UserEntitlementsManager(_session, _authorisationService, _identity);
            _responseProcessors.Add(_userEntitlementsManager);

            _authenticator = _authenticatorFactory(this);
            _responseProcessors.Add(_authenticator);

            _authenticator.Authenticate(_session, _authorisationService, _identity);

            _marketDataService   = OpenService(ServiceUris.MarketDataService);
            _subscriptionManager = new SubscriptionManager(_session, _identity);

            _referenceDataService = OpenService(ServiceUris.ReferenceDataService);

            _historicalDataManager = new HistoricalDataManager(_session, _referenceDataService, _identity);
            _responseProcessors.Add(_historicalDataManager);

            _intradayBarManager = new IntradayBarManager(_session, _referenceDataService, _identity);
            _responseProcessors.Add(_intradayBarManager);

            _intradayTickManager = new IntradayTickManager(_session, _referenceDataService, _identity);
            _responseProcessors.Add(_intradayTickManager);

            RaiseEvent(InitialisationStatus, new EventArgs <bool>(true));
        }