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); }
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(); }