Добавил DI, основные классы создаются через вбрасывание зависимостей через конструктор

This commit is contained in:
ftc
2024-01-20 16:56:44 +03:00
parent 77d563d500
commit 2a8348df44
7 changed files with 75 additions and 24 deletions
+4 -3
View File
@@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Args;
using Telegram.Bot.Types.ReplyMarkups;
using ZaoBot.Config;
namespace ZaoBot
{
@@ -20,15 +21,15 @@ namespace ZaoBot
bool shouldRestart = false;
public BotService(JsonDocument config)
public BotService(IConfig config, OpenHab.OpenHabClient openhab)
{
this.config = config;
this.config = config.Data;
this.openhab = openhab;
}
public void Run()
{
var token = config.RootElement.GetProperty("token").GetString();
openhab = new OpenHab.OpenHabClient(config.RootElement.GetProperty("openhab_url").GetString());
while (true)
{
shouldRestart = false;
+3 -2
View File
@@ -5,6 +5,7 @@ using System.Text;
using System.Text.Json;
using System.Threading;
using Telegram.Bot;
using ZaoBot.Config;
namespace ZaoBot
{
@@ -12,9 +13,9 @@ namespace ZaoBot
{
private JsonDocument config;
public NotificationReceiver(JsonDocument config)
public NotificationReceiver(IConfig config)
{
this.config = config;
this.config = config.Data;
}
public void Run()
+4 -4
View File
@@ -5,19 +5,19 @@ using System.Net.Http.Headers;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using ZaoBot.Config;
namespace ZaoBot.OpenHab
{
class OpenHabClient
{
private string url;
private string token;
private string token = "";
HttpClient http = new HttpClient();
public OpenHabClient(string url, string token = "")
public OpenHabClient(IConfig config)
{
this.url = url;
this.token = token;
this.url = config.Data.RootElement.GetProperty("openhab_url").GetString();
if (!string.IsNullOrEmpty(token))
{
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token + ":");
+33 -15
View File
@@ -1,9 +1,12 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text.Json;
using System.Threading;
using ZaoBot.Config;
using ZaoBot.OpenHab;
namespace ZaoBot
{
@@ -12,30 +15,45 @@ namespace ZaoBot
static BotService bot;
static JsonDocument config;
static ServiceCollection services;
static void Main(string[] args)
{
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
config = LoadConfig();
var receiver = new NotificationReceiver(config);
var notificationThread = new Thread(new ThreadStart(receiver.Run));
notificationThread.Start();
while (true)
services = new ServiceCollection();
services.AddSingleton<IConfig, Config.Config>(CreateConfig);
services.AddSingleton<BotService, BotService>();
services.AddSingleton<OpenHabClient, OpenHabClient>();
services.AddSingleton<NotificationReceiver, NotificationReceiver>();
using (var provider = services.BuildServiceProvider())
{
try
var receiver = provider.GetRequiredService<NotificationReceiver>();
var notificationThread = new Thread(new ThreadStart(receiver.Run));
notificationThread.Start();
while (true)
{
bot = new BotService(config);
bot.Run();
}
catch (Exception e)
{
// Тут ловим всё, при ошибках просто заново поднимаем бота
Console.WriteLine("Exception: " + e.Message);
Console.WriteLine(e.StackTrace);
Console.WriteLine("Restarting bot");
try
{
bot = provider.GetRequiredService<BotService>();
bot.Run();
}
catch (Exception e)
{
// Тут ловим всё, при ошибках просто заново поднимаем бота
Console.WriteLine("Exception: " + e.Message);
Console.WriteLine(e.StackTrace);
Console.WriteLine("Restarting bot");
}
}
}
}
private static Config.Config CreateConfig(IServiceProvider arg)
{
return new Config.Config(config);
}
private static JsonDocument LoadConfig()
{
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+1
View File
@@ -6,6 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Telegram.Bot" Version="19.0.0" />
</ItemGroup>
+18
View File
@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
namespace ZaoBot.Config
{
public class Config : IConfig
{
JsonDocument data;
public JsonDocument Data => data;
public Config(JsonDocument data)
{
this.data = data;
}
}
}
+12
View File
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
namespace ZaoBot.Config
{
interface IConfig
{
JsonDocument Data { get; }
}
}