From 4f3cbbd9fdaf7ffa38700b429b193297807a3a18 Mon Sep 17 00:00:00 2001 From: 1SooNoo1 Date: Mon, 4 Dec 2023 23:10:17 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B5=D1=81=D1=82=D1=8C=20=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectExcavator/AppSettings.json | 20 +++++ .../ExcavatorNotFoundException.cs | 19 +++++ .../ExcavatorsGenericStorage.cs | 22 ++++-- .../FormExcavatorCollection.cs | 79 +++++++++++++------ ProjectExcavator/ProjectExcavator/Program.cs | 32 +++++++- .../ProjectExcavator/ProjectExcavator.csproj | 9 +++ .../StorageOverflowException.cs | 19 +++++ 7 files changed, 169 insertions(+), 31 deletions(-) create mode 100644 ProjectExcavator/ProjectExcavator/AppSettings.json create mode 100644 ProjectExcavator/ProjectExcavator/ExcavatorNotFoundException.cs create mode 100644 ProjectExcavator/ProjectExcavator/StorageOverflowException.cs diff --git a/ProjectExcavator/ProjectExcavator/AppSettings.json b/ProjectExcavator/ProjectExcavator/AppSettings.json new file mode 100644 index 0000000..9dcd410 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/AppSettings.json @@ -0,0 +1,20 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "Logs/log_.log", + "rollingInterval": "Day", + "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], + "Properties": { + "Application": "Excavator" + } + } +} \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/ExcavatorNotFoundException.cs b/ProjectExcavator/ProjectExcavator/ExcavatorNotFoundException.cs new file mode 100644 index 0000000..8369ca1 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/ExcavatorNotFoundException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.Serialization; + +namespace ProjectExcavator.Exceptions +{ + [Serializable] + internal class ExcavatorNotFoundException : ApplicationException + { + public ExcavatorNotFoundException(int i) : base ($"Не найден объект по позиции {i}"){ } + public ExcavatorNotFoundException():base() { } + public ExcavatorNotFoundException(string message) : base(message) { } + public ExcavatorNotFoundException(string message,Exception exception): base(message,exception) { } + protected ExcavatorNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/ProjectExcavator/ProjectExcavator/ExcavatorsGenericStorage.cs b/ProjectExcavator/ProjectExcavator/ExcavatorsGenericStorage.cs index a35b5c7..66baf3c 100644 --- a/ProjectExcavator/ProjectExcavator/ExcavatorsGenericStorage.cs +++ b/ProjectExcavator/ProjectExcavator/ExcavatorsGenericStorage.cs @@ -58,7 +58,7 @@ namespace ProjectExcavator.Generic /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (File.Exists(filename)) { @@ -76,27 +76,34 @@ namespace ProjectExcavator.Generic storageString += $"{excavator?.GetDataForSave(_separatorForObject)}{_separatorRecords}"; } sw.WriteLine($"{storage.Key}{_separatorForKeyValue}{storageString}"); + if (storageString.Length == 0) + { + throw new InvalidOperationException("Невалидная операция, нет данных для сохранения"); + } } } - return true; } /// /// Загрузка информации по автомобилям в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не найден"); } using (StreamReader sr = new StreamReader(filename)) { string? currentLine = sr.ReadLine(); - if (currentLine == null || !currentLine.Contains("ExcavatorStorage")) + if (currentLine == null) { - return false; + throw new NullReferenceException("Нет данных для загрузки"); + } + if (!currentLine.Contains("ExcavatorStorage")) + { + throw new FormatException("Неверный формат данных"); } _excavatorStorages.Clear(); currentLine = sr.ReadLine(); @@ -116,14 +123,13 @@ namespace ProjectExcavator.Generic { if (collection + excavator == -1) { - return false; + throw new ApplicationException("Ошибка добавления в коллекцию"); } } } _excavatorStorages.Add(record[0], collection); currentLine = sr.ReadLine(); } - return true; } } /// diff --git a/ProjectExcavator/ProjectExcavator/FormExcavatorCollection.cs b/ProjectExcavator/ProjectExcavator/FormExcavatorCollection.cs index 695af45..00cc04a 100644 --- a/ProjectExcavator/ProjectExcavator/FormExcavatorCollection.cs +++ b/ProjectExcavator/ProjectExcavator/FormExcavatorCollection.cs @@ -10,6 +10,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using Microsoft.Extensions.Logging; +using ProjectExcavator.Exceptions; namespace ProjectExcavator { @@ -19,11 +21,13 @@ namespace ProjectExcavator /// Набор объектов /// private readonly ExcavatorsGenericStorage _storage; - public FormExcavatorCollection() + private readonly ILogger _logger; + public FormExcavatorCollection(ILogger logger) { InitializeComponent(); _storage = new ExcavatorsGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); + _logger = logger; } /// /// Заполнение listBoxObjects @@ -51,11 +55,13 @@ pictureBoxCollection.Height); { if (string.IsNullOrEmpty(textBoxStorageName.Text)) { + _logger.LogWarning($"Обновление набора не удалось (не все данные заполнены)"); MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _storage.AddSet(textBoxStorageName.Text); + _logger.LogInformation($"Добавлен набор: {textBoxStorageName.Text} "); ReloadObjects(); } /// @@ -88,28 +94,39 @@ pictureBoxCollection.Height); { if (listBoxStorages.SelectedIndex == -1) { + _logger.LogWarning($"Добавление не удалось (индекс вне границ)"); return; } var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; if (obj == null) { + _logger.LogWarning($"Добавление не удалось (нет хранилища)"); return; } - if ((obj + excavator) != -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBoxCollection.Image = obj.ShowExcavator(); - } - else + if ((obj + excavator) != -1) + { + MessageBox.Show("Объект добавлен"); + _logger.LogInformation($"Добавление успешно {listBoxStorages.SelectedItem.ToString()}"); + pictureBoxCollection.Image = obj.ShowExcavator(); + } + else + { + MessageBox.Show("Объект добавить не удалось"); + } + }catch(ApplicationException ex) { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show(ex.Message); } + } private void buttonAddExcavator_Click(object sender, EventArgs e) { if (listBoxStorages.SelectedIndex == -1) { + _logger.LogWarning($"Добавление не удалось (индекс вне границ)"); return; } var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; @@ -118,36 +135,49 @@ pictureBoxCollection.Height); return; } FormExcavatorConfig form = new FormExcavatorConfig(); - form.Show(); form.AddEvent(AddExcavator); + form.Show(); } private void buttonRemoveExcavator_Click(object sender, EventArgs e) { if (listBoxStorages.SelectedIndex == -1) { + _logger.LogInformation($"Удаление не удалось (индекс вне границ)"); return; } var obj = _storage[listBoxStorages.SelectedItem.ToString() ?? string.Empty]; if (obj == null) { + _logger.LogWarning($"Удаление не удалось (нет хранилища)"); return; } if (MessageBox.Show("Удалить объект?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { + _logger.LogWarning($"Удаление не удалось (выбран вариант 'Нет')"); return; } int pos = Convert.ToInt32(maskedTextBoxNumber.Text); - if (obj - pos != null) + try { - MessageBox.Show("Объект удален"); - pictureBoxCollection.Image = obj.ShowExcavator(); + if (obj - pos != null) + { + _logger.LogInformation($"Удаление успешно {listBoxStorages.SelectedItem.ToString()} {pos}"); + MessageBox.Show("Объект удален"); + pictureBoxCollection.Image = obj.ShowExcavator(); + } + else + { + _logger.LogWarning($"Удаление не удалось(обьект не найден)"); + MessageBox.Show("Не удалось удалить объект"); + } } - else + catch(ExcavatorNotFoundException ex) { - MessageBox.Show("Не удалось удалить объект"); + _logger.LogWarning($"Удаление не удалось {ex.Message}"); + MessageBox.Show(ex.Message); } } private void RefreshCollection() @@ -178,14 +208,16 @@ pictureBoxCollection.Height); { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.SaveData(saveFileDialog.FileName)) + try { - MessageBox.Show("Сохранение прошло успешно", - "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _storage.SaveData(saveFileDialog.FileName); + _logger.LogInformation($"Cохранение успешно"); + MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } - else + catch(Exception ex) { - MessageBox.Show("Не сохранилось", "Результат",MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Не сохранилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning($"Сохранение не удалось {ex.Message}"); } } } @@ -198,15 +230,18 @@ pictureBoxCollection.Height); { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.LoadData(openFileDialog.FileName)) + try { + _storage.LoadData(openFileDialog.FileName); ReloadObjects(); RefreshCollection(); - MessageBox.Show("Загрузка прошла успешно","Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation($"Загрузка успешна"); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } - else + catch (Exception ex) { - MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogInformation($"Загрузка успешна"); } } ReloadObjects(); diff --git a/ProjectExcavator/ProjectExcavator/Program.cs b/ProjectExcavator/ProjectExcavator/Program.cs index 8be0f08..ecb8e51 100644 --- a/ProjectExcavator/ProjectExcavator/Program.cs +++ b/ProjectExcavator/ProjectExcavator/Program.cs @@ -1,3 +1,11 @@ +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using Serilog; +using Serilog.Extensions.Logging; +using Serilog.Settings.Configuration; + namespace ProjectExcavator { internal static class Program @@ -11,7 +19,29 @@ namespace ProjectExcavator // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormExcavatorCollection()); + var services = new ServiceCollection(); + ConfigureServices(services); + using (ServiceProvider serviceProvider = services.BuildServiceProvider()) + { + Application.Run(serviceProvider.GetRequiredService()); + } + } + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton().AddLogging(option => + { + string[] path = Directory.GetCurrentDirectory().Split('\\'); + string pathNeed = ""; + for (int i = 0; i < path.Length - 3; i++) + { + pathNeed += path[i] + "\\"; + } + var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(path: $"{pathNeed}appsettings.json", optional: false, reloadOnChange: true).Build(); + var logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); + + option.SetMinimumLevel(LogLevel.Information); + option.AddSerilog(logger); + }); } } } \ No newline at end of file diff --git a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj index 13ee123..4ad86a3 100644 --- a/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj +++ b/ProjectExcavator/ProjectExcavator/ProjectExcavator.csproj @@ -8,6 +8,15 @@ enable + + + + + + + + + True diff --git a/ProjectExcavator/ProjectExcavator/StorageOverflowException.cs b/ProjectExcavator/ProjectExcavator/StorageOverflowException.cs new file mode 100644 index 0000000..a4fab48 --- /dev/null +++ b/ProjectExcavator/ProjectExcavator/StorageOverflowException.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.Serialization; + +namespace ProjectExcavator.Exceptions +{ + [Serializable] + internal class StorageOverflowException: ApplicationException + { + public StorageOverflowException(int count): base($"В наборе превышено допустимое количество: {count}") { } + public StorageOverflowException():base() { } + public StorageOverflowException(string message):base(message) { } + public StorageOverflowException(string message, Exception exception) : base(message, exception) { } + protected StorageOverflowException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +}