From 44fa88599e431f7d06e8f25f5b449bb1b3893d6f Mon Sep 17 00:00:00 2001 From: Arkadiy Radaev Date: Fri, 17 May 2024 13:28:57 +0400 Subject: [PATCH 1/4] res8 --- .gitignore | 6 + .../BusinessLogics/BackUpLogic.cs | 101 ++++++++++++++ .../MailWorker/AbstractMailWorker.cs | 2 - .../Attributes/ColumnAttribute.cs | 26 ++++ .../Attributes/GridViewAutoSize.cs | 21 +++ .../BindingModels/BackUpSaveBinidngModel.cs | 7 + .../BindingModels/MessageInfoBindingModel.cs | 2 + .../BusinessLogicsContracts/IBackUpLogic.cs | 9 ++ .../GiftShopContracts/DI/DependencyManager.cs | 41 ++++++ .../DI/IDependencyContainer.cs | 12 ++ .../DI/IImplementationExtension.cs | 8 ++ .../DI/ServiceDependencyContainer.cs | 59 ++++++++ .../DI/ServiceProviderLoader.cs | 51 +++++++ .../DI/UnityDependencyContainer.cs | 38 ++++++ .../GiftShopContracts.csproj | 9 ++ .../StoragesContracts/IBackUpInfo.cs | 10 ++ .../ViewModels/ClientViewModel.cs | 18 +-- .../ViewModels/ComponentViewModel.cs | 15 ++- .../ViewModels/GiftViewModel.cs | 18 +-- .../ViewModels/ImplementerViewModel.cs | 12 +- .../ViewModels/MessageInfoViewModel.cs | 16 ++- .../ViewModels/OrderViewModel.cs | 55 ++++---- .../Models/IMessageInfoModel.cs | 2 +- .../DatabaseImplementationExtension.cs | 23 ++++ .../GiftShopDatabaseImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 29 ++++ .../Implements/MessageInfoStorage.cs | 2 +- .../Models/Client.cs | 8 +- .../Models/Component.cs | 13 +- .../GiftShopDatabaseImplement/Models/Gift.cs | 23 +++- .../Models/Implementer.cs | 7 + .../Models/Message.cs | 19 ++- .../GiftShopDatabaseImplement/Models/Order.cs | 36 +++-- .../FileImplementationExtension.cs | 22 +++ .../GiftShopFileImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 32 +++++ .../GiftShopFileImplement/Models/Client.cs | 22 +-- .../GiftShopFileImplement/Models/Component.cs | 15 ++- GiftShop/GiftShopFileImplement/Models/Gift.cs | 16 ++- .../Models/Implementer.cs | 7 + .../GiftShopFileImplement/Models/Message.cs | 9 ++ .../GiftShopFileImplement/Models/Order.cs | 126 ++++++++++-------- .../GiftShopListImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 17 +++ .../ListImplementationExtension.cs | 23 ++++ .../GiftShopListImplement/Models/Message.cs | 2 + .../GiftShopView/DataGridViewExtension.cs | 47 +++++++ GiftShop/GiftShopView/FormClients.cs | 29 ++-- GiftShop/GiftShopView/FormComponents.cs | 73 ++++------ GiftShop/GiftShopView/FormGift.cs | 86 ++++++------ GiftShop/GiftShopView/FormGifts.cs | 72 +++++----- GiftShop/GiftShopView/FormImplementers.cs | 32 ++--- GiftShop/GiftShopView/FormMails.cs | 31 ++--- GiftShop/GiftShopView/FormMain.Designer.cs | 71 ++++++---- GiftShop/GiftShopView/FormMain.cs | 102 +++++++------- GiftShop/GiftShopView/FormMain.resx | 62 ++++++++- GiftShop/GiftShopView/Program.cs | 112 ++++++++-------- 57 files changed, 1222 insertions(+), 496 deletions(-) create mode 100644 GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs create mode 100644 GiftShop/GiftShopContracts/Attributes/ColumnAttribute.cs create mode 100644 GiftShop/GiftShopContracts/Attributes/GridViewAutoSize.cs create mode 100644 GiftShop/GiftShopContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 GiftShop/GiftShopContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 GiftShop/GiftShopContracts/DI/DependencyManager.cs create mode 100644 GiftShop/GiftShopContracts/DI/IDependencyContainer.cs create mode 100644 GiftShop/GiftShopContracts/DI/IImplementationExtension.cs create mode 100644 GiftShop/GiftShopContracts/DI/ServiceDependencyContainer.cs create mode 100644 GiftShop/GiftShopContracts/DI/ServiceProviderLoader.cs create mode 100644 GiftShop/GiftShopContracts/DI/UnityDependencyContainer.cs create mode 100644 GiftShop/GiftShopContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 GiftShop/GiftShopDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 GiftShop/GiftShopDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 GiftShop/GiftShopFileImplement/FileImplementationExtension.cs create mode 100644 GiftShop/GiftShopFileImplement/Implements/BackUpInfo.cs create mode 100644 GiftShop/GiftShopListImplement/Implements/BackUpInfo.cs create mode 100644 GiftShop/GiftShopListImplement/ListImplementationExtension.cs create mode 100644 GiftShop/GiftShopView/DataGridViewExtension.cs diff --git a/.gitignore b/.gitignore index ca1c7a3..4b81048 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,12 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# dll файлы +*.dll + +/GiftShop/ImplementationExtensions + + # Mono auto generated files mono_crash.* diff --git a/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs b/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..d27699f --- /dev/null +++ b/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,101 @@ +using GiftShopContracts.BindingModels; +using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.StoragesContracts; +using GiftShopDataModels; +using Microsoft.Extensions.Logging; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.Serialization.Json; + +namespace GiftShopBusinessLogic.BusinessLogics +{ + public class BackUpLogic : IBackUpLogic + { + private readonly ILogger _logger; + + private readonly IBackUpInfo _backUpInfo; + + public BackUpLogic(ILogger logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + + public void CreateBackUp(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + try + { + _logger.LogDebug("Clear folder"); + // зачистка папки и удаление старого архива + var dirInfo = new DirectoryInfo(model.FolderName); + if (dirInfo.Exists) + { + foreach (var file in dirInfo.GetFiles()) + { + file.Delete(); + } + } + _logger.LogDebug("Delete archive"); + string fileName = $"{model.FolderName}.zip"; + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + // берем метод для сохранения + _logger.LogDebug("Get assembly"); + var typeIId = typeof(IId); + var assembly = typeIId.Assembly; + if (assembly == null) + { + throw new ArgumentNullException("Сборка не найдена", + nameof(assembly)); + } + var types = assembly.GetTypes(); + var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance); + _logger.LogDebug("Find {count} types", types.Length); + foreach (var type in types) + { + if (type.IsInterface && type.GetInterface(typeIId.Name) != null) + { + var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); + if (modelType == null) + { + throw new InvalidOperationException($"Не найден класс - модель для {type.Name}"); + } + _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); + // вызываем метод на выполнение + method?.MakeGenericMethod(modelType).Invoke(this, new + object[] { model.FolderName }); + } + } + _logger.LogDebug("Create zip and remove folder"); + // архивируем + ZipFile.CreateFromDirectory(model.FolderName, fileName); + // удаляем папку + dirInfo.Delete(true); + } + catch (Exception) + { + throw; + } + } + + private void SaveToFile(string folderName) where T : class, new() + { + var records = _backUpInfo.GetList(); + if (records == null) + { + _logger.LogWarning("{type} type get null list", typeof(T).Name); + return; + } + var jsonFormatter = new DataContractJsonSerializer(typeof(List)); + using var fs = new FileStream(string.Format("{0}/{1}.json", + folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } +} diff --git a/GiftShop/GiftShopBusinessLogic/MailWorker/AbstractMailWorker.cs b/GiftShop/GiftShopBusinessLogic/MailWorker/AbstractMailWorker.cs index c432c93..fc9d57b 100644 --- a/GiftShop/GiftShopBusinessLogic/MailWorker/AbstractMailWorker.cs +++ b/GiftShop/GiftShopBusinessLogic/MailWorker/AbstractMailWorker.cs @@ -94,7 +94,5 @@ namespace GiftShopBusinessLogic.MailWorker protected abstract Task SendMailAsync(MailSendInfoBindingModel info); protected abstract Task> ReceiveMailAsync(); - - } } diff --git a/GiftShop/GiftShopContracts/Attributes/ColumnAttribute.cs b/GiftShop/GiftShopContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..d2207a7 --- /dev/null +++ b/GiftShop/GiftShopContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +namespace GiftShopContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public ColumnAttribute(string title = "", bool visible = true, int width = 0, + GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + public string Title { get; private set; } + + public bool Visible { get; private set; } + + public int Width { get; private set; } + + public GridViewAutoSize GridViewAutoSize { get; private set; } + + public bool IsUseAutoSize { get; private set; } + } + +} diff --git a/GiftShop/GiftShopContracts/Attributes/GridViewAutoSize.cs b/GiftShop/GiftShopContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..da5c10c --- /dev/null +++ b/GiftShop/GiftShopContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,21 @@ +namespace GiftShopContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} diff --git a/GiftShop/GiftShopContracts/BindingModels/BackUpSaveBinidngModel.cs b/GiftShop/GiftShopContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..9bfd6e2 --- /dev/null +++ b/GiftShop/GiftShopContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,7 @@ +namespace GiftShopContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/GiftShop/GiftShopContracts/BindingModels/MessageInfoBindingModel.cs b/GiftShop/GiftShopContracts/BindingModels/MessageInfoBindingModel.cs index 3b00ebd..36f9834 100644 --- a/GiftShop/GiftShopContracts/BindingModels/MessageInfoBindingModel.cs +++ b/GiftShop/GiftShopContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,7 @@ namespace GiftShopContracts.BindingModels public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } + + public int Id => throw new NotImplementedException(); } } diff --git a/GiftShop/GiftShopContracts/BusinessLogicsContracts/IBackUpLogic.cs b/GiftShop/GiftShopContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..c0d3941 --- /dev/null +++ b/GiftShop/GiftShopContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,9 @@ +using GiftShopContracts.BindingModels; + +namespace GiftShopContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/GiftShop/GiftShopContracts/DI/DependencyManager.cs b/GiftShop/GiftShopContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..2862b68 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/DependencyManager.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.Logging; + +namespace GiftShopContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + private static DependencyManager? _manager; + private static readonly object _locjObject = new(); + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + public static DependencyManager Instance + { + get + { + if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } + return _manager; + } + } + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + + public T Resolve() => _dependencyManager.Resolve(); + } + +} diff --git a/GiftShop/GiftShopContracts/DI/IDependencyContainer.cs b/GiftShop/GiftShopContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..d7b75e4 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/IDependencyContainer.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.Logging; + +namespace GiftShopContracts.DI +{ + public interface IDependencyContainer + { + void AddLogging(Action configure); + void RegisterType(bool isSingle) where U : class, T where T : class; + void RegisterType(bool isSingle) where T : class; + T Resolve(); + } +} diff --git a/GiftShop/GiftShopContracts/DI/IImplementationExtension.cs b/GiftShop/GiftShopContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..e72ad8d --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/IImplementationExtension.cs @@ -0,0 +1,8 @@ +namespace GiftShopContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + public void RegisterServices(); + } +} diff --git a/GiftShop/GiftShopContracts/DI/ServiceDependencyContainer.cs b/GiftShop/GiftShopContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..57aeeab --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,59 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace GiftShopContracts.DI +{ + public class ServiceDependencyContainer : IDependencyContainer + { + private ServiceProvider? _serviceProvider; + private readonly ServiceCollection _serviceCollection; + + public ServiceDependencyContainer() + { + _serviceCollection = new ServiceCollection(); + } + + public void AddLogging(Action configure) + { + _serviceCollection.AddLogging(configure); + } + + public void RegisterType(bool isSingle) where U : class, T where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + + _serviceProvider = null; + } + + public void RegisterType(bool isSingle) where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + + _serviceProvider = null; + } + + public T Resolve() + { + if (_serviceProvider == null) + { + _serviceProvider = _serviceCollection.BuildServiceProvider(); + } + + return _serviceProvider.GetService()!; + } + } +} diff --git a/GiftShop/GiftShopContracts/DI/ServiceProviderLoader.cs b/GiftShop/GiftShopContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..c70f697 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,51 @@ +using System.Reflection; + +namespace GiftShopContracts.DI +{ + + public static partial class ServiceProviderLoader + { + + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + return source; + } + private static string TryGetImplementationExtensionsFolder() + { + var directory = new + DirectoryInfo(Directory.GetCurrentDirectory()); + while (directory != null && + !directory.GetDirectories("ImplementationExtensions", + SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } + +} diff --git a/GiftShop/GiftShopContracts/DI/UnityDependencyContainer.cs b/GiftShop/GiftShopContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..6079b45 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.Logging; +using Unity; +using Unity.Microsoft.Logging; + +namespace GiftShopContracts.DI +{ + public class UnityDependencyContainer : IDependencyContainer + { + private readonly IUnityContainer _container; + + public UnityDependencyContainer() + { + _container = new UnityContainer(); + } + + public void AddLogging(Action configure) + { + var factory = LoggerFactory.Create(configure); + _container.AddExtension(new LoggingExtension(factory)); + } + + public void RegisterType(bool isSingle) where T : class + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + + } + + public T Resolve() + { + return _container.Resolve(); + } + + void IDependencyContainer.RegisterType(bool isSingle) + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + } + } +} diff --git a/GiftShop/GiftShopContracts/GiftShopContracts.csproj b/GiftShop/GiftShopContracts/GiftShopContracts.csproj index 1d12326..571ccc1 100644 --- a/GiftShop/GiftShopContracts/GiftShopContracts.csproj +++ b/GiftShop/GiftShopContracts/GiftShopContracts.csproj @@ -8,10 +8,19 @@ + + + + + + + + + diff --git a/GiftShop/GiftShopContracts/StoragesContracts/IBackUpInfo.cs b/GiftShop/GiftShopContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..329539e --- /dev/null +++ b/GiftShop/GiftShopContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,10 @@ +namespace GiftShopContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + + Type? GetTypeByModelInterface(string modelInterfaceName); + } + +} diff --git a/GiftShop/GiftShopContracts/ViewModels/ClientViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/ClientViewModel.cs index 9a7cc20..da94740 100644 --- a/GiftShop/GiftShopContracts/ViewModels/ClientViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/ClientViewModel.cs @@ -1,19 +1,21 @@ -using GiftShopDataModels.Models; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class ClientViewModel : IClientModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] - public string Email { get; set; } = string.Empty; + [Column("Логин (эл. почта)", width: 150)] + public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; } } diff --git a/GiftShop/GiftShopContracts/ViewModels/ComponentViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/ComponentViewModel.cs index 5cd0840..c06e3ec 100644 --- a/GiftShop/GiftShopContracts/ViewModels/ComponentViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/ComponentViewModel.cs @@ -1,17 +1,18 @@ -using GiftShopDataModels.Models; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; + [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - - public double Cost { get; set; } + [Column("Цена", width: 80)] + public double Cost { get; set; } } } diff --git a/GiftShop/GiftShopContracts/ViewModels/GiftViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/GiftViewModel.cs index deaa759..2f3a374 100644 --- a/GiftShop/GiftShopContracts/ViewModels/GiftViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/GiftViewModel.cs @@ -1,19 +1,21 @@ -using GiftShopDataModels.Models; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class GiftViewModel : IGiftModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("Название изделия")] - public string GiftName { get; set; } = string.Empty; + [Column("Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string GiftName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column("Цена", width: 100)] + public double Price { get; set; } - public double Price { get; set; } - - public Dictionary GiftComponents { get; set; } = new(); + [Column(visible: false)] + public Dictionary GiftComponents { get; set; } = new(); } } diff --git a/GiftShop/GiftShopContracts/ViewModels/ImplementerViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/ImplementerViewModel.cs index 0b246a6..75f0010 100644 --- a/GiftShop/GiftShopContracts/ViewModels/ImplementerViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/ImplementerViewModel.cs @@ -1,22 +1,24 @@ -using GiftShopDataModels.Models; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column("Пароль", width: 150)] public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] + [Column("Стаж работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int WorkExperience { get; set; } - [DisplayName("Квалификация")] + [Column("Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int Qualification { get; set; } } } diff --git a/GiftShop/GiftShopContracts/ViewModels/MessageInfoViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/MessageInfoViewModel.cs index 56547bc..130cb76 100644 --- a/GiftShop/GiftShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/MessageInfoViewModel.cs @@ -1,24 +1,30 @@ -using GiftShopDataModels.Models; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Имя отправителя")] + [Column("Имя отправителя", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата отправления")] + [Column("Дата отправления", width: 100)] public DateTime DateDelivery { get; set; } - [DisplayName("Тема")] + [Column("Тема", width: 150)] public string Subject { get; set; } = string.Empty; - [DisplayName("Содержание")] + [Column("Содержание", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; + + [Column(visible: false)] + public int Id => throw new NotImplementedException(); } } diff --git a/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs b/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs index 2296592..21da9d7 100644 --- a/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs @@ -1,49 +1,46 @@ -using GiftShopDataModels.Enums; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Enums; using GiftShopDataModels.Models; using System.ComponentModel; namespace GiftShopContracts.ViewModels { public class OrderViewModel : IOrderModel - { - [DisplayName("Номер")] - public int Id { get; set; } - - public int GiftId { get; set; } + { + [Column(visible: false)] + public int GiftId { get; set; } + [Column(visible: false)] public int ClientId { get; set; } - public int? ImplementerId { get; set; } + [Column(visible: false)] + public int? ImplementerId { get; set; } - [DisplayName("Изделие")] + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } - public string GiftName { get; set; } = string.Empty; + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("Название изделия", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string GiftName { get; set; } = string.Empty; - [DisplayName("Клиент")] + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Количество")] + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } - public int Count { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } - [DisplayName("Сумма")] + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - public double Sum { get; set; } + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Статус")] - - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - - [DisplayName("Дата создания")] - - public DateTime DateCreate { get; set; } = DateTime.Now; - - - [DisplayName("Дата выполнения")] - - public DateTime? DateImplement { get; set; } - } + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } + } } diff --git a/GiftShop/GiftShopDataModels/Models/IMessageInfoModel.cs b/GiftShop/GiftShopDataModels/Models/IMessageInfoModel.cs index 06e4789..c386147 100644 --- a/GiftShop/GiftShopDataModels/Models/IMessageInfoModel.cs +++ b/GiftShop/GiftShopDataModels/Models/IMessageInfoModel.cs @@ -1,6 +1,6 @@ namespace GiftShopDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } diff --git a/GiftShop/GiftShopDatabaseImplement/DatabaseImplementationExtension.cs b/GiftShop/GiftShopDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..9a34f10 --- /dev/null +++ b/GiftShop/GiftShopDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,23 @@ +using GiftShopContracts.DI; +using GiftShopContracts.StoragesContracts; +using GiftShopDatabaseImplement.Implements; + +namespace GiftShopDatabaseImplement +{ + public class DatabaseImplementationExtension : IImplementationExtension + { + public int Priority => 2; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + + } +} diff --git a/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj b/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj index 3ad2062..2537900 100644 --- a/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj +++ b/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj @@ -21,4 +21,8 @@ + + + + diff --git a/GiftShop/GiftShopDatabaseImplement/Implements/BackUpInfo.cs b/GiftShop/GiftShopDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..d0d8ecc --- /dev/null +++ b/GiftShop/GiftShopDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,29 @@ +using GiftShopContracts.StoragesContracts; + +namespace GiftShopDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new GiftShopDatabase(); + return context.Set().ToList(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && + type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } + +} diff --git a/GiftShop/GiftShopDatabaseImplement/Implements/MessageInfoStorage.cs b/GiftShop/GiftShopDatabaseImplement/Implements/MessageInfoStorage.cs index 27f5e98..3e503cf 100644 --- a/GiftShop/GiftShopDatabaseImplement/Implements/MessageInfoStorage.cs +++ b/GiftShop/GiftShopDatabaseImplement/Implements/MessageInfoStorage.cs @@ -39,7 +39,7 @@ namespace GiftShopDatabaseImplement.Implements public MessageInfoViewModel? Insert(MessageInfoBindingModel model) { using var context = new GiftShopDatabase(); - var newMessage = Message.Create(context, model); + var newMessage = Message.Create(model,context); if (newMessage == null || context.Messages.Any(x => x.MessageId.Equals(model.MessageId))) { return null; diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Client.cs b/GiftShop/GiftShopDatabaseImplement/Models/Client.cs index ff1dd36..3a9f7a4 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Client.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Client.cs @@ -3,23 +3,27 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { + [DataContract] public class Client : IClientModel { + [DataMember] public int Id { get; private set; } [Required] + [DataMember] public string ClientFIO { get; set; } = string.Empty; [Required] + [DataMember] public string Email { get; set; } = string.Empty; [Required] + [DataMember] public string Password { get; set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); - [ForeignKey("ClientId")] - public virtual List ClientMessages { get; set; } = new(); public static Client? Create(ClientBindingModel model) { if (model == null) diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Component.cs b/GiftShop/GiftShopDatabaseImplement/Models/Component.cs index 20022c7..9e21c4c 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Component.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Component.cs @@ -3,18 +3,23 @@ using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using GiftShopContracts.ViewModels; using GiftShopContracts.BindingModels; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { - public class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public string ComponentName { get; private set; } = string.Empty; [Required] - public double Cost { get; set; } + [DataMember] + public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List GiftComponents { get; set; } = new(); diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs b/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs index 388cf2f..f6286ba 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs @@ -3,23 +3,32 @@ using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { - public class Gift : IGiftModel + [DataContract] + public class Gift : IGiftModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } [Required] - public string GiftName { get; set; } = string.Empty; + [DataMember] + public string GiftName { get; set; } = string.Empty; [Required] - public double Price { get; set; } + [DataMember] + public double Price { get; set; } private Dictionary? _giftComponents = null; - - [NotMapped] - public Dictionary GiftComponents + + [ForeignKey("ClientId")] + public virtual List ClientMessages { get; set; } = new(); + + [NotMapped] + [DataMember] + public Dictionary GiftComponents { get { diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Implementer.cs b/GiftShop/GiftShopDatabaseImplement/Models/Implementer.cs index f4ac6a2..f5a8ae7 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Implementer.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Implementer.cs @@ -3,23 +3,30 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { [Required] + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; [Required] + [DataMember] public string Password { get; private set; } = string.Empty; [Required] + [DataMember] public int WorkExperience { get; private set; } [Required] + [DataMember] public int Qualification { get; private set; } + [DataMember] public int Id { get; private set; } [ForeignKey("ImplementerId")] diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Message.cs b/GiftShop/GiftShopDatabaseImplement/Models/Message.cs index 6e6a0eb..b8df282 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Message.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Message.cs @@ -2,28 +2,41 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { + [DataContract] public class Message : IMessageInfoModel { [Key] - [DatabaseGenerated(DatabaseGeneratedOption.None)] + [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [Required] + [DataMember] public string SenderName { get; private set; } = string.Empty; + [Required] + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [Required] + [DataMember] public string Subject { get; private set; } = string.Empty; + [Required] + [DataMember] public string Body { get; private set; } = string.Empty; public Client? Client { get; private set; } - public static Message? Create(GiftShopDatabase context, MessageInfoBindingModel model) + + public int Id => throw new NotImplementedException(); + + public static Message? Create(MessageInfoBindingModel model, GiftShopDatabase context) { if (model == null) { diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Order.cs b/GiftShop/GiftShopDatabaseImplement/Models/Order.cs index eb7145a..140c931 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Order.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Order.cs @@ -3,39 +3,52 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Enums; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel - { + { + [DataMember] public int Id { get; private set; } + [DataMember] public int GiftId { get; private set; } [Required] + [DataMember] public int ClientId { get; set; } + [DataMember] public int? ImplementerId { get; private set; } + [DataMember] public string GiftName { get; private set; } = string.Empty; + [DataMember] [Required] - public int Count { get; private set; } + public int Count { get; private set; } + [DataMember] [Required] - public double Sum { get; private set; } + public double Sum { get; private set; } + [DataMember] [Required] - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] [Required] - public DateTime DateCreate { get; private set; } = DateTime.Now; + public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] public DateTime? DateImplement { get; private set; } - public virtual Gift Gift { get; set; } + public virtual Gift Gift { get; set; } public Client Client { get; set; } + public Implementer? Implementer { get; set; } public static Order? Create(OrderBindingModel? model, GiftShopDatabase context) @@ -65,12 +78,11 @@ namespace GiftShopDatabaseImplement.Models } public void Update(OrderBindingModel? model) - { - if (model == null) - { - return; + { + if (model == null) + { + return; } - Status = model.Status; DateImplement = model.DateImplement; ImplementerId = model.ImplementerId; @@ -99,4 +111,4 @@ namespace GiftShopDatabaseImplement.Models } } } -} \ No newline at end of file +} diff --git a/GiftShop/GiftShopFileImplement/FileImplementationExtension.cs b/GiftShop/GiftShopFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..48c4d2d --- /dev/null +++ b/GiftShop/GiftShopFileImplement/FileImplementationExtension.cs @@ -0,0 +1,22 @@ +using GiftShopContracts.DI; +using GiftShopContracts.StoragesContracts; +using GiftShopFileImplement.Implements; +using System; +namespace GiftShopFileImplement +{ + public class FileImplementationExtension : IImplementationExtension + { + public int Priority => 1; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj b/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj index ec26524..53f864e 100644 --- a/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj +++ b/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/GiftShop/GiftShopFileImplement/Implements/BackUpInfo.cs b/GiftShop/GiftShopFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..a1d2384 --- /dev/null +++ b/GiftShop/GiftShopFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using GiftShopContracts.StoragesContracts; + +namespace GiftShopFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + var source = DataFileSingleton.GetInstance(); + + return (List?)source.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T)) + ?.GetValue(source); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + + return null; + } + } +} diff --git a/GiftShop/GiftShopFileImplement/Models/Client.cs b/GiftShop/GiftShopFileImplement/Models/Client.cs index 6fa2c4a..74e1be9 100644 --- a/GiftShop/GiftShopFileImplement/Models/Client.cs +++ b/GiftShop/GiftShopFileImplement/Models/Client.cs @@ -1,19 +1,25 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; private set; } - - public string ClientFIO { get; private set; } = string.Empty; - - public string Email { get; set; } = string.Empty; - - public string Password { get; set; } = string.Empty; + [DataMember] + public int Id { get; private set; } + + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; + + [DataMember] + public string Email { get; set; } = string.Empty; + + [DataMember] + public string Password { get; set; } = string.Empty; public static Client? Create(ClientBindingModel model) { diff --git a/GiftShop/GiftShopFileImplement/Models/Component.cs b/GiftShop/GiftShopFileImplement/Models/Component.cs index 7197228..b5fa464 100644 --- a/GiftShop/GiftShopFileImplement/Models/Component.cs +++ b/GiftShop/GiftShopFileImplement/Models/Component.cs @@ -1,17 +1,22 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { - internal class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { - public int Id { get; private set; } - - public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public int Id { get; private set; } - public double Cost { get; set; } + [DataMember] + public string ComponentName { get; private set; } = string.Empty; + + [DataMember] + public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { diff --git a/GiftShop/GiftShopFileImplement/Models/Gift.cs b/GiftShop/GiftShopFileImplement/Models/Gift.cs index 34f3373..20a0910 100644 --- a/GiftShop/GiftShopFileImplement/Models/Gift.cs +++ b/GiftShop/GiftShopFileImplement/Models/Gift.cs @@ -1,23 +1,29 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { - internal class Gift : IGiftModel + [DataContract] + public class Gift : IGiftModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } - public string GiftName { get; private set; } = string.Empty; + [DataMember] + public string GiftName { get; private set; } = string.Empty; - public double Price { get; private set; } + [DataMember] + public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _giftComponents = null; - public Dictionary GiftComponents + [DataMember] + public Dictionary GiftComponents { get { diff --git a/GiftShop/GiftShopFileImplement/Models/Implementer.cs b/GiftShop/GiftShopFileImplement/Models/Implementer.cs index 64cdca2..6451652 100644 --- a/GiftShop/GiftShopFileImplement/Models/Implementer.cs +++ b/GiftShop/GiftShopFileImplement/Models/Implementer.cs @@ -1,20 +1,27 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] public string Password { get; private set; } = string.Empty; + [DataMember] public int WorkExperience { get; private set; } + [DataMember] public int Qualification { get; private set; } + [DataMember] public int Id { get; private set; } public static Implementer? Create(XElement element) diff --git a/GiftShop/GiftShopFileImplement/Models/Message.cs b/GiftShop/GiftShopFileImplement/Models/Message.cs index f45793b..3fac815 100644 --- a/GiftShop/GiftShopFileImplement/Models/Message.cs +++ b/GiftShop/GiftShopFileImplement/Models/Message.cs @@ -1,22 +1,30 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { + [DataContract] public class Message : IMessageInfoModel { + [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] public string SenderName { get; private set; } = string.Empty; + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] public string Subject { get; private set; } = string.Empty; + [DataMember] public string Body { get; private set; } = string.Empty; public static Message? Create(MessageInfoBindingModel model) { @@ -70,5 +78,6 @@ namespace GiftShopFileImplement.Models new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) ); + public int Id => throw new NotImplementedException(); } } diff --git a/GiftShop/GiftShopFileImplement/Models/Order.cs b/GiftShop/GiftShopFileImplement/Models/Order.cs index ccf3083..5f6cba7 100644 --- a/GiftShop/GiftShopFileImplement/Models/Order.cs +++ b/GiftShop/GiftShopFileImplement/Models/Order.cs @@ -2,31 +2,43 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Enums; using GiftShopDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace GiftShopFileImplement.Models { - internal class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { - public int GiftId { get; private set; } + [DataMember] + public int GiftId { get; private set; } - public int? ImplementerId { get; set; } + [DataMember] + public int? ImplementerId { get; set; } - public int ClientId { get; private set; } + [DataMember] + public int ClientId { get; private set; } - public string GiftName { get; private set; } = string.Empty; + [DataMember] + public string GiftName { get; private set; } = string.Empty; - public int Count { get; private set; } + [DataMember] + public int Count { get; private set; } - public double Sum { get; private set; } + [DataMember] + public double Sum { get; private set; } - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] + public DateTime DateCreate { get; private set; } = DateTime.Now; - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime? DateImplement { get; private set; } - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } public static Order? Create(OrderBindingModel? model) { @@ -38,11 +50,11 @@ namespace GiftShopFileImplement.Models { Id = model.Id, GiftId = model.GiftId, - GiftName = model.GiftName, - Count = model.Count, - ClientId = model.ClientId, - ImplementerId = model.ImplementerId, - Sum = model.Sum, + GiftName = model.GiftName, + Count = model.Count, + ClientId = model.ClientId, + ImplementerId = model.ImplementerId, + Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, DateImplement = model.DateImplement @@ -56,22 +68,26 @@ namespace GiftShopFileImplement.Models return null; } var order = new Order() - { - Id = Convert.ToInt32(element.Attribute("Id")!.Value), - GiftId = Convert.ToInt32(element.Element("GiftId")!.Value), - GiftName = element.Element("GiftName")!.Value, - Count = Convert.ToInt32(element.Element("Count")!.Value), - Sum = Convert.ToDouble(element.Element("Sum")!.Value), - ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.Value), - ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), - Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), - DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null) - }; + { + Id = Convert.ToInt32(element.Attribute("Id")!.Value), + GiftId = Convert.ToInt32(element.Element("GiftId")!.Value), + ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), + Count = Convert.ToInt32(element.Element("Count")!.Value), + Sum = Convert.ToDouble(element.Element("Sum")!.Value), + Status = (OrderStatus)Convert.ToInt32(element.Element("Status")!.Value), + DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null), + }; DateTime.TryParse(element.Element("DateImplement")!.Value, out DateTime dateImpl); order.DateImplement = dateImpl; - return order; + if (!Enum.TryParse(element.Element("Status")!.Value, out OrderStatus status)) + { + return null; + } + order.Status = status; + + return order; } public void Update(OrderBindingModel? model) @@ -79,35 +95,35 @@ namespace GiftShopFileImplement.Models if (model == null) { return; - } - Status = model.Status; - DateImplement = model.DateImplement; - } + } + Status = model.Status; + DateImplement = model.DateImplement; + } public OrderViewModel GetViewModel => new() - { - Id = Id, - GiftId = GiftId, - ClientId = ClientId, - ImplementerId = ImplementerId, - GiftName = GiftName, - Count = Count, - Sum = Sum, - Status = Status, - DateCreate = DateCreate, - DateImplement = DateImplement - }; + { + Id = Id, + GiftId = GiftId, + ClientId = ClientId, + ImplementerId = ImplementerId, + GiftName = GiftName, + Count = Count, + Sum = Sum, + Status = Status, + DateCreate = DateCreate, + DateImplement = DateImplement + }; public XElement GetXElement => new("Order", - new XAttribute("Id", Id), - new XElement("GiftName", GiftName), - new XElement("GiftId", GiftId.ToString()), - new XElement("ClientId", ClientId.ToString()), - new XElement("ImplementerId", ImplementerId.ToString()), - new XElement("Count", Count.ToString()), - new XElement("Sum", Sum.ToString()), - new XElement("Status", Status.ToString()), - new XElement("DateCreate", DateCreate.ToString()), - new XElement("DateImplement", DateImplement.ToString())); - } + new XAttribute("Id", Id), + new XElement("GiftName", GiftName), + new XElement("GiftId", GiftId.ToString()), + new XElement("ClientId", ClientId.ToString()), + new XElement("ImplementerId", ImplementerId.ToString()), + new XElement("Count", Count.ToString()), + new XElement("Sum", Sum.ToString()), + new XElement("Status", Status.ToString()), + new XElement("DateCreate", DateCreate.ToString()), + new XElement("DateImplement", DateImplement.ToString())); + } } diff --git a/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj b/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj index ec26524..53f864e 100644 --- a/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj +++ b/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/GiftShop/GiftShopListImplement/Implements/BackUpInfo.cs b/GiftShop/GiftShopListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..0483ee6 --- /dev/null +++ b/GiftShop/GiftShopListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,17 @@ +using GiftShopContracts.StoragesContracts; + +namespace GiftShopListImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + throw new NotImplementedException(); + } + + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + throw new NotImplementedException(); + } + } +} diff --git a/GiftShop/GiftShopListImplement/ListImplementationExtension.cs b/GiftShop/GiftShopListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..94b7e3f --- /dev/null +++ b/GiftShop/GiftShopListImplement/ListImplementationExtension.cs @@ -0,0 +1,23 @@ +using GiftShopContracts.DI; +using GiftShopContracts.StoragesContracts; +using GiftShopListImplement.Implements; + +namespace GiftShopListImplement +{ + public class ListImplementationExtension : IImplementationExtension + { + public int Priority => 0; + + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } + +} diff --git a/GiftShop/GiftShopListImplement/Models/Message.cs b/GiftShop/GiftShopListImplement/Models/Message.cs index a5e90d1..5382111 100644 --- a/GiftShop/GiftShopListImplement/Models/Message.cs +++ b/GiftShop/GiftShopListImplement/Models/Message.cs @@ -44,5 +44,7 @@ namespace GiftShopListImplement.Models ClientId = ClientId, MessageId = MessageId }; + + public int Id => throw new NotImplementedException(); } } diff --git a/GiftShop/GiftShopView/DataGridViewExtension.cs b/GiftShop/GiftShopView/DataGridViewExtension.cs new file mode 100644 index 0000000..72ff91d --- /dev/null +++ b/GiftShop/GiftShopView/DataGridViewExtension.cs @@ -0,0 +1,47 @@ +using GiftShopContracts.Attributes; + +namespace GiftShopView +{ + public static class DataGridViewExtension + { + public static void FillandConfigGrid(this DataGridView grid, List? data) + { + if (data == null) + { + return; + } + grid.DataSource = data; + + var type = typeof(T); + var properties = type.GetProperties(); + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем {column.Name}"); + } + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства {property.Name}"); + } + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum + .Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} diff --git a/GiftShop/GiftShopView/FormClients.cs b/GiftShop/GiftShopView/FormClients.cs index a45eb6e..bda09e4 100644 --- a/GiftShop/GiftShopView/FormClients.cs +++ b/GiftShop/GiftShopView/FormClients.cs @@ -24,23 +24,18 @@ namespace GiftShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки клиентов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + try + { + dataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); + + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки клиентов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } private void ButtonDel_Click(object sender, EventArgs e) { diff --git a/GiftShop/GiftShopView/FormComponents.cs b/GiftShop/GiftShopView/FormComponents.cs index 9e1d88e..f5ac6dd 100644 --- a/GiftShop/GiftShopView/FormComponents.cs +++ b/GiftShop/GiftShopView/FormComponents.cs @@ -1,5 +1,6 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using Microsoft.Extensions.Logging; namespace GiftShopView @@ -24,56 +25,40 @@ namespace GiftShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки компонентов"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } + try + { + dataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка компонентов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки компонентов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = - Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } private void ButtonUpd_Click(object sender, EventArgs e) { - if (dataGridView.SelectedRows.Count == 1) - { - var service = - Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - form.Id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - } + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } private void ButtonDel_Click(object sender, EventArgs e) { diff --git a/GiftShop/GiftShopView/FormGift.cs b/GiftShop/GiftShopView/FormGift.cs index 3a65c6f..2215c88 100644 --- a/GiftShop/GiftShopView/FormGift.cs +++ b/GiftShop/GiftShopView/FormGift.cs @@ -1,5 +1,6 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using GiftShopContracts.SearchModels; using GiftShopDataModels.Models; using Microsoft.Extensions.Logging; @@ -79,54 +80,49 @@ namespace GiftShopView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormGiftComponent)); - if (service is FormGiftComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - if (_giftComponents.ContainsKey(form.Id)) - { - _giftComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _giftComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Добавление нового компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); + if (_giftComponents.ContainsKey(form.Id)) + { + _giftComponents[form.Id] = (form.ComponentModel, form.Count); + } + else + { + _giftComponents.Add(form.Id, (form.ComponentModel, form.Count)); + } + LoadData(); + } + } private void ButtonUpd_Click(object sender, EventArgs e) { - if (dataGridView.SelectedRows.Count == 1) - { - var service = - Program.ServiceProvider?.GetService(typeof(FormGiftComponent)); - if (service is FormGiftComponent form) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _giftComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _giftComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _giftComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Изменение компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); + _giftComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); + } + + } + } private void ButtonDel_Click(object sender, EventArgs e) { diff --git a/GiftShop/GiftShopView/FormGifts.cs b/GiftShop/GiftShopView/FormGifts.cs index 5067af1..1ec75dd 100644 --- a/GiftShop/GiftShopView/FormGifts.cs +++ b/GiftShop/GiftShopView/FormGifts.cs @@ -1,7 +1,9 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using Microsoft.Extensions.Logging; + namespace GiftShopView { public partial class FormGifts : Form @@ -24,53 +26,43 @@ namespace GiftShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["GiftName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["GiftComponents"].Visible = false; - } - _logger.LogInformation("Загрузка изделий"); + try + { + dataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка изделий"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки изделий"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); - } - } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки изделий"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormGift)); - if (service is FormGift form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } private void ButtonUpd_Click(object sender, EventArgs e) { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormGift)); - if (service is FormGift form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } - } + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + + } + } private void ButtonDel_Click(object sender, EventArgs e) { diff --git a/GiftShop/GiftShopView/FormImplementers.cs b/GiftShop/GiftShopView/FormImplementers.cs index fc88be4..0b073ae 100644 --- a/GiftShop/GiftShopView/FormImplementers.cs +++ b/GiftShop/GiftShopView/FormImplementers.cs @@ -1,6 +1,7 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; +using GiftShopContracts.DI; namespace GiftShopView { @@ -17,14 +18,11 @@ namespace GiftShopView private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + var form = DependencyManager.Instance.Resolve(); - if (service is FormImplementer form) + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -32,14 +30,11 @@ namespace GiftShopView { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } @@ -89,18 +84,9 @@ namespace GiftShopView { try { - var list = _logic.ReadList(null); - - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - + DataGridView.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка исполнителей"); } - catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки исполнителей"); diff --git a/GiftShop/GiftShopView/FormMails.cs b/GiftShop/GiftShopView/FormMails.cs index 9c7a2e8..bf1eac7 100644 --- a/GiftShop/GiftShopView/FormMails.cs +++ b/GiftShop/GiftShopView/FormMails.cs @@ -17,25 +17,18 @@ namespace GiftShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка писем"); - } - catch (Exception ex) - { - _logger.LogError(ex, "Ошибка загрузки писем"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); - } - } + try + { + dataGridView.FillandConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка писем"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки писем"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } private void FormMails_Load(object sender, EventArgs e) { diff --git a/GiftShop/GiftShopView/FormMain.Designer.cs b/GiftShop/GiftShopView/FormMain.Designer.cs index a874af5..d6e2b25 100644 --- a/GiftShop/GiftShopView/FormMain.Designer.cs +++ b/GiftShop/GiftShopView/FormMain.Designer.cs @@ -39,11 +39,12 @@ компонентыПоИзделиямToolStripMenuItem = new ToolStripMenuItem(); списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); запускРаботToolStripMenuItem = new ToolStripMenuItem(); + письмаToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); buttonCreateOrder = new Button(); buttonIssuedOrder = new Button(); buttonRef = new Button(); - письмаToolStripMenuItem = new ToolStripMenuItem(); + создатьБэкапToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -51,10 +52,11 @@ // menuStrip // menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускРаботToolStripMenuItem, письмаToolStripMenuItem }); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускРаботToolStripMenuItem, письмаToolStripMenuItem, создатьБэкапToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(1367, 28); + menuStrip.Padding = new Padding(8, 2, 0, 2); + menuStrip.Size = new Size(1709, 33); menuStrip.TabIndex = 0; menuStrip.Text = "menuStrip1"; // @@ -62,34 +64,34 @@ // справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, изделияToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; - справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Size = new Size(139, 29); справочникиToolStripMenuItem.Text = "Справочники"; // // компонентыToolStripMenuItem // компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(185, 26); + компонентыToolStripMenuItem.Size = new Size(220, 34); компонентыToolStripMenuItem.Text = "Компоненты"; компонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // // изделияToolStripMenuItem // изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; - изделияToolStripMenuItem.Size = new Size(185, 26); + изделияToolStripMenuItem.Size = new Size(220, 34); изделияToolStripMenuItem.Text = "Изделия"; изделияToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; // // клиентыToolStripMenuItem // клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(185, 26); + клиентыToolStripMenuItem.Size = new Size(220, 34); клиентыToolStripMenuItem.Text = "Клиенты"; клиентыToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; // // исполнителиToolStripMenuItem // исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(185, 26); + исполнителиToolStripMenuItem.Size = new Size(220, 34); исполнителиToolStripMenuItem.Text = "Исполнители"; исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; // @@ -97,53 +99,62 @@ // отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокКомпонентовToolStripMenuItem, компонентыПоИзделиямToolStripMenuItem, списокЗаказовToolStripMenuItem }); отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; - отчётыToolStripMenuItem.Size = new Size(73, 24); + отчётыToolStripMenuItem.Size = new Size(88, 29); отчётыToolStripMenuItem.Text = "Отчёты"; // // списокКомпонентовToolStripMenuItem // списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem"; - списокКомпонентовToolStripMenuItem.Size = new Size(276, 26); + списокКомпонентовToolStripMenuItem.Size = new Size(327, 34); списокКомпонентовToolStripMenuItem.Text = "Список компонентов"; списокКомпонентовToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click; // // компонентыПоИзделиямToolStripMenuItem // компонентыПоИзделиямToolStripMenuItem.Name = "компонентыПоИзделиямToolStripMenuItem"; - компонентыПоИзделиямToolStripMenuItem.Size = new Size(276, 26); + компонентыПоИзделиямToolStripMenuItem.Size = new Size(327, 34); компонентыПоИзделиямToolStripMenuItem.Text = "Компоненты по изделиям"; компонентыПоИзделиямToolStripMenuItem.Click += ComponentGiftsToolStripMenuItem_Click; // // списокЗаказовToolStripMenuItem // списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; - списокЗаказовToolStripMenuItem.Size = new Size(276, 26); + списокЗаказовToolStripMenuItem.Size = new Size(327, 34); списокЗаказовToolStripMenuItem.Text = "Список заказов"; списокЗаказовToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; // // запускРаботToolStripMenuItem // запускРаботToolStripMenuItem.Name = "запускРаботToolStripMenuItem"; - запускРаботToolStripMenuItem.Size = new Size(114, 24); + запускРаботToolStripMenuItem.Size = new Size(136, 29); запускРаботToolStripMenuItem.Text = "Запуск работ"; запускРаботToolStripMenuItem.Click += запускРаботToolStripMenuItem_Click; // + // письмаToolStripMenuItem + // + письмаToolStripMenuItem.Name = "письмаToolStripMenuItem"; + письмаToolStripMenuItem.Size = new Size(90, 29); + письмаToolStripMenuItem.Text = "Письма"; + письмаToolStripMenuItem.Click += письмаToolStripMenuItem_Click; + // // dataGridView // dataGridView.BackgroundColor = SystemColors.ControlLightLight; dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(12, 41); + dataGridView.Location = new Point(15, 51); + dataGridView.Margin = new Padding(4, 4, 4, 4); dataGridView.Name = "dataGridView"; dataGridView.RowHeadersWidth = 51; dataGridView.RowTemplate.Height = 29; - dataGridView.Size = new Size(1123, 423); + dataGridView.Size = new Size(1404, 529); dataGridView.TabIndex = 1; // // buttonCreateOrder // - buttonCreateOrder.Location = new Point(1155, 90); + buttonCreateOrder.Location = new Point(1444, 112); + buttonCreateOrder.Margin = new Padding(4, 4, 4, 4); buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(189, 57); + buttonCreateOrder.Size = new Size(236, 71); buttonCreateOrder.TabIndex = 2; buttonCreateOrder.Text = "Создать заказ"; buttonCreateOrder.UseVisualStyleBackColor = true; @@ -151,9 +162,10 @@ // // buttonIssuedOrder // - buttonIssuedOrder.Location = new Point(1155, 228); + buttonIssuedOrder.Location = new Point(1444, 285); + buttonIssuedOrder.Margin = new Padding(4, 4, 4, 4); buttonIssuedOrder.Name = "buttonIssuedOrder"; - buttonIssuedOrder.Size = new Size(189, 57); + buttonIssuedOrder.Size = new Size(236, 71); buttonIssuedOrder.TabIndex = 5; buttonIssuedOrder.Text = "Заказ выдан"; buttonIssuedOrder.UseVisualStyleBackColor = true; @@ -161,32 +173,34 @@ // // buttonRef // - buttonRef.Location = new Point(1155, 356); + buttonRef.Location = new Point(1444, 445); + buttonRef.Margin = new Padding(4, 4, 4, 4); buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(189, 57); + buttonRef.Size = new Size(236, 71); buttonRef.TabIndex = 6; buttonRef.Text = "Обновить список"; buttonRef.UseVisualStyleBackColor = true; buttonRef.Click += ButtonRef_Click; // - // письмаToolStripMenuItem + // создатьБэкапToolStripMenuItem // - письмаToolStripMenuItem.Name = "письмаToolStripMenuItem"; - письмаToolStripMenuItem.Size = new Size(77, 24); - письмаToolStripMenuItem.Text = "Письма"; - письмаToolStripMenuItem.Click += письмаToolStripMenuItem_Click; + создатьБэкапToolStripMenuItem.Name = "создатьБэкапToolStripMenuItem"; + создатьБэкапToolStripMenuItem.Size = new Size(145, 29); + создатьБэкапToolStripMenuItem.Text = "Создать бекап"; + создатьБэкапToolStripMenuItem.Click += создатьБекапToolStripMenuItem_Click; // // FormMain // - AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleDimensions = new SizeF(10F, 25F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1367, 471); + ClientSize = new Size(1709, 589); Controls.Add(buttonRef); Controls.Add(buttonIssuedOrder); Controls.Add(buttonCreateOrder); Controls.Add(dataGridView); Controls.Add(menuStrip); MainMenuStrip = menuStrip; + Margin = new Padding(4, 4, 4, 4); Name = "FormMain"; Text = "Магазин подарков"; Load += FormMain_Load; @@ -215,5 +229,6 @@ private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem письмаToolStripMenuItem; + private ToolStripMenuItem создатьБэкапToolStripMenuItem; } } \ No newline at end of file diff --git a/GiftShop/GiftShopView/FormMain.cs b/GiftShop/GiftShopView/FormMain.cs index 102e778..19cb83b 100644 --- a/GiftShop/GiftShopView/FormMain.cs +++ b/GiftShop/GiftShopView/FormMain.cs @@ -1,5 +1,7 @@ -using GiftShopContracts.BindingModels; +using GiftShopBusinessLogic.BusinessLogics; +using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using GiftShopDataModels.Enums; using Microsoft.Extensions.Logging; @@ -15,13 +17,16 @@ namespace GiftShopView private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + private readonly IBackUpLogic _backUpLogic; + + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workProcess = workProcess; + _backUpLogic = backUpLogic; } private void FormMain_Load(object sender, EventArgs e) @@ -34,15 +39,7 @@ namespace GiftShopView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["GiftId"].Visible = false; - dataGridView.Columns["GiftName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } + dataGridView.FillandConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) @@ -54,30 +51,21 @@ namespace GiftShopView private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - if (service is FormComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormGifts)); - if (service is FormGifts form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ButtonCreateOrder_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); } private void ButtonIssuedOrder_Click(object sender, EventArgs e) @@ -135,55 +123,61 @@ namespace GiftShopView private void ComponentGiftsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportGiftComponents)); - - if (service is FormReportGiftComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - - if (service is FormReportOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ClientsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); - if (service is FormImplementers form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider? - .GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void письмаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMails)); - if (service is FormMails form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + private void создатьБекапToolStripMenuItem_Click(object sender, EventArgs e) + { + try { - form.ShowDialog(); + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); } } } diff --git a/GiftShop/GiftShopView/FormMain.resx b/GiftShop/GiftShopView/FormMain.resx index 1263609..d114de7 100644 --- a/GiftShop/GiftShopView/FormMain.resx +++ b/GiftShop/GiftShopView/FormMain.resx @@ -1,4 +1,64 @@ - + + + diff --git a/GiftShop/GiftShopView/Program.cs b/GiftShop/GiftShopView/Program.cs index 504be58..0435df5 100644 --- a/GiftShop/GiftShopView/Program.cs +++ b/GiftShop/GiftShopView/Program.cs @@ -9,23 +9,21 @@ using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using GiftShopBusinessLogic.MailWorker; using GiftShopContracts.BindingModels; +using GiftShopContracts.DI; namespace GiftShopView { - internal static class Program - { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; - [STAThread] - static void Main() - { - ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + internal static class Program + { + [STAThread] + static void Main() + { + ApplicationConfiguration.Initialize(); + var services = new ServiceCollection(); + InitDependency(); try { - var mailSender = _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, @@ -40,55 +38,53 @@ namespace GiftShopView } catch (Exception ex) { - var logger = _serviceProvider.GetService(); + var logger = DependencyManager.Instance.Resolve(); logger?.LogError(ex, " "); } - Application.Run(_serviceProvider.GetRequiredService()); - } - - private static void ConfigureServices(ServiceCollection services) - { - services.AddLogging(option => - { - option.SetMinimumLevel(LogLevel.Information); - option.AddNLog("nlog.config"); - }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); + private static void InitDependency() + { + DependencyManager.InitDependency(); + DependencyManager.Instance.AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(true); + + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file -- 2.25.1 From 80fea2436c5f2feaa6ef79d4690a2ec77d5872ac Mon Sep 17 00:00:00 2001 From: Arkadiy Radaev Date: Sat, 18 May 2024 09:30:41 +0400 Subject: [PATCH 2/4] fix --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4b81048..9e9f60f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,8 @@ # dll файлы *.dll - /GiftShop/ImplementationExtensions - # Mono auto generated files mono_crash.* -- 2.25.1 From a91f7fc9b09a8d1568ef84e23acde3179421e389 Mon Sep 17 00:00:00 2001 From: Arkadiy Radaev Date: Sat, 18 May 2024 09:34:40 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B4=D0=BE=D0=B3=D1=80=D1=83=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +--- .../GiftShopContracts.dll | Bin 0 -> 31744 bytes .../GiftShopDataModels.dll | Bin 0 -> 6144 bytes .../GiftShopDatabaseImplement.dll | Bin 0 -> 86016 bytes .../GiftShopFileImplement.dll | Bin 0 -> 40448 bytes .../GiftShopListImplement.dll | Bin 0 -> 26112 bytes 6 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 GiftShop/ImplementationExtensions/GiftShopContracts.dll create mode 100644 GiftShop/ImplementationExtensions/GiftShopDataModels.dll create mode 100644 GiftShop/ImplementationExtensions/GiftShopDatabaseImplement.dll create mode 100644 GiftShop/ImplementationExtensions/GiftShopFileImplement.dll create mode 100644 GiftShop/ImplementationExtensions/GiftShopListImplement.dll diff --git a/.gitignore b/.gitignore index 9e9f60f..efc06f2 100644 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,7 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs -# dll файлы -*.dll -/GiftShop/ImplementationExtensions + # Mono auto generated files mono_crash.* diff --git a/GiftShop/ImplementationExtensions/GiftShopContracts.dll b/GiftShop/ImplementationExtensions/GiftShopContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..2c5ea111561ccbc158009ca76361b065d5c7fc1b GIT binary patch literal 31744 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 z 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 DY@+nX literal 0 HcmV?d00001 -- 2.25.1 From 875fe86aec8908d76b9e6997e9126d091bf1ef02 Mon Sep 17 00:00:00 2001 From: Arkadiy Radaev Date: Sat, 18 May 2024 09:35:45 +0400 Subject: [PATCH 4/4] fix --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index efc06f2..9e9f60f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs - +# dll файлы +*.dll +/GiftShop/ImplementationExtensions # Mono auto generated files mono_crash.* -- 2.25.1