diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs index 9a18fb5..d1516da 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.Designer.cs @@ -81,7 +81,6 @@ buttonDeleteSet.TabIndex = 2; buttonDeleteSet.Text = "Удалить набор"; buttonDeleteSet.UseVisualStyleBackColor = true; - buttonDeleteSet.Click += buttonDeleteSet_Click; // // listBoxStorages // @@ -101,7 +100,6 @@ buttonAddSet.TabIndex = 0; buttonAddSet.Text = "Добавить набор"; buttonAddSet.UseVisualStyleBackColor = true; - buttonAddSet.Click += buttonAddSet_Click; // // maskedTextBoxNumber // diff --git a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs index 049c631..384b88a 100644 --- a/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs +++ b/ElectricLocomotive/ElectricLocomotive/FormLocomotiveCollection.cs @@ -8,19 +8,24 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using ElectricLocomotive; +using Microsoft.Extensions.Logging; using ProjectElectricLocomotive.DrawingObjects; +using ProjectElectricLocomotive.Exceptions; using ProjectElectricLocomotive.Generics; using ProjectElectricLocomotive.MovementStrategy; + namespace ProjectElectricLocomotive { public partial class FormLocomotiveCollection : Form { private readonly LocomotivesGenericStorage _storage; - public FormLocomotiveCollection() + private readonly ILogger _logger; + public FormLocomotiveCollection(ILogger logger) { InitializeComponent(); _storage = new LocomotivesGenericStorage(pictureBoxCollection.Width, pictureBoxCollection.Height); + _logger = logger; } private void ReloadObjects() { @@ -40,6 +45,19 @@ namespace ProjectElectricLocomotive listBoxStorages.SelectedIndex = index; } } + private void ButtonAddObject_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxSetName.Text)) + { + MessageBox.Show("Не всё заполнено", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogWarning("Неудачная попытка. Коллекция не добавлена, не все данные заполнены"); + return; + } + _storage.AddSet(textBoxSetName.Text); + ReloadObjects(); + + _logger.LogInformation($"Добавлен набор: {textBoxSetName.Text}"); + } private void buttonAddLocomotive_Click(object sender, EventArgs e) { var formLocomotiveConfig = new FormLocomotiveConfig(); @@ -58,18 +76,40 @@ namespace ProjectElectricLocomotive { return; } - - //проверяем, удалось ли нам загрузить объект - if (obj + loco > -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBoxCollection.Image = obj.ShowLocomotives(); + if (obj + loco > -1) + { + MessageBox.Show("Объект добавлен"); + pictureBoxCollection.Image = obj.ShowLocomotives(); + _logger.LogInformation($"Добавлен объект {obj}"); + } + else + { + MessageBox.Show("Не удалось добавить объект"); + } } - else + catch (StorageOverflowException ex) { - MessageBox.Show("Не удалось добавить объект"); + MessageBox.Show(ex.Message); } } + private void ButtonRemoveObject_Click(object sender, EventArgs e) + { + if (listBoxStorages.SelectedIndex == -1) + { + return; + } + string name = listBoxStorages.SelectedItem.ToString() ?? string.Empty; + if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + _storage.DelSet(name); + ReloadObjects(); + _logger.LogInformation($"Набор '{name}' удален"); + } + _logger.LogWarning("Отмена удаления набора"); + } private void buttonRemoveLocomotive_Click(object sender, EventArgs e) { if (listBoxStorages.SelectedIndex == -1) return; @@ -81,18 +121,28 @@ namespace ProjectElectricLocomotive 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.ShowLocomotives(); - pictureBoxCollection.Image = obj.ShowLocomotives(); + var removeObj = obj - pos; + if (removeObj != null) + { + MessageBox.Show("Объект удален"); + _logger.LogInformation($"Удален объект с позиции{pos}"); + pictureBoxCollection.Image = obj.ShowLocomotives(); + } + else + { + MessageBox.Show("Не удалось удалить объект"); + } } - else + catch (LocomotiveNotFoundException ex) { - MessageBox.Show("Не удалось удалить объект"); + MessageBox.Show(ex.Message); + _logger.LogWarning($"Не найден объект по позиции: {obj}"); } } private void buttonRefreshCollection_Click(object sender, EventArgs e) @@ -109,68 +159,36 @@ namespace ProjectElectricLocomotive { pictureBoxCollection.Image = _storage[listBoxStorages.SelectedItem?.ToString() ?? string.Empty]?.ShowLocomotives(); } - private void buttonAddSet_Click(object sender, EventArgs e) - { - if (string.IsNullOrEmpty(textBoxSetName.Text)) - { - MessageBox.Show("Не всё заполнено", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - return; - } - _storage.AddSet(textBoxSetName.Text); - ReloadObjects(); - } - private void buttonDeleteSet_Click(object sender, EventArgs e) - { - if (listBoxStorages.SelectedIndex == -1) - { - return; - } - if (MessageBox.Show($"Удалить объект {listBoxStorages.SelectedItem}?", "Удаление", MessageBoxButtons.YesNo, - MessageBoxIcon.Question) == DialogResult.Yes) - { - _storage.DelSet(listBoxStorages.SelectedItem.ToString() ?? string.Empty); - ReloadObjects(); - } - } - /// - /// Обработка нажатия "Сохранение" - /// - /// - /// private void SaveToolStripMenuItem_Click(object sender, EventArgs e) { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.SaveData(saveFileDialog.FileName)) + try { - MessageBox.Show("Сохранение прошло успешно!", - "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _storage.SaveData(saveFileDialog.FileName); + _logger.LogInformation($"Данные загружены в файл {saveFileDialog.FileName}"); } - else + catch (Exception ex) { - MessageBox.Show("Ошибка сохранения!", "Результат", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show($"Не сохранилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogWarning($"Не удалось сохранить информацию в файл: {ex.Message}"); } } } - /// - /// Обработка нажатия "Загрузка" - /// - /// - /// private void LoadToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storage.LoadData(openFileDialog.FileName)) + try { - MessageBox.Show("Загрузка завершена!", "Result", MessageBoxButtons.OK, MessageBoxIcon.Information); + _storage.LoadData(openFileDialog.FileName); + _logger.LogInformation($"Данные загружены из файла {openFileDialog.FileName}"); ReloadObjects(); } - else + catch (Exception ex) { - MessageBox.Show("Ошибка загрузки!", "Result", MessageBoxButtons.OK, MessageBoxIcon.Error); - + MessageBox.Show($"Не загрузилось: {ex.Message}", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogWarning($"Не удалось загрузить информацию из файла: {ex.Message}"); } } } diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotiveNotFoundException.cs b/ElectricLocomotive/ElectricLocomotive/LocomotiveNotFoundException.cs new file mode 100644 index 0000000..230006c --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/LocomotiveNotFoundException.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 ProjectElectricLocomotive.Exceptions +{ + [Serializable] + internal class LocomotiveNotFoundException : ApplicationException + { + public LocomotiveNotFoundException(int i) : base($"Не найден объект по позиции {i}") { } + public LocomotiveNotFoundException() : base() { } + public LocomotiveNotFoundException(string message) : base(message) { } + public LocomotiveNotFoundException(string message, Exception exception) : base(message, exception) { } + protected LocomotiveNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } + } +} \ No newline at end of file diff --git a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs index 0c46d87..6ddc96b 100644 --- a/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs +++ b/ElectricLocomotive/ElectricLocomotive/LocomotivesGenericStorage.cs @@ -10,48 +10,22 @@ namespace ProjectElectricLocomotive.Generics { internal class LocomotivesGenericStorage { - /// - /// Словарь (хранилище) - /// readonly Dictionary> _locomotivesStorage; - - /// - /// Возвращение списка названий наборов - /// public List Keys => _locomotivesStorage.Keys.ToList(); - /// - /// Разделитель для записи ключа и значения элемента словаря - /// private static readonly char _separatorForKeyValue = '|'; - /// - /// Разделитель для записей коллекции данных в файл - /// private readonly char _separatorRecords = ';'; - /// - /// Разделитель для записи информации по объекту в файл - /// private static readonly char _separatorForObject = ':'; private readonly int _pictureWidth; - private readonly int _pictureHeight; - /// - /// Конструктор - /// - /// - /// public LocomotivesGenericStorage(int pictureWidth, int pictureHeight) { _locomotivesStorage = new Dictionary>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } - /// - /// Добавление набора - /// - /// Название набора public void AddSet(string name) { if (!_locomotivesStorage.ContainsKey(name)) @@ -59,11 +33,6 @@ namespace ProjectElectricLocomotive.Generics _locomotivesStorage.Add(name, new LocomotivesGenericCollection(_pictureWidth, _pictureHeight)); } } - - /// - /// Удаление набора - /// - /// Название набора public void DelSet(string name) { if (_locomotivesStorage.ContainsKey(name)) @@ -71,13 +40,6 @@ namespace ProjectElectricLocomotive.Generics _locomotivesStorage.Remove(name); } } - - - /// - /// Доступ к набору - /// - /// - /// public LocomotivesGenericCollection? this[string ind] { @@ -90,12 +52,7 @@ namespace ProjectElectricLocomotive.Generics return null; } } - /// - /// Сохранение информации по автомобилям в хранилище в файл - /// - /// Путь и имя файла - /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (File.Exists(filename)) { @@ -113,25 +70,20 @@ namespace ProjectElectricLocomotive.Generics } if (data.Length == 0) { - return false; + throw new Exception("Нет данных для записи, ошибка"); } using StreamWriter fs = new StreamWriter(filename); { fs.WriteLine($"LocomotiveStorage{Environment.NewLine}"); fs.WriteLine(data); } - return true; + return; } - /// - /// Загрузка информации по автомобилям в хранилище из файла - /// - /// Путь и имя файла - /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new FileNotFoundException("Файл не найден"); } using (StreamReader fs = File.OpenText(filename)) @@ -141,13 +93,13 @@ namespace ProjectElectricLocomotive.Generics if (str == null || str.Length == 0) { - return false; + throw new IOException("Нет данных для загрузки"); } if (!str.StartsWith("LocomotiveStorage")) { //если нет такой записи, то это не те данные - return false; + throw new FileFormatException("Неверный формат данных"); } _locomotivesStorage.Clear(); @@ -159,7 +111,7 @@ namespace ProjectElectricLocomotive.Generics if (strs == null) { - return false; + throw new FileNotFoundException("Нет данных для загрузки"); } string[] record = strs.Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); @@ -174,15 +126,15 @@ namespace ProjectElectricLocomotive.Generics DrawingLocomotive? loco = elem?.CreateDrawningLocomotive(_separatorForObject, _pictureWidth, _pictureHeight); if (loco != null) { - if ((collection + loco) == -1) + if ((collection + loco) == -1) // for my realization it's -1, for eegov's realization it's boolean { - return false; + throw new Exception("Ошибка добавления "); } } } _locomotivesStorage.Add(record[0], collection); } - return true; + return; } } } diff --git a/ElectricLocomotive/ElectricLocomotive/Program.cs b/ElectricLocomotive/ElectricLocomotive/Program.cs index e7d6cc3..aeb5c42 100644 --- a/ElectricLocomotive/ElectricLocomotive/Program.cs +++ b/ElectricLocomotive/ElectricLocomotive/Program.cs @@ -1,5 +1,9 @@ using ProjectElectricLocomotive; -using System.Drawing; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Serilog; + namespace ElectricLocomotive { @@ -8,8 +12,32 @@ namespace ElectricLocomotive [STAThread] static void Main() { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - Application.Run(new FormLocomotiveCollection()); + 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/ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj b/ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj index 13ee123..7900f0b 100644 --- a/ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj +++ b/ElectricLocomotive/ElectricLocomotive/ProjectElectricLocomotive.csproj @@ -8,6 +8,17 @@ enable + + + + + + + + + + + True diff --git a/ElectricLocomotive/ElectricLocomotive/StorageOverflowException.cs b/ElectricLocomotive/ElectricLocomotive/StorageOverflowException.cs new file mode 100644 index 0000000..b855f64 --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/StorageOverflowException.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.Serialization; + + +namespace ProjectElectricLocomotive +{ + [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 contex) : base(info, contex) { } + } +} diff --git a/ElectricLocomotive/ElectricLocomotive/appsettings.json b/ElectricLocomotive/ElectricLocomotive/appsettings.json new file mode 100644 index 0000000..5df1c9c --- /dev/null +++ b/ElectricLocomotive/ElectricLocomotive/appsettings.json @@ -0,0 +1,20 @@ +{ + "Serilog": { + "Using": [ "Serilog.Sinks.File" ], + "MinimumLevel": "Information", + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "log_.log", + "rollingInterval": "Day", + "outputTemplate": "[{Timestamp:HH:mm:ss.fff}]{Level:u4}: {Message:lj}{NewLine}{Exception}" + } + } + ], + "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ], + "Properties": { + "Application": "Locomotives" + } + } +} \ No newline at end of file