From 7d100149564b39970e309ff6db84de6fab30465f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=20=D0=A1=D0=B5=D1=80?= =?UTF-8?q?=D0=B3=D1=83=D0=BD=D0=BE=D0=B2?= Date: Sat, 3 Jun 2023 01:27:48 +0400 Subject: [PATCH] 8th LabWork --- .../BusinessLogics/BackUpLogic.cs | 104 ++++++++++++++++++ .../GiftShopBusinessLogic.csproj | 6 +- .../Attributes/ColumnAttribute.cs | 26 +++++ .../Attributes/GridViewAutoSize.cs | 21 ++++ .../BindingModels/BackUpSaveBinidngModel.cs | 8 ++ .../BindingModels/MessageInfoBindingModel.cs | 2 + .../BusinessLogicsContracts/IBackUpLogic.cs | 9 ++ .../GiftShopContracts/DI/DependencyManager.cs | 68 ++++++++++++ .../DI/IDependencyContainer.cs | 36 ++++++ .../DI/IImplementationExtension.cs | 14 +++ .../DI/ServiceDependencyContainer.cs | 59 ++++++++++ .../DI/ServiceProviderLoader.cs | 62 +++++++++++ .../DI/UnityDependencyContainer.cs | 38 +++++++ .../GiftShopContracts.csproj | 11 ++ .../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 | 44 ++++---- .../Models/IMessageInfoModel.cs | 2 +- .../DatabaseImplementationExtension.cs | 23 ++++ .../GiftShopDatabaseImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 29 +++++ .../Models/Client.cs | 6 + .../Models/Component.cs | 13 ++- .../GiftShopDatabaseImplement/Models/Gift.cs | 16 ++- .../Models/Implementer.cs | 7 ++ .../Models/Message.cs | 15 +++ .../GiftShopDatabaseImplement/Models/Order.cs | 28 +++-- .../FileImplementationExtension.cs | 22 ++++ .../GiftShopFileImplement.csproj | 9 ++ .../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 | 42 ++++--- .../GiftShopListImplement.csproj | 5 + .../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 | 71 ++++++------ GiftShop/GiftShopView/FormImplementers.cs | 32 ++---- GiftShop/GiftShopView/FormMails.cs | 31 ++---- GiftShop/GiftShopView/FormMain.Designer.cs | 31 ++++-- GiftShop/GiftShopView/FormMain.cs | 103 +++++++++-------- GiftShop/GiftShopView/GiftShopView.csproj | 2 +- GiftShop/GiftShopView/Program.cs | 101 ++++++++--------- .../GiftShopContracts.dll | Bin 0 -> 31744 bytes .../GiftShopDataModels.dll | Bin 0 -> 6144 bytes .../GiftShopDatabaseImplement.dll | Bin 0 -> 75776 bytes .../GiftShopFileImplement.dll | Bin 0 -> 39936 bytes .../GiftShopListImplement.dll | Bin 0 -> 25088 bytes 60 files changed, 1158 insertions(+), 409 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 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/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs b/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..8a5079d --- /dev/null +++ b/GiftShop/GiftShopBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,104 @@ +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/GiftShopBusinessLogic.csproj b/GiftShop/GiftShopBusinessLogic/GiftShopBusinessLogic.csproj index 4caa566..c3aa783 100644 --- a/GiftShop/GiftShopBusinessLogic/GiftShopBusinessLogic.csproj +++ b/GiftShop/GiftShopBusinessLogic/GiftShopBusinessLogic.csproj @@ -9,8 +9,12 @@ + - + + + + 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..6b49c4b --- /dev/null +++ b/GiftShop/GiftShopContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,8 @@ +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..6fa51e1 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/DependencyManager.cs @@ -0,0 +1,68 @@ +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..2fe5399 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/IDependencyContainer.cs @@ -0,0 +1,36 @@ +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..21fe115 --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/IImplementationExtension.cs @@ -0,0 +1,14 @@ +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..e9597bd --- /dev/null +++ b/GiftShop/GiftShopContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,62 @@ +using System.Reflection; + +namespace GiftShopContracts.DI +{ + /// + /// Загрузчик данных + /// + public static partial class ServiceProviderLoader + { + /// + /// Загрузка всех классов-реализаций IImplementationExtension + /// + /// + 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 66d285f..e518f3b 100644 --- a/GiftShop/GiftShopContracts/GiftShopContracts.csproj +++ b/GiftShop/GiftShopContracts/GiftShopContracts.csproj @@ -6,6 +6,17 @@ enable + + + + + + + + + + + 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 a0fee94..21da9d7 100644 --- a/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs +++ b/GiftShop/GiftShopContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using GiftShopDataModels.Enums; +using GiftShopContracts.Attributes; +using GiftShopDataModels.Enums; using GiftShopDataModels.Models; using System.ComponentModel; @@ -6,37 +7,40 @@ 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; } + [Column(visible: false)] public int? ImplementerId { get; set; } - [DisplayName("Изделие")] - public string GiftName { get; set; } = string.Empty; + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Клиент")] + [Column("Название изделия", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string GiftName { get; set; } = string.Empty; + + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } - [DisplayName("Сумма")] - public double Sum { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата создания", width: 100)] + 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 81ac990..f232822 100644 --- a/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj +++ b/GiftShop/GiftShopDatabaseImplement/GiftShopDatabaseImplement.csproj @@ -20,4 +20,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/Models/Client.cs b/GiftShop/GiftShopDatabaseImplement/Models/Client.cs index 41f4d04..3a9f7a4 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Client.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Client.cs @@ -3,17 +3,23 @@ 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")] 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..fcf0f67 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Gift.cs @@ -3,23 +3,29 @@ 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 + [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 c02da99..a2059e5 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Message.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Message.cs @@ -2,25 +2,40 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { + [DataContract] public class Message : IMessageInfoModel { [Key] + [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 int Id => throw new NotImplementedException(); + public static Message? Create(MessageInfoBindingModel model) { if (model == null) diff --git a/GiftShop/GiftShopDatabaseImplement/Models/Order.cs b/GiftShop/GiftShopDatabaseImplement/Models/Order.cs index dfcec2c..2fd2bf2 100644 --- a/GiftShop/GiftShopDatabaseImplement/Models/Order.cs +++ b/GiftShop/GiftShopDatabaseImplement/Models/Order.cs @@ -3,35 +3,47 @@ using GiftShopContracts.ViewModels; using GiftShopDataModels.Enums; using GiftShopDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace GiftShopDatabaseImplement.Models { - public class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } - public int GiftId { 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; - [Required] + [DataMember] + [Required] public int Count { get; private set; } - [Required] + [DataMember] + [Required] public double Sum { get; private set; } - [Required] + [DataMember] + [Required] public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - [Required] + [DataMember] + [Required] public DateTime DateCreate { get; private set; } = DateTime.Now; - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime? DateImplement { get; private set; } public virtual Gift Gift { get; set; } 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 ec87bae..03b19f5 100644 --- a/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj +++ b/GiftShop/GiftShopFileImplement/GiftShopFileImplement.csproj @@ -6,9 +6,18 @@ enable + + + + + + + + + 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 e2c5acf..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; } + [DataMember] public int? ImplementerId { get; set; } + [DataMember] public int ClientId { get; private set; } + [DataMember] public string GiftName { get; private set; } = string.Empty; + [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) { @@ -59,19 +71,23 @@ namespace GiftShopFileImplement.Models { Id = Convert.ToInt32(element.Attribute("Id")!.Value), GiftId = Convert.ToInt32(element.Element("GiftId")!.Value), - GiftName = element.Element("GiftName")!.Value, + ClientId = Convert.ToInt32(element.Element("ClientId")!.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) + 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) diff --git a/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj b/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj index ec87bae..1586085 100644 --- a/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj +++ b/GiftShop/GiftShopListImplement/GiftShopListImplement.csproj @@ -8,7 +8,12 @@ + + + + + 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..e4525ed 100644 --- a/GiftShop/GiftShopView/FormGifts.cs +++ b/GiftShop/GiftShopView/FormGifts.cs @@ -1,5 +1,6 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using Microsoft.Extensions.Logging; namespace GiftShopView @@ -24,53 +25,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..9e9c8e1 100644 --- a/GiftShop/GiftShopView/FormImplementers.cs +++ b/GiftShop/GiftShopView/FormImplementers.cs @@ -1,5 +1,6 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using Microsoft.Extensions.Logging; 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,15 +30,13 @@ 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,15 +85,7 @@ 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("Загрузка исполнителей"); } 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..6c1431c 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,7 +52,7 @@ // 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); @@ -68,28 +69,28 @@ // компонентыToolStripMenuItem // компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(185, 26); + компонентыToolStripMenuItem.Size = new Size(224, 26); компонентыToolStripMenuItem.Text = "Компоненты"; компонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // // изделияToolStripMenuItem // изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; - изделияToolStripMenuItem.Size = new Size(185, 26); + изделияToolStripMenuItem.Size = new Size(224, 26); изделияToolStripMenuItem.Text = "Изделия"; изделияToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; // // клиентыToolStripMenuItem // клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(185, 26); + клиентыToolStripMenuItem.Size = new Size(224, 26); клиентыToolStripMenuItem.Text = "Клиенты"; клиентыToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; // // исполнителиToolStripMenuItem // исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(185, 26); + исполнителиToolStripMenuItem.Size = new Size(224, 26); исполнителиToolStripMenuItem.Text = "Исполнители"; исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; // @@ -128,6 +129,13 @@ запускРаботToolStripMenuItem.Text = "Запуск работ"; запускРаботToolStripMenuItem.Click += запускРаботToolStripMenuItem_Click; // + // письмаToolStripMenuItem + // + письмаToolStripMenuItem.Name = "письмаToolStripMenuItem"; + письмаToolStripMenuItem.Size = new Size(77, 24); + письмаToolStripMenuItem.Text = "Письма"; + письмаToolStripMenuItem.Click += письмаToolStripMenuItem_Click; + // // dataGridView // dataGridView.BackgroundColor = SystemColors.ControlLightLight; @@ -169,12 +177,12 @@ 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(123, 24); + создатьБекапToolStripMenuItem.Text = "Создать бекап"; + создатьБекапToolStripMenuItem.Click += создатьБекапToolStripMenuItem_Click; // // FormMain // @@ -215,5 +223,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..f1c28ad 100644 --- a/GiftShop/GiftShopView/FormMain.cs +++ b/GiftShop/GiftShopView/FormMain.cs @@ -1,5 +1,6 @@ using GiftShopContracts.BindingModels; using GiftShopContracts.BusinessLogicsContracts; +using GiftShopContracts.DI; using GiftShopDataModels.Enums; using Microsoft.Extensions.Logging; @@ -15,13 +16,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 +38,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 +50,20 @@ 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 +121,64 @@ 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/GiftShopView.csproj b/GiftShop/GiftShopView/GiftShopView.csproj index 56e6506..ecd2aa7 100644 --- a/GiftShop/GiftShopView/GiftShopView.csproj +++ b/GiftShop/GiftShopView/GiftShopView.csproj @@ -26,7 +26,7 @@ - + diff --git a/GiftShop/GiftShopView/Program.cs b/GiftShop/GiftShopView/Program.cs index 504be58..0951df9 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() + [STAThread] + static void Main() { ApplicationConfiguration.Initialize(); var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + 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,52 @@ 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(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(); + DependencyManager.Instance.RegisterType(); + } + + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file diff --git a/GiftShop/ImplementationExtensions/GiftShopContracts.dll b/GiftShop/ImplementationExtensions/GiftShopContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..655fbea30593d4580759651491e4c65b76e1955a GIT binary patch literal 31744 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 literal 0 HcmV?d00001 diff --git a/GiftShop/ImplementationExtensions/GiftShopDataModels.dll b/GiftShop/ImplementationExtensions/GiftShopDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..d46f64d91bd20b75fee6aec5ee8080d0a07cc9ae GIT binary patch literal 6144 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 C)E4ys literal 0 HcmV?d00001 diff --git a/GiftShop/ImplementationExtensions/GiftShopDatabaseImplement.dll b/GiftShop/ImplementationExtensions/GiftShopDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..40eb0440f6f9ee76b853e9130861e3a81da8bf87 GIT binary patch literal 75776 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 literal 0 HcmV?d00001 diff --git a/GiftShop/ImplementationExtensions/GiftShopFileImplement.dll b/GiftShop/ImplementationExtensions/GiftShopFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..6c9e87343e398557a65238d51f3c2c662b39e437 GIT binary patch literal 39936 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 literal 0 HcmV?d00001 diff --git a/GiftShop/ImplementationExtensions/GiftShopListImplement.dll b/GiftShop/ImplementationExtensions/GiftShopListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..fb70f3481c99b2dc4aa866c4311eff5f7d86f130 GIT binary patch literal 25088 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 KyZoz1;Qs(-aTjR- literal 0 HcmV?d00001