public void GetBusControl(Action <IReceiveEndpointConfigurator> callback)
        {
            _busControl = Bus.Factory.CreateUsingAzureServiceBus(x =>
            {
                x.Host(_hostSettings);

                x.ReceiveEndpoint("rpc_consumer" + (_settings.Durable ? "" : "_express"), e =>
                {
                    e.PrefetchCount = _settings.PrefetchCount;
                    if (_settings.ConcurrencyLimit > 0)
                    {
                        e.MaxConcurrentCalls = _settings.ConcurrencyLimit;
                    }

                    callback(e);

                    _targetEndpointAddress = e.InputAddress;
                });
            });

            _busControl.Start();

            _clientFactory = _busControl.CreateClientFactory();
        }
Beispiel #2
0
        public void ConfigureServices(IServiceCollection services)
        {
            ILogger logger = InitLogger(services);

            IMongoDatabase mongodb = InitMongoDb();

            ConnectionMultiplexer redisMultiplexer = InitRedis();

            IConnection rabbitMqConn = InitRabbitMqConn();

            IBusControl    massTransitBus           = InitMassTransit();
            IClientFactory massTransitClientFactory = massTransitBus.CreateClientFactory();


            #region Various

            //ITokenExtractor
            services.AddTransient(typeof(ITokenExtractor), (serviceProvider) =>
            {
                return(new TokenExtractor(_rTokenConfig, new SymmetricKeyProvider(_rTokenKeyConfig)));
            });

            #endregion

            #region Commands

            //IGenerateRefreshTokenCommand
            services.AddTransient(typeof(IGenerateRefreshTokenCommand), (serviceProvider) =>
            {
                IMongoCollection <AccountRTokenInfo> rtokensRepo = mongodb.GetCollection <AccountRTokenInfo>(_accountRTokensCollectionConfig.Name);

                return(new GenerateRefreshTokenCommand(_rTokenConfig,
                                                       new SymmetricKeyProvider(_rTokenKeyConfig),
                                                       new GuidBasedSecretGenerator(),
                                                       rtokensRepo,
                                                       logger));
            });

            //IGenerateShortTokenCommand
            services.AddTransient(typeof(IGenerateShortTokenCommand), (serviceProvider) =>
            {
                var revokedTokensRedisCollectionConfigs         = new RedisCollectionConfig(_config.GetSection("redis").GetSection("revokedTokensCollection"));
                RedisCachedRepo <string> revokedTokensRedisRepo = new RedisCachedRepo <string>(redisMultiplexer.GetDatabase(), revokedTokensRedisCollectionConfigs.CollectionName, new DefaultSerializer(), logger);

                return(new GenerateShortTokenCommand(new TokenExtractor(_rTokenConfig, new SymmetricKeyProvider(_rTokenKeyConfig)),
                                                     revokedTokensRedisRepo,
                                                     new SymmetricKeyProvider(_sTokenKeyConfig),
                                                     new GuidBasedSecretGenerator(),
                                                     _sTokenConfig,
                                                     logger));
            });

            //IRevokeAllTokensForAccountCommand
            services.AddTransient(typeof(IRevokeAllTokensForAccountCommand), (serviceProvider) =>
            {
                IMongoCollection <AccountRTokenInfo> rtokensRepo = mongodb.GetCollection <AccountRTokenInfo>(_accountRTokensCollectionConfig.Name);

                var revokedTokensRedisCollectionConfigs         = new RedisCollectionConfig(_config.GetSection("redis").GetSection("revokedTokensCollection"));
                RedisCachedRepo <string> revokedTokensRedisRepo = new RedisCachedRepo <string>(redisMultiplexer.GetDatabase(), revokedTokensRedisCollectionConfigs.CollectionName, new DefaultSerializer(), logger);

                var command = new RevokeAllTokensForAccountCommand(rtokensRepo, logger);


                var exchangeConfigs = new RabbitMqExchangeConfigs(_config.GetSection("rabbitMq").GetSection("refreshTokenRevokedEventExchange"));
                command.AddSubsciber(new RabbitMqEventPublisher <RefreshTokenRevokedEvent>(
                                         new RabbitMqProducer <RefreshTokenRevokedEvent>(rabbitMqConn, exchangeConfigs, logger),
                                         logger));

                command.AddSubsciber(new RevokedTokenRedisCacher(revokedTokensRedisRepo, logger));
                return(command);
            });

            //IRevokeTokenCommand
            services.AddTransient(typeof(IRevokeTokenCommand), (serviceProvider) =>
            {
                IMongoCollection <AccountRTokenInfo> rtokensRepo = mongodb.GetCollection <AccountRTokenInfo>(_accountRTokensCollectionConfig.Name);
                var revokedTokensRedisCollectionConfigs          = new RedisCollectionConfig(_config.GetSection("redis").GetSection("revokedTokensCollection"));

                RedisCachedRepo <string> revokedTokensRedisRepo = new RedisCachedRepo <string>(redisMultiplexer.GetDatabase(), revokedTokensRedisCollectionConfigs.CollectionName, new DefaultSerializer(), logger);

                var command = new RevokeTokenCommand(rtokensRepo, logger);

                var exchangeConfigs = new RabbitMqExchangeConfigs(_config.GetSection("rabbitMq").GetSection("refreshTokenRevokedEventExchange"));
                command.AddSubsciber(new RabbitMqEventPublisher <RefreshTokenRevokedEvent>(
                                         new RabbitMqProducer <RefreshTokenRevokedEvent>(rabbitMqConn, exchangeConfigs, logger),
                                         logger));

                command.AddSubsciber(new RevokedTokenRedisCacher(revokedTokensRedisRepo, logger));

                return(command);
            });

            #endregion

            #region Queries

            //IGetAllTokensForAccountQuery
            services.AddTransient(typeof(IGetAllTokensForAccountQuery), (serviceProvider) =>
            {
                IMongoCollection <AccountRTokenInfo> rtokensRepo = mongodb.GetCollection <AccountRTokenInfo>(_accountRTokensCollectionConfig.Name);
                return(new GetAllTokensForAccountQuery(rtokensRepo, logger));
            });

            #endregion

            #region MassTransit

            services.AddTransient(typeof(IRequestClient <UserClaimsRequest>), (serviceProvider) =>
            {
                var massTransitChannelName = _config.GetSection("rabbitMq").GetSection("getUserClaimsMassTransitChannel")["Name"];
                var requestClient          = massTransitClientFactory.CreateRequestClient <UserClaimsMQRequest>(new Uri($"rabbitmq://{_rabbitmqConfigs.Host}/{massTransitChannelName}"));
                return(requestClient);
            });

            services.AddTransient(typeof(IRequestClient <AuthValidationRequest>), (serviceProvider) =>
            {
                var massTransitChannelName = _config.GetSection("rabbitMq").GetSection("validateCredentialsMassTransitChannel")["Name"];
                var requestClient          = massTransitClientFactory.CreateRequestClient <AuthValidationMQRequest>(new Uri($"rabbitmq://{_rabbitmqConfigs.Host}/{massTransitChannelName}"));
                return(requestClient);
            });

            #endregion

            #region Mvc Framework

            var mvcBuilder = services.AddMvc();
            MvcConfigProvider mvcConfigProvider = new MvcConfigProvider();
            mvcBuilder.AddMvcOptions(mvcConfigProvider.GetMvcOptionsConfigurer())
            .AddJsonOptions(mvcConfigProvider.GetJsonOptionsConfigurer());
            services.AddSession();
            #endregion
        }