/// <summary> /// /// </summary> public virtual void Run() { var options = TelegramBotConfig.GetOptions(AppConfig.OptionsName); if (options == null) { throw new Exception($"Telegram bot options not configured! Options name: {AppConfig.OptionsName}"); } _container = options.Container; _servicesProvider = options.ServicesProvider; options.ServicesRegistrator?.Register(_container, options); _container.Initialize(); var commandFactory = _servicesProvider.GetService <ITelegramBotCommandFactory>(); commandFactory.Initialize(); AppConfig.Configure(this); var clientManager = _servicesProvider.GetService <ITelegramBotClientManager>(); clientManager.Token = AppConfig.Token; clientManager.Initialize(); }
/// <summary> /// /// </summary> /// <param name="servicesContainer"></param> /// <param name="options"></param> public void Register(ITelegramBotServicesContainer servicesContainer, TelegramBotOptions options) { servicesContainer.AddSingleton(() => options.ServicesProvider); servicesContainer.AddSingleton <ITelegramBotClientManager, TelegramBotClientManager>(); servicesContainer.AddSingleton <ITelegramBotMessageHandlerManager, TelegramBotMessageHandlerManager>(); servicesContainer.AddSingleton <ITelegramBotMessageHandler, TelegramBotMessageHandler>(); servicesContainer.AddSingleton <ITelegramBotCommandFactory, TelegramBotCommandFactory>(); servicesContainer.AddSingleton <ITelegramBotCommandFactoryInitializer, TelegramBotCommandFactoryInitializer>(); servicesContainer.AddSingleton <ITelegramBotCallbackQueryHandler, TelegramBotCallbackQueryHandler>(); servicesContainer.AddSingleton <ITelegramBotMessageEditedHandler, TelegramBotMessageEditedHandler>(); servicesContainer.AddSingleton <ITelegramBotInlineQueryHandler, TelegramBotInlineQueryHandler>(); servicesContainer.AddSingleton <ICommandMessageExceptionHandler, CommandMessageExceptionHandler>(); servicesContainer.AddTransient <ITelegramBotCommandName, TelegramBotCommandName>(); servicesContainer.AddTransient <ITelegramBotCommandRole, TelegramBotCommandRole>(); servicesContainer.AddTransient <InlineKeyboardButtonBuilder, InlineKeyboardButtonBuilder>(); servicesContainer.AddTransient <KeyboardButtonBuilder, KeyboardButtonBuilder>(); servicesContainer.AddScoped <ITelegramBotUserService, TelegramBotUserService>(); servicesContainer.AddScoped <ITelegramBotMessageService, TelegramBotMessageService>(); servicesContainer.AddScoped <ITelegramBotCallbackQueryService, TelegramBotCallbackQueryService>(); servicesContainer.AddScoped <ITelegramBotCommandActivator, TelegramBotCommandActivator>(); servicesContainer.AddScoped <ITelegramBotUnknownMessageService, TelegramBotUnknownMessageService>(); TelegramBotAutoDIManager.Register(servicesContainer); }
/// <summary> /// /// </summary> /// <param name="type"></param> /// <param name="servicesContainer"></param> private static void RegisterSingletonService(Type type, ITelegramBotServicesContainer servicesContainer) { var interfaces = type.GetInterfaces().ToList(); var baseType = type.BaseType; interfaces.ForEach(f => servicesContainer.AddSingleton(f, type)); if (baseType != typeof(object)) { servicesContainer.AddSingleton(baseType, type); } servicesContainer.AddSingleton(type, type); }
/// <summary> /// /// </summary> /// <param name="servicesContainer"></param> public static void Register(ITelegramBotServicesContainer servicesContainer) { var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var types = assemblies .SelectMany(s => s.GetTypes()) .Where(w => w.IsClass && !w.IsAbstract && !w.IsSealed && w.GetCustomAttribute <BotServiceAttribute>() != null) .ToList(); types.ForEach(f => RegisterService(f, servicesContainer)); }
/// <summary> /// /// </summary> /// <param name="type"></param> /// <param name="servicesContainer"></param> private static void RegisterService(Type type, ITelegramBotServicesContainer servicesContainer) { var attr = type.GetCustomAttribute <BotServiceAttribute>(); if (attr.LifeCycle == BotServiceLifeCycle.Scoped) { RegisterScopedService(type, servicesContainer); return; } if (attr.LifeCycle == BotServiceLifeCycle.Singleton) { RegisterSingletonService(type, servicesContainer); return; } if (attr.LifeCycle == BotServiceLifeCycle.Transient) { RegisterTransientService(type, servicesContainer); return; } }