public static IServiceCollection AddCanalService(this IServiceCollection serviceCollection, Action <CanalConsumeRegister> register)
        {
            if (register == null)
            {
                throw new ArgumentNullException(nameof(register));
            }

            var registerModel = new CanalConsumeRegister();

            register(registerModel);

            if (!registerModel.ConsumeList.Any() && !registerModel.SingletonConsumeList.Any())
            {
                throw new ArgumentNullException(nameof(registerModel.ConsumeList));
            }

            serviceCollection.AddOptions();

            serviceCollection.TryAddSingleton <IConfigureOptions <CanalOption>, ConfigureCanalOption>();

            serviceCollection.AddTransient <IHostedService, CanalService>();


            if (registerModel.ConsumeList.Any())
            {
                foreach (var type in registerModel.ConsumeList)
                {
                    serviceCollection.TryAddTransient(type);
                }
            }

            if (registerModel.SingletonConsumeList.Any())
            {
                foreach (var type in registerModel.SingletonConsumeList)
                {
                    serviceCollection.TryAddSingleton(type);
                }
            }

            serviceCollection.AddSingleton(registerModel);

            return(serviceCollection);
        }
Beispiel #2
0
        public CanalService(ILogger <CanalService> logger, IOptions <CanalOption> canalOption, IServiceScopeFactory scopeFactory, IConfiguration configuration, CanalConsumeRegister register)
        {
            _logger           = logger;
            _registerTypeList = new List <System.Type>();
            if (register.SingletonConsumeList != null && register.SingletonConsumeList.Any())
            {
                _registerTypeList.AddRange(register.SingletonConsumeList);
            }
            if (register.ConsumeList != null && register.ConsumeList.Any())
            {
                _registerTypeList.AddRange(register.ConsumeList);
            }
            _configuration = configuration;
            _canalOption   = canalOption?.Value;
            if (_canalOption == null)
            {
                _canalOption = new CanalOption();
            }

            UpdateFromEnv(_canalOption);

            if (string.IsNullOrEmpty(_canalOption.Host) || string.IsNullOrEmpty(_canalOption.Destination) ||
                string.IsNullOrEmpty(_canalOption.MysqlName) ||
                string.IsNullOrEmpty(_canalOption.MysqlPwd) || _canalOption.Port < 1 || _canalOption.Timer < 1 || _canalOption.GetCountsPerTimes < 1)
            {
                throw new ArgumentNullException("Canal param in appsettings.json is not correct!");
            }

            if (string.IsNullOrEmpty(_canalOption.Subscribe))
            {
                _canalOption.Subscribe = ".*\\..*";
            }
            _scope = scopeFactory.CreateScope();
        }