From 071b44d73d0bde84e9354794eeb15c04ed967e93 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:37:52 +0400 Subject: [PATCH 1/8] Attributes --- .../Attributes/ColumnAttribute.cs | 25 +++++++++++++++++++ .../Attributes/GridViewAutoSize.cs | 21 ++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs create mode 100644 IceCreamShop/IceCreamShopContracts/Attributes/GridViewAutoSize.cs diff --git a/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs b/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..d2feaa8 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,25 @@ +namespace IceCreamShopContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + 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; } + + 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; + } + } +} diff --git a/IceCreamShop/IceCreamShopContracts/Attributes/GridViewAutoSize.cs b/IceCreamShop/IceCreamShopContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..eda9ec5 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,21 @@ +namespace IceCreamShopContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} -- 2.25.1 From 8a61dd2832f639c85bcbfb5823196480850155a8 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:57:59 +0400 Subject: [PATCH 2/8] data grid view new --- .../IceCreamShop/DataGridViewExtension.cs | 46 +++++++++++++++++++ IceCreamShop/IceCreamShop/FormClients.cs | 29 +++++------- IceCreamShop/IceCreamShop/FormComponents.cs | 29 +++++------- IceCreamShop/IceCreamShop/FormIceCreams.cs | 30 +++++------- IceCreamShop/IceCreamShop/FormImplementers.cs | 30 +++++------- IceCreamShop/IceCreamShop/FormMain.cs | 9 +--- IceCreamShop/IceCreamShop/FormViewMail.cs | 9 +--- .../ViewModels/ClientViewModel.cs | 21 ++++----- .../ViewModels/ComponentViewModel.cs | 16 ++++--- .../ViewModels/IceCreamViewModel.cs | 18 +++++--- .../ViewModels/ImplementerViewModel.cs | 22 +++++---- .../ViewModels/MessageInfoViewModel.cs | 27 ++++++----- .../ViewModels/OrderViewModel.cs | 45 ++++++++++-------- 13 files changed, 181 insertions(+), 150 deletions(-) create mode 100644 IceCreamShop/IceCreamShop/DataGridViewExtension.cs diff --git a/IceCreamShop/IceCreamShop/DataGridViewExtension.cs b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs new file mode 100644 index 0000000..a43d144 --- /dev/null +++ b/IceCreamShop/IceCreamShop/DataGridViewExtension.cs @@ -0,0 +1,46 @@ +using IceCreamShopContracts.Attributes; + +namespace IceCreamShopView +{ + internal 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/IceCreamShop/IceCreamShop/FormClients.cs b/IceCreamShop/IceCreamShop/FormClients.cs index 7d0673d..69f8df6 100644 --- a/IceCreamShop/IceCreamShop/FormClients.cs +++ b/IceCreamShop/IceCreamShop/FormClients.cs @@ -23,23 +23,18 @@ namespace IceCreamShopView 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/IceCreamShop/IceCreamShop/FormComponents.cs b/IceCreamShop/IceCreamShop/FormComponents.cs index 565e1b2..1187925 100644 --- a/IceCreamShop/IceCreamShop/FormComponents.cs +++ b/IceCreamShop/IceCreamShop/FormComponents.cs @@ -33,23 +33,18 @@ namespace IceCreamShopView 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) { diff --git a/IceCreamShop/IceCreamShop/FormIceCreams.cs b/IceCreamShop/IceCreamShop/FormIceCreams.cs index bf71cd7..869e891 100644 --- a/IceCreamShop/IceCreamShop/FormIceCreams.cs +++ b/IceCreamShop/IceCreamShop/FormIceCreams.cs @@ -33,24 +33,18 @@ namespace IceCreamShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["IceCreamName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["IceCreamComponents"].Visible = false; - } - _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) { diff --git a/IceCreamShop/IceCreamShop/FormImplementers.cs b/IceCreamShop/IceCreamShop/FormImplementers.cs index 3f68360..4d27954 100644 --- a/IceCreamShop/IceCreamShop/FormImplementers.cs +++ b/IceCreamShop/IceCreamShop/FormImplementers.cs @@ -24,24 +24,18 @@ namespace IceCreamShopView private void LoadData() { - try - { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ImplementerFIO"].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) { diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 158f01d..13c3116 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -41,14 +41,7 @@ namespace IceCreamShopView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["IceCreamId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) diff --git a/IceCreamShop/IceCreamShop/FormViewMail.cs b/IceCreamShop/IceCreamShop/FormViewMail.cs index a802c58..8c4820b 100644 --- a/IceCreamShop/IceCreamShop/FormViewMail.cs +++ b/IceCreamShop/IceCreamShop/FormViewMail.cs @@ -19,14 +19,7 @@ namespace IceCreamShopView { 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; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка списка писем"); } catch (Exception ex) diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs index 19a404a..64674b6 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ClientViewModel.cs @@ -1,19 +1,18 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { public class ClientViewModel : IClientModel { - public int Id { get; set; } - - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - - [DisplayName("Логин (эл. почта)")] - public string Email { get; set; } = string.Empty; - - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; - } + [Column(visible: false)] + public int Id { get; set; } + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column("Логин (эл. почта)", width: 150)] + public string Email { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs index ba6e0cd..d577aa7 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ComponentViewModel.cs @@ -5,16 +5,20 @@ using System.Text; using System.Threading.Tasks; using AbstractIceCreamShopDataModels.Models; using System.ComponentModel; +using IceCreamShopContracts.Attributes; namespace IceCreamShopContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Cost { get; set; } - } + [Column(visible: false)] + public int Id { get; set; } + + [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; + + [Column("Цена", width: 80)] + public double Cost { get; set; } + } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs index 917c91e..8e98dcf 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/IceCreamViewModel.cs @@ -1,4 +1,5 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,11 +11,16 @@ namespace IceCreamShopContracts.ViewModels { public class IceCreamViewModel : IIceCreamModel { - public int Id { get; set; } - [DisplayName("Название мороженого")] - public string IceCreamName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary IceCreamComponents { get; set; } = new(); + [Column(visible: false)] + public int Id { get; set; } + + [Column("Название мороженого", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string IceCreamName { get; set; } = string.Empty; + + [Column("Цена", width: 100)] + public double Price { get; set; } + + [Column(visible: false)] + public Dictionary IceCreamComponents { get; set; } = new(); } } diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs index 8c1147b..f010552 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/ImplementerViewModel.cs @@ -1,22 +1,24 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column("Пароль", width: 150)] + public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] - public int WorkExperience { get; set; } + [Column("Стаж работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } - } + [Column("Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Qualification { get; set; } + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs index c4e4a23..627d1d0 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -1,24 +1,29 @@ using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; - public int? ClientId { get; set; } + [Column(visible: false)] + public int? ClientId { get; set; } - [DisplayName("Отправитель")] - public string SenderName { get; set; } = string.Empty; + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] + public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] - public DateTime DateDelivery { get; set; } + [Column("Дата письма", width: 100)] + public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] - public string Subject { get; set; } = string.Empty; + [Column("Заголовок", width: 150)] + public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] - public string Body { get; set; } = string.Empty; - } + [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Body { get; set; } = string.Empty; + + [Column(visible: false)] + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs index b5d9404..a173759 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/OrderViewModel.cs @@ -1,5 +1,6 @@ using AbstractIceCreamShopDataModels.Enums; using AbstractIceCreamShopDataModels.Models; +using IceCreamShopContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -11,36 +12,40 @@ namespace IceCreamShopContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } - public int IceCreamId { get; set; } + [Column(visible: false)] + public int IceCreamId { get; set; } - [DisplayName("Название")] - public string IceCreamName { get; set; } = string.Empty; + [Column("Мороженое", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string IceCreamName { get; set; } = string.Empty; - public int ClientId { get; set; } + [Column(visible: false)] + public int ClientId { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] public int? ImplementerId { get; set; } - [DisplayName("Фамилия исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Сумма")] - public double Sum { get; set; } + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } } } -- 2.25.1 From 5eea91c76d08b2ea1385f003aac07c0be1c027f7 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 16:57:04 +0400 Subject: [PATCH 3/8] =?UTF-8?q?=D0=BA=D0=BE=D0=B5=20=D1=87=D1=82=D0=BE=20?= =?UTF-8?q?=D0=B5=D1=89=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/BackUpLogic.cs | 98 +++++++++++++++ IceCreamShop/IceCreamShop/FormComponents.cs | 39 +++--- IceCreamShop/IceCreamShop/FormIceCream.cs | 79 ++++++------ IceCreamShop/IceCreamShop/FormIceCreams.cs | 33 +++-- IceCreamShop/IceCreamShop/FormImplementers.cs | 33 +++-- .../IceCreamShop/FormMain.Designer.cs | 11 +- IceCreamShop/IceCreamShop/FormMain.cs | 90 +++++++------- IceCreamShop/IceCreamShop/Program.cs | 115 ++++++++---------- .../BindingModels/BackUpSaveBinidngModel.cs | 7 ++ .../BindingModels/MessageInfoBindingModel.cs | 4 +- .../BusinessLogicsContracts/IBackUpLogic.cs | 9 ++ .../DI/DependencyManager.cs | 61 ++++++++++ .../DI/IDependencyContainer.cs | 35 ++++++ .../DI/IImplementationExtension.cs | 11 ++ .../DI/ServiceDependencyContainer.cs | 57 +++++++++ .../DI/ServiceProviderLoader.cs | 50 ++++++++ .../DI/UnityDependencyContainer.cs | 38 ++++++ .../IceCreamShopContracts.csproj | 2 + .../StoragesContracts/IBackUpInfo.cs | 8 ++ .../ViewModels/MessageInfoViewModel.cs | 2 +- .../Models/IMessageInfoModel.cs | 2 +- .../Implements/BackUpInfo.cs | 26 ++++ .../Models/MessageInfo.cs | 4 +- .../Models/MessageInfo.cs | 4 +- .../IceCreamShopListImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 17 +++ .../Implements/MessageInfoStorage.cs | 5 +- .../ListImplementationExtension.cs | 23 ++++ .../Models/MessageInfo.cs | 3 +- .../IceCreamShopContracts.dll | Bin 0 -> 31744 bytes .../IceCreamShopDataModels.dll | Bin 0 -> 6144 bytes .../IceCreamShopListImplement.dll | Bin 0 -> 26112 bytes 32 files changed, 657 insertions(+), 213 deletions(-) create mode 100644 IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs create mode 100644 IceCreamShop/IceCreamShopContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/IDependencyContainer.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/IImplementationExtension.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/ServiceDependencyContainer.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs create mode 100644 IceCreamShop/IceCreamShopContracts/DI/UnityDependencyContainer.cs create mode 100644 IceCreamShop/IceCreamShopContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 IceCreamShop/IceCreamShopListImplement/Implements/BackUpInfo.cs create mode 100644 IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll create mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..7ad268c --- /dev/null +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,98 @@ +using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.StoragesContracts; +using AbstractIceCreamShopDataModels; +using Microsoft.Extensions.Logging; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.Serialization.Json; + +namespace ConfectioneryBusinessLogic +{ + 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/IceCreamShop/IceCreamShop/FormComponents.cs b/IceCreamShop/IceCreamShop/FormComponents.cs index 1187925..f47aea7 100644 --- a/IceCreamShop/IceCreamShop/FormComponents.cs +++ b/IceCreamShop/IceCreamShop/FormComponents.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using IceCreamShopContracts.SearchModels; using Microsoft.Extensions.Logging; @@ -48,31 +49,25 @@ namespace IceCreamShopView 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 buttonChange_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 buttonDelete_Click(object sender, EventArgs e) { diff --git a/IceCreamShop/IceCreamShop/FormIceCream.cs b/IceCreamShop/IceCreamShop/FormIceCream.cs index 58dee6b..99e40d5 100644 --- a/IceCreamShop/IceCreamShop/FormIceCream.cs +++ b/IceCreamShop/IceCreamShop/FormIceCream.cs @@ -11,6 +11,7 @@ using AbstractIceCreamShopDataModels.Models; using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using IceCreamShopContracts.SearchModels; using IceCreamShopContracts.ViewModels; using Microsoft.Extensions.Logging; @@ -98,51 +99,49 @@ namespace IceCreamShopView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormIceCreamComponent)); - if (service is FormIceCreamComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента:{ ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count); - if (_iceCreamComponents.ContainsKey(form.Id)) - { - _iceCreamComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _iceCreamComponents.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 (_iceCreamComponents.ContainsKey(form.Id)) + { + _iceCreamComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _iceCreamComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } + } private void buttonEdit_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormIceCreamComponent)); - if (service is FormIceCreamComponent form) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _iceCreamComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента:{ ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count); - _iceCreamComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _iceCreamComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Изменение компонента: { ComponentName} - { Count} ", + form.ComponentModel.ComponentName, form.Count); + _iceCreamComponents[id] = (form.ComponentModel, form.Count); + LoadData(); + } + } } private void buttonDelete_Click(object sender, EventArgs e) diff --git a/IceCreamShop/IceCreamShop/FormIceCreams.cs b/IceCreamShop/IceCreamShop/FormIceCreams.cs index 869e891..242dd2b 100644 --- a/IceCreamShop/IceCreamShop/FormIceCreams.cs +++ b/IceCreamShop/IceCreamShop/FormIceCreams.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using Microsoft.Extensions.Logging; @@ -48,30 +49,24 @@ namespace IceCreamShopView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormIceCream)); - if (service is FormIceCream form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } private void buttonEdit_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormIceCream)); - if (service is FormIceCream form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } } private void buttonDelete_Click(object sender, EventArgs e) diff --git a/IceCreamShop/IceCreamShop/FormImplementers.cs b/IceCreamShop/IceCreamShop/FormImplementers.cs index 4d27954..77dcb0a 100644 --- a/IceCreamShop/IceCreamShop/FormImplementers.cs +++ b/IceCreamShop/IceCreamShop/FormImplementers.cs @@ -1,6 +1,7 @@ using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using Microsoft.Extensions.Logging; @@ -39,30 +40,24 @@ namespace IceCreamShopView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer 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(FormImplementer)); - if (service is FormImplementer form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + 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/IceCreamShop/IceCreamShop/FormMain.Designer.cs b/IceCreamShop/IceCreamShop/FormMain.Designer.cs index 8b20033..99c3e51 100644 --- a/IceCreamShop/IceCreamShop/FormMain.Designer.cs +++ b/IceCreamShop/IceCreamShop/FormMain.Designer.cs @@ -44,6 +44,7 @@ ordersToolStripMenuItem = new ToolStripMenuItem(); DoWorkToolStripMenuItem = new ToolStripMenuItem(); MailToolStripMenuItem = new ToolStripMenuItem(); + createBackupToolStripMenuItem = new ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); menuStrip.SuspendLayout(); SuspendLayout(); @@ -95,7 +96,7 @@ // menuStrip // menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem }); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчетыToolStripMenuItem, DoWorkToolStripMenuItem, MailToolStripMenuItem, createBackupToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.Padding = new Padding(5, 2, 0, 2); @@ -180,6 +181,13 @@ MailToolStripMenuItem.Text = "Письма"; MailToolStripMenuItem.Click += MailToolStripMenuItem_Click; // + // createBackupToolStripMenuItem + // + createBackupToolStripMenuItem.Name = "createBackupToolStripMenuItem"; + createBackupToolStripMenuItem.Size = new Size(97, 20); + createBackupToolStripMenuItem.Text = "Создать бекап"; + createBackupToolStripMenuItem.Click += createBackupToolStripMenuItem_Click; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); @@ -218,5 +226,6 @@ private ToolStripMenuItem ImplementersToolStripMenuItem; private ToolStripMenuItem DoWorkToolStripMenuItem; private ToolStripMenuItem MailToolStripMenuItem; + private ToolStripMenuItem createBackupToolStripMenuItem; } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 13c3116..15afee0 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -1,8 +1,10 @@ using AbstractIceCreamShopDataModels.Enums; +using ConfectioneryBusinessLogic; using IceCreamBusinessLogic.BusinessLogics; using IceCreamShop; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.BusinessLogicsContracts; +using IceCreamShopContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -22,13 +24,15 @@ namespace IceCreamShopView private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; 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) @@ -53,30 +57,21 @@ namespace IceCreamShopView 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(FormIceCreams)); - if (service is FormIceCreams 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 buttonSetToWork_Click(object sender, EventArgs e) @@ -176,54 +171,65 @@ namespace IceCreamShopView private void IceCreamComponentsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportProductComponents)); - if (service is FormReportProductComponents 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 клиентыToolStripMenuItem_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 ImplementersToolStripMenuItem_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 DoWorkToolStripMenuItem_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 MailToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormViewMail)); - if (service is FormViewMail form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void createBackupToolStripMenuItem_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/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 9383722..16bc257 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -1,8 +1,6 @@ using IceCreamShopContracts.BusinessLogicsContracts; -using IceCreamShopContracts.StoragesContracts; using IceCreamBusinessLogic.BusinessLogics; using IceCreamShopView; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using IceCreamBusinessLogic.OfficePackage.Implements; @@ -11,13 +9,12 @@ using IceCreamShopDatabaseImplement.Implements; using IceCreamBusinessLogic.BusinessLogic; using IceCreamBusinessLogic.MailWorker; using IceCreamShopContracts.BindingModels; +using IceCreamShopContracts.DI; namespace IceCreamShop { internal static class Program { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; /// /// The main entry point for the application. /// @@ -27,14 +24,12 @@ namespace IceCreamShop // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + InitDependency(); - try + try { - var mailSender = _serviceProvider.GetService(); - mailSender?.MailConfig(new MailConfigBindingModel + var mailSender = DependencyManager.Instance.Resolve(); + mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, @@ -47,58 +42,54 @@ namespace IceCreamShop // var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } - catch (Exception ex) - { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, " "); - } + catch (Exception ex) + { + 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.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(); - 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(); + 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/IceCreamShop/IceCreamShopContracts/BindingModels/BackUpSaveBinidngModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..bb8d08e --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,7 @@ +namespace IceCreamShopContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs index 7bab4ca..1583bd9 100644 --- a/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs +++ b/IceCreamShop/IceCreamShopContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,7 @@ namespace IceCreamShopContracts.BindingModels public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } - } + + public int Id => throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IBackUpLogic.cs b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..3112267 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,9 @@ +using IceCreamShopContracts.BindingModels; + +namespace IceCreamShopContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs b/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..93cda26 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/DependencyManager.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Logging; + +namespace IceCreamShopContracts.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/IceCreamShop/IceCreamShopContracts/DI/IDependencyContainer.cs b/IceCreamShop/IceCreamShopContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..8bcedb8 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/IDependencyContainer.cs @@ -0,0 +1,35 @@ +using Microsoft.Extensions.Logging; + +namespace IceCreamShopContracts.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/IceCreamShop/IceCreamShopContracts/DI/IImplementationExtension.cs b/IceCreamShop/IceCreamShopContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..2ce94d6 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/IImplementationExtension.cs @@ -0,0 +1,11 @@ +namespace IceCreamShopContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/IceCreamShop/IceCreamShopContracts/DI/ServiceDependencyContainer.cs b/IceCreamShop/IceCreamShopContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..a1b760d --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace IceCreamShopContracts.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/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..7348816 --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,50 @@ +using System.Reflection; + +namespace IceCreamShopContracts.DI +{ + public 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/IceCreamShop/IceCreamShopContracts/DI/UnityDependencyContainer.cs b/IceCreamShop/IceCreamShopContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..bfcd38f --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,38 @@ +using Microsoft.Extensions.Logging; +using Unity; +using Unity.Microsoft.Logging; + +namespace IceCreamShopContracts.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/IceCreamShop/IceCreamShopContracts/IceCreamShopContracts.csproj b/IceCreamShop/IceCreamShopContracts/IceCreamShopContracts.csproj index 981e7c0..f8071fb 100644 --- a/IceCreamShop/IceCreamShopContracts/IceCreamShopContracts.csproj +++ b/IceCreamShop/IceCreamShopContracts/IceCreamShopContracts.csproj @@ -9,6 +9,8 @@ + + diff --git a/IceCreamShop/IceCreamShopContracts/StoragesContracts/IBackUpInfo.cs b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..bafd27b --- /dev/null +++ b/IceCreamShop/IceCreamShopContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,8 @@ +namespace IceCreamShopContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs index 627d1d0..0db37eb 100644 --- a/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs +++ b/IceCreamShop/IceCreamShopContracts/ViewModels/MessageInfoViewModel.cs @@ -1,6 +1,5 @@ using AbstractIceCreamShopDataModels.Models; using IceCreamShopContracts.Attributes; -using System.ComponentModel; namespace IceCreamShopContracts.ViewModels { @@ -25,5 +24,6 @@ namespace IceCreamShopContracts.ViewModels public string Body { get; set; } = string.Empty; [Column(visible: false)] + public int Id => throw new NotImplementedException(); } } \ No newline at end of file diff --git a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs index ac4fccb..0a7f17c 100644 --- a/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs +++ b/IceCreamShop/IceCreamShopDataModels/Models/IMessageInfoModel.cs @@ -1,6 +1,6 @@ namespace AbstractIceCreamShopDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Implements/BackUpInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..1e2c4e7 --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,26 @@ +using IceCreamShopContracts.StoragesContracts; + +namespace IceCreamShopDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new IceCreamShopDatabase(); + 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/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs index 9c6b65b..6e95abf 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs @@ -48,5 +48,7 @@ namespace IceCreamShopDatabaseImplement.Models SenderName = SenderName, DateDelivery = DateDelivery, }; - } + + public int Id => throw new NotImplementedException(); + } } diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs index aa31ba3..244d052 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs @@ -71,5 +71,7 @@ namespace IceCreamShopFileImplement.Models new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) ); - } + + public int Id => throw new NotImplementedException(); + } } diff --git a/IceCreamShop/IceCreamShopListImplement/IceCreamShopListImplement.csproj b/IceCreamShop/IceCreamShopListImplement/IceCreamShopListImplement.csproj index b6d75cd..79e43c9 100644 --- a/IceCreamShop/IceCreamShopListImplement/IceCreamShopListImplement.csproj +++ b/IceCreamShop/IceCreamShopListImplement/IceCreamShopListImplement.csproj @@ -15,4 +15,8 @@ + + + + diff --git a/IceCreamShop/IceCreamShopListImplement/Implements/BackUpInfo.cs b/IceCreamShop/IceCreamShopListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..6693a95 --- /dev/null +++ b/IceCreamShop/IceCreamShopListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,17 @@ +using IceCreamShopContracts.StoragesContracts; + +namespace IceCreamShopListImplement.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/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs index 3917486..d7c319b 100644 --- a/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs +++ b/IceCreamShop/IceCreamShopListImplement/Implements/MessageInfoStorage.cs @@ -1,12 +1,13 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.SearchModels; using IceCreamShopContracts.ViewModels; +using IceCreamShopContracts.StoragesContracts; using IceCreamShopListImplement.Models; namespace IceCreamShopListImplement.Implements { - public class MessageInfoStorage - { + public class MessageInfoStorage : IMessageInfoStorage + { private readonly DataListSingleton _source; public MessageInfoStorage() { diff --git a/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs b/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..a81df9a --- /dev/null +++ b/IceCreamShop/IceCreamShopListImplement/ListImplementationExtension.cs @@ -0,0 +1,23 @@ +using IceCreamShopContracts.DI; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopListImplement.Implements; + +namespace IceCreamShopListImplement +{ + 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/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs index 240ac3e..b8dc980 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs @@ -45,5 +45,6 @@ namespace IceCreamShopListImplement.Models DateDelivery = DateDelivery, }; - } + public int Id => throw new NotImplementedException(); + } } diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..5e2b943aecb6e9bc35f3a7bbc9ae1a07de193735 GIT binary patch literal 31744 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 literal 0 HcmV?d00001 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..749fa9084aaa2d35e8179842440d2be4554e64eb GIT binary patch literal 6144 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 literal 0 HcmV?d00001 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..8db3c1656441495d99876b048ac1af46678f82fc GIT binary patch literal 26112 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 E7nT9ADF6Tf literal 0 HcmV?d00001 -- 2.25.1 From 5b8087029bca06f0101a3aed67a601d552034c76 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 11:59:00 +0400 Subject: [PATCH 4/8] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20DataContract=20=D0=B8=20DataMember?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DatabaseImplementationExtension.cs | 22 +++++++++ .../Models/Client.cs | 16 +++++-- .../Models/Component.cs | 14 ++++-- .../Models/IceCream.cs | 16 +++++-- .../Models/Implementer.cs | 19 +++++--- .../Models/MessageInfo.cs | 7 ++- .../Models/Order.cs | 47 +++++++++++++------ .../FileImplementationExtension.cs | 22 +++++++++ .../Implements/BackUpInfo.cs | 29 ++++++++++++ .../Models/Client.cs | 16 +++++-- .../Models/Component.cs | 15 ++++-- .../Models/IceCream.cs | 19 ++++++-- .../Models/Implementer.cs | 7 +++ .../Models/MessageInfo.cs | 22 ++++++--- .../IceCreamShopFileImplement/Models/Order.cs | 31 ++++++++---- .../Models/Client.cs | 16 +++++-- .../Models/Component.cs | 15 ++++-- .../Models/IceCream.cs | 19 ++++++-- .../Models/Implementer.cs | 7 +++ .../Models/MessageInfo.cs | 22 ++++++--- .../IceCreamShopListImplement/Models/Order.cs | 31 ++++++++---- 21 files changed, 312 insertions(+), 100 deletions(-) create mode 100644 IceCreamShop/IceCreamShopDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs create mode 100644 IceCreamShop/IceCreamShopFileImplement/Implements/BackUpInfo.cs diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/DatabaseImplementationExtension.cs b/IceCreamShop/IceCreamShopDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..5bb9e42 --- /dev/null +++ b/IceCreamShop/IceCreamShopDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,22 @@ +using IceCreamShopContracts.DI; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopDatabaseImplement.Implements; + +namespace IceCreamShopDatabaseImplement +{ + 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/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs index d581f9d..c570085 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Client.cs @@ -3,21 +3,27 @@ using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { [Required] - public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; [Required] - public string Email { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; [Required] - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Component.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Component.cs index 40c83db..0d16480 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Component.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Component.cs @@ -3,19 +3,23 @@ using System.ComponentModel.DataAnnotations; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; - +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.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 IceCreamComponents { get; set; } = new(); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/IceCream.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/IceCream.cs index 7993d94..7fcb106 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/IceCream.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/IceCream.cs @@ -3,23 +3,29 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.Models { - public class IceCream : IIceCreamModel + [DataContract] + public class IceCream : IIceCreamModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } [Required] - public string IceCreamName { get; set; } = string.Empty; + [DataMember] + public string IceCreamName { get; set; } = string.Empty; [Required] - public double Price { get; set; } + [DataMember] + public double Price { get; set; } private Dictionary? _iceCreamComponents = null; [NotMapped] - public Dictionary IceCreamComponents + [DataMember] + public Dictionary IceCreamComponents { get { diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Implementer.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Implementer.cs index 9881eb4..be610ed 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Implementer.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Implementer.cs @@ -2,20 +2,27 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } - public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; - public int WorkExperience { get; private set; } + [DataMember] + public int WorkExperience { get; private set; } - public int Qualification { get; private set; } + [DataMember] + public int Qualification { get; private set; } [ForeignKey("ImplementerId")] public virtual List Orders { get; private set; } = new(); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs index 6e95abf..3edf4f7 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/MessageInfo.cs @@ -2,13 +2,16 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.Models { - public class MessageInfo : IMessageInfoModel + [DataContract] + public class MessageInfo : IMessageInfoModel { [Key] - public string MessageId { get; private set; } = string.Empty; + [DataMember] + public string MessageId { get; private set; } = string.Empty; public int? ClientId { get; private set; } diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs index 4b0b6ac..95fb1d6 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs @@ -4,28 +4,45 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using System.ComponentModel.DataAnnotations; using System.Reflection.Metadata; +using System.Runtime.Serialization; namespace IceCreamShopDatabaseImplement.Models { - public class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { [Required] - public int IceCreamId { get; set; } - [Required] - public int ClientId { get; private set; } - public int? ImplementerId { get; private set; } - [Required] - public int Count { get; set; } - [Required] - public double Sum { get; set; } - [Required] - public OrderStatus Status { get; set; } - [Required] - public DateTime DateCreate { get; set; } + [DataMember] + public int IceCreamId { get; private set; } - public DateTime? DateImplement { get; set; } + [Required] + [DataMember] + public int ClientId { get; private set; } - public int Id { get; set; } + [DataMember] + public int? ImplementerId { get; private set; } + + [Required] + [DataMember] + public int Count { get; private set; } + + [Required] + [DataMember] + public double Sum { get; private set; } + + [Required] + [DataMember] + public OrderStatus Status { get; private set; } + + [Required] + [DataMember] + public DateTime DateCreate { get; private set; } + + [DataMember] + public DateTime? DateImplement { get; private set; } + + [DataMember] + public int Id { get; set; } public virtual IceCream IceCream{ get; private set; } public virtual Client Client { get; private set; } public Implementer? Implementer { get; private set; } diff --git a/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs b/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..c177c3a --- /dev/null +++ b/IceCreamShop/IceCreamShopFileImplement/FileImplementationExtension.cs @@ -0,0 +1,22 @@ +using IceCreamShopContracts.DI; +using IceCreamShopContracts.StoragesContracts; +using IceCreamShopFileImplement.Implements; + +namespace IceCreamShopFileImplement +{ + 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/IceCreamShop/IceCreamShopFileImplement/Implements/BackUpInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..755de87 --- /dev/null +++ b/IceCreamShop/IceCreamShopFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,29 @@ +using IceCreamShopContracts.StoragesContracts; + +namespace IceCreamShopFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + // Получаем значения из singleton-объекта универсального свойства содержащее тип T + 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/IceCreamShop/IceCreamShopFileImplement/Models/Client.cs b/IceCreamShop/IceCreamShopFileImplement/Models/Client.cs index 9a2ec8c..329ebeb 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/Client.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/Client.cs @@ -2,18 +2,24 @@ using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; using System.Xml.Linq; +using System.Runtime.Serialization; namespace IceCreamShopFileImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; - public string Email { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } public static Client? Create(ClientBindingModel model) { diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/Component.cs b/IceCreamShop/IceCreamShopFileImplement/Models/Component.cs index 01bd975..2c581e9 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/Component.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/Component.cs @@ -7,14 +7,21 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace IceCreamShopFileImplement.Models { - public class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { - public int Id { get; private set; } - public string ComponentName { get; private set; } = string.Empty; - public double Cost { get; set; } + [DataMember] + public int Id { get; private set; } + + [DataMember] + public string ComponentName { get; private set; } = string.Empty; + + [DataMember] + public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { if (model == null) diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/IceCream.cs b/IceCreamShop/IceCreamShopFileImplement/Models/IceCream.cs index 54d4d38..fda7848 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/IceCream.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/IceCream.cs @@ -7,17 +7,26 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace IceCreamShopFileImplement.Models { - public class IceCream : IIceCreamModel + [DataContract] + public class IceCream : IIceCreamModel { - public int Id { get; private set; } - public string IceCreamName { get; private set; } = string.Empty; - public double Price { get; private set; } + [DataMember] + public int Id { get; private set; } + + [DataMember] + public string IceCreamName { get; private set; } = string.Empty; + + [DataMember] + public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _iceCreamComponents = null; - public Dictionary IceCreamComponents + + [DataMember] + public Dictionary IceCreamComponents { get { diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/Implementer.cs b/IceCreamShop/IceCreamShopFileImplement/Models/Implementer.cs index 3d0fe22..73cef51 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/Implementer.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/Implementer.cs @@ -2,19 +2,26 @@ using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; using System.Xml.Linq; +using System.Runtime.Serialization; namespace IceCreamShopFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [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; } public static Implementer? Create(XElement element) diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs index 244d052..fb53164 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/MessageInfo.cs @@ -1,23 +1,31 @@ using AbstractIceCreamShopDataModels.Models; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; +using System.Runtime.Serialization; using System.Xml.Linq; namespace IceCreamShopFileImplement.Models { - public class MessageInfo : IMessageInfoModel + [DataContract] + public class MessageInfo : IMessageInfoModel { - public string MessageId { get; private set; } = string.Empty; + [DataMember] + public string MessageId { get; private set; } = string.Empty; - public int? ClientId { get; private set; } + [DataMember] + public int? ClientId { get; private set; } - public string SenderName { get; private set; } = string.Empty; + [DataMember] + public string SenderName { get; private set; } = string.Empty; - public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] + public DateTime DateDelivery { get; private set; } = DateTime.Now; - public string Subject { get; private set; } = string.Empty; + [DataMember] + public string Subject { get; private set; } = string.Empty; - public string Body { get; private set; } = string.Empty; + [DataMember] + public string Body { get; private set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/IceCreamShop/IceCreamShopFileImplement/Models/Order.cs b/IceCreamShop/IceCreamShopFileImplement/Models/Order.cs index 0f1aa02..b9b3605 100644 --- a/IceCreamShop/IceCreamShopFileImplement/Models/Order.cs +++ b/IceCreamShop/IceCreamShopFileImplement/Models/Order.cs @@ -9,28 +9,39 @@ using System.Threading.Tasks; using AbstractIceCreamShopDataModels.Enums; using System.Xml.Linq; using System.Reflection.Metadata; +using System.Runtime.Serialization; namespace IceCreamShopFileImplement.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 IceCreamId { get; private set; } + [DataMember] + public int IceCreamId { get; private set; } - public int? ImplementerId { get; set; } + [DataMember] + public int? ImplementerId { get; set; } - public int ClientId { get; set; } + [DataMember] + public int ClientId { get; set; } - 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 static Order? Create(OrderBindingModel? model) { if (model == null) diff --git a/IceCreamShop/IceCreamShopListImplement/Models/Client.cs b/IceCreamShop/IceCreamShopListImplement/Models/Client.cs index 76ae3a6..8809570 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/Client.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/Client.cs @@ -1,18 +1,24 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; +using System.Runtime.Serialization; namespace IceCreamShopListImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; - public string Email { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } public static Client? Create(ClientBindingModel model) { diff --git a/IceCreamShop/IceCreamShopListImplement/Models/Component.cs b/IceCreamShop/IceCreamShopListImplement/Models/Component.cs index b2b116f..241c851 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/Component.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/Component.cs @@ -6,14 +6,21 @@ using System.Threading.Tasks; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; +using System.Runtime.Serialization; namespace IceCreamShopListImplement.Models { - public class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { - public int Id { get; private set; } - public string ComponentName { get; private set; } = string.Empty; - public double Cost { get; set; } + [DataMember] + public int Id { get; private set; } + + [DataMember] + public string ComponentName { get; private set; } = string.Empty; + + [DataMember] + public double Cost { get; set; } public static Component? Create(ComponentBindingModel? model) { if (model == null) diff --git a/IceCreamShop/IceCreamShopListImplement/Models/IceCream.cs b/IceCreamShop/IceCreamShopListImplement/Models/IceCream.cs index b595c46..a48f360 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/IceCream.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/IceCream.cs @@ -4,18 +4,27 @@ using IceCreamShopContracts.ViewModels; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace IceCreamShopListImplement.Models { - public class IceCream : IIceCreamModel + [DataContract] + public class IceCream : IIceCreamModel { - public int Id { get; private set; } - public string IceCreamName { get; private set; } = string.Empty; - public double Price { get; private set; } - public Dictionary IceCreamComponents + [DataMember] + public int Id { get; private set; } + + [DataMember] + public string IceCreamName { get; private set; } = string.Empty; + + [DataMember] + public double Price { get; private set; } + + [DataMember] + public Dictionary IceCreamComponents { get; private set; diff --git a/IceCreamShop/IceCreamShopListImplement/Models/Implementer.cs b/IceCreamShop/IceCreamShopListImplement/Models/Implementer.cs index aa0ce17..97b059c 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/Implementer.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/Implementer.cs @@ -1,19 +1,26 @@ using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; using AbstractIceCreamShopDataModels.Models; +using System.Runtime.Serialization; namespace IceCreamShopListImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [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; } public static Implementer? Create(ImplementerBindingModel model) diff --git a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs index b8dc980..c514550 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/MessageInfo.cs @@ -1,22 +1,30 @@ using AbstractIceCreamShopDataModels.Models; using IceCreamShopContracts.BindingModels; using IceCreamShopContracts.ViewModels; +using System.Runtime.Serialization; namespace IceCreamShopListImplement.Models { - public class MessageInfo : IMessageInfoModel + [DataContract] + public class MessageInfo : IMessageInfoModel { - public string MessageId { get; private set; } = string.Empty; + [DataMember] + public string MessageId { get; private set; } = string.Empty; - public int? ClientId { get; private set; } + [DataMember] + public int? ClientId { get; private set; } - public string SenderName { get; private set; } = string.Empty; + [DataMember] + public string SenderName { get; private set; } = string.Empty; - public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] + public DateTime DateDelivery { get; private set; } = DateTime.Now; - public string Subject { get; private set; } = string.Empty; + [DataMember] + public string Subject { get; private set; } = string.Empty; - public string Body { get; private set; } = string.Empty; + [DataMember] + public string Body { get; private set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/IceCreamShop/IceCreamShopListImplement/Models/Order.cs b/IceCreamShop/IceCreamShopListImplement/Models/Order.cs index f6c7f6e..fbd9849 100644 --- a/IceCreamShop/IceCreamShopListImplement/Models/Order.cs +++ b/IceCreamShop/IceCreamShopListImplement/Models/Order.cs @@ -9,28 +9,39 @@ using AbstractIceCreamShopDataModels.Models; using AbstractIceCreamShopDataModels.Enums; using System.Data; using System.Reflection; +using System.Runtime.Serialization; namespace IceCreamShopListImplement.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 IceCreamId { get; private set; } + [DataMember] + public int IceCreamId { get; private set; } - public int ClientId { get; private set; } + [DataMember] + public int ClientId { get; private set; } - public int? ImplementerId { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } - 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 static Order? Create (OrderBindingModel? model) { -- 2.25.1 From 5d6ad409fca24d821aea9fca6fed9cfd791cd043 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 12:03:05 +0400 Subject: [PATCH 5/8] =?UTF-8?q?=D1=82=D1=83=D0=BA=D1=82=D1=83=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +++ IceCreamShop/IceCreamShop/Program.cs | 1 - .../IceCreamShopListImplement.dll | Bin 26112 -> 26624 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ca1c7a3..52737dc 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# dll файлы +*.dll + # Mono auto generated files mono_crash.* diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 16bc257..0dbbe76 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -5,7 +5,6 @@ using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using IceCreamBusinessLogic.OfficePackage.Implements; using IceCreamBusinessLogic.OfficePackage; -using IceCreamShopDatabaseImplement.Implements; using IceCreamBusinessLogic.BusinessLogic; using IceCreamBusinessLogic.MailWorker; using IceCreamShopContracts.BindingModels; diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll index 8db3c1656441495d99876b048ac1af46678f82fc..1a911f4db065d379ef26f4e759d4c0718cd6220f 100644 GIT binary patch literal 26624 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 E7nT9ADF6Tf -- 2.25.1 From b9096879aef99a76cfef6ff810ab794b5f5c0a83 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 12:04:35 +0400 Subject: [PATCH 6/8] =?UTF-8?q?=D0=B2=D0=BE=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs index 7348816..e09cd8a 100644 --- a/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs +++ b/IceCreamShop/IceCreamShopContracts/DI/ServiceProviderLoader.cs @@ -44,6 +44,7 @@ namespace IceCreamShopContracts.DI { directory = directory.Parent; } + return $"{directory?.FullName}\\ImplementationExtensions"; } } -- 2.25.1 From a254f61f7a5c4dbdbfed43d11daaf286eead2b9b Mon Sep 17 00:00:00 2001 From: Inohara Date: Sun, 23 Apr 2023 18:43:59 +0400 Subject: [PATCH 7/8] =?UTF-8?q?=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogics/BackUpLogic.cs | 2 +- IceCreamShop/IceCreamShop/FormMain.cs | 1 - IceCreamShop/IceCreamShop/Program.cs | 3 ++- .../IceCreamShopDatabaseImplement.csproj | 4 ++++ .../Models/Order.cs | 2 +- .../IceCreamShopFileImplement.csproj | 4 ++++ .../IceCreamShopContracts.dll | Bin 31744 -> 31744 bytes .../IceCreamShopDataModels.dll | Bin 6144 -> 6144 bytes .../IceCreamShopListImplement.dll | Bin 26624 -> 26624 bytes 9 files changed, 12 insertions(+), 4 deletions(-) diff --git a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs index 7ad268c..bcc5c53 100644 --- a/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs +++ b/IceCreamShop/IceCreamBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -7,7 +7,7 @@ using System.IO.Compression; using System.Reflection; using System.Runtime.Serialization.Json; -namespace ConfectioneryBusinessLogic +namespace IceCreamBusinessLogic.BusinessLogics { public class BackUpLogic : IBackUpLogic { diff --git a/IceCreamShop/IceCreamShop/FormMain.cs b/IceCreamShop/IceCreamShop/FormMain.cs index 15afee0..b325011 100644 --- a/IceCreamShop/IceCreamShop/FormMain.cs +++ b/IceCreamShop/IceCreamShop/FormMain.cs @@ -1,5 +1,4 @@ using AbstractIceCreamShopDataModels.Enums; -using ConfectioneryBusinessLogic; using IceCreamBusinessLogic.BusinessLogics; using IceCreamShop; using IceCreamShopContracts.BindingModels; diff --git a/IceCreamShop/IceCreamShop/Program.cs b/IceCreamShop/IceCreamShop/Program.cs index 0dbbe76..498bc74 100644 --- a/IceCreamShop/IceCreamShop/Program.cs +++ b/IceCreamShop/IceCreamShop/Program.cs @@ -68,8 +68,9 @@ namespace IceCreamShop DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); DependencyManager.Instance.RegisterType(); diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj index 616d02d..ac5c1ab 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj +++ b/IceCreamShop/IceCreamShopDatabaseImplement/IceCreamShopDatabaseImplement.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs index 95fb1d6..aa660a9 100644 --- a/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs +++ b/IceCreamShop/IceCreamShopDatabaseImplement/Models/Order.cs @@ -93,7 +93,7 @@ namespace IceCreamShopDatabaseImplement.Models DateCreate = DateCreate, DateImplement = DateImplement, Id = Id, - IceCreamName = IceCream?.IceCreamName ?? string.Empty, + IceCreamName = context.IceCreams.FirstOrDefault(x => x.Id == IceCreamId)?.IceCreamName ?? string.Empty, ImplementerFIO = Implementer?.ImplementerFIO ?? string.Empty, ClientFIO = Client?.ClientFIO ?? string.Empty, }; diff --git a/IceCreamShop/IceCreamShopFileImplement/IceCreamShopFileImplement.csproj b/IceCreamShop/IceCreamShopFileImplement/IceCreamShopFileImplement.csproj index 0689277..c5f50ed 100644 --- a/IceCreamShop/IceCreamShopFileImplement/IceCreamShopFileImplement.csproj +++ b/IceCreamShop/IceCreamShopFileImplement/IceCreamShopFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll index 5e2b943aecb6e9bc35f3a7bbc9ae1a07de193735..cd54247fe1eee6db399dce565d106f08c9421eb2 100644 GIT binary patch delta 3444 zcmXw+U5H%e8OPr^8 zrFwDZFdK0}(DelLa*mUf?oC4(=tb?t9AT(dl3zO`(c?=634 zq<_M)X-=DZu4$^4C(XPW=T^*(>c9=?1M`B}=eEghoVIBj-#vr5X3fvth-rk`C3i8q z);t@!7f?5>S}gS#Cra76Z+>QGEak?R;g&V~?!e}JYra%EW^>tXVERh& zn;{FDs3+lyY+Y(01xiudm~EU@=b$;{o*}Q1*EmoIKT^u7E~~nj>zEhF8~BM6%0>wb z5=R#FS#TL?%Ss=W1~%JQjguO{|C|x@)yIr=p05`02y4=G_l(JDDvyXEbZdtQa9^#}*F-MpqoU3r#njePc z2~wsMb&5Jgx(2UXweOldFHI?CJ}(E&=lQ~fmHdtBzsfZnPbp>{vyQW59sA~(hCUzs zyhu$e%~;BID^~if++rFi#cAWLu|EB!VYh`dZQ%q;G22Yr zOgr?EQl?#|U8X(yL@Cog(>~Kn#e?PpcgQqVTIc8P2x){gwk*37#+gz!nu-(Ob>hH7 z_K{q9q`WJ~t-123o>I(3+uNU~G`>>$rmTvi6Y{`qc4)Ih+y0Jv$6aMr2R~BEs)U@l zlKbRKm?=4>pO7=9m^(P8#HT?ieNA$h^QgR%R1LDPlxDdk5743sl+t&|ky4s<%pOgm zlzvD~mC}qcCp2Nkhm6~svYfF{mRr`y9=Sno!GLBJc4&I=63vjDD&=Mqa;B7K2h&t| zAK|SJ6&cjXo>H2{3ZFh2UnzZy94MvfkRzou>#W_V$Tv`rK2geaNKPxEoFe7+V-{o# zG8$9mj7nKnsPb-TysB*NX_je&>?@^N#&6LCO6fb~sLJoPs47*DDp5*viNz^RiZdZ+ zN^y2@%q|Y9l)gsxl+rZFzEYayUH12y{o0fcIU_rJxY-`r(<6IipX`$Z zau{$CaS@RdazakYDLEr&WM_sO%y0v;NA}4+IUon*h#ZjbR*XXR(&`mDU_ z;jG+X0?nM{8eE(cr$KJP)j9Dy4`J4ZjW4kYY9UM73IQ#s?qH|yT{maLT=AdKt$A3S!fAGXB z+xh+J!;gMxoKuhGj4|i!-&Om+n$`H8a|eoF*z`qw>RkP{=awG+bo|F(|MtU?|H`la z^v~BF>n%SJzklx8dw(4LTSv0p;3lCfnp+smy!QWm?#W|=x!1pOHjkEm0K&b6>i_@% delta 3479 zcmXY!U5H#~8OPrlzL$(T6~{hp1}U* zKmX_VzUMt>zp|Z2PUn&HiyMX4zng8}{P|Jmt()7gI#0)rbFBE(FO7L6_Hti}UvrK* zSK`PCoinkMTPQBJjd9}O>WhQ3xx$mq-NCo#>UHN%eC>tLg?}j?Hz&+LEKiz8mQ7Q1 zkDJp*`fph_%{f!gHBHrW)y$i5Zp}QbzV8O~f%$bA*koVID3HTMGMhBYT{#5BU} zlDn8)YhDW7>!@2+ohkJgCra76Z$57hS;~cP!)ZhI?fVYw&vTV6E@Gf z4NPAtelui26Ll4?$=0P7QlJ#IjoHRocaE4P_X2r?yupDw_>odpby?NL+{C<2-oj6u zP&P_fkT|lS&w|@X+g2Kt1~%JAjguO{|C|x_Ab-QeF9d22tUGCu|O4+E7*~hsJx2<`jJj6+rVvaCJIQQU= zHGdzLCrFu6)G6u|={|g5)jO`q^U#!H=JRsUe4Z~%Sjj)Ej>|P1Pbp>{vyQWD9sA^% zhCVNTUZkd#4q3`}YgYPuxy3Y4iqpo~V2ciYq?GBF?caA3nuI<3_+n2IUz43y&J3v%d6;bC>LQls~jGOaURw$qm@4SHWG(`F%* z#cOu_dZoo6P|CQ?;tf0PRyy>NQl?#|J(@%*eV=|vlPaYj(T@w4&GYWKAm4X8h0AZ+ zH#@wUpk|CSnoJv6JZ147(>4v_l^$W!h!hW!j@plrrrz?K8bqJYst8kZG#4&KKPg(g(DdLfnjtw=%Ecz+OexJC zrm65e!pAQa8Pv$0QkumIpFSF2DSe9^D5dF;Bc(K(tlg@}H&Bm0QOa~kPAj3DBIWX9 z7Gw-E8dK$rN?BH@@@#0ls%-6PmT80RE2UY%Z_xxw={w}8%I~$PDpijvQA%@*#VJjS zGa+Y6arSV`6C6}2eU0oXrD>3Tr8Fx~*xzgRi;F5y%AiAzl+tWkb=K|CBueRr zb5$(k%qjPz`e%{ z7NlQXuxk8=Mt!O0ngbjHE*{_zXI@-#*AMe8_mupXV`zEE9X>6&bwp^M z5%yr?sN{}t@KgWeFU%GeKKSuRzx&GCyMKJ`@@LmheLDEw_kUG%PR0NG(F-%><6mEW zrS|3H&mD2h!T9X?gM-tTcJj~v^*7f(GtQZ_Ib+Pv?8im>*UiN%Ht0XczAo60WA@_{ zJNqPFy;46mH;w;x0Z@#LG~f4};jC9#?>y|Me-KX-TE+r7K{!S0`S-`%|%zjNiy zXVpEqpsu~*I~PAZ_|_X=^Q)EfPQj1uV*Ph6p1Jyr{cCFZ>T>*ztNp?Lw?ED2E}a<6 M{p6p{&F4!02aO+@6aWAK diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll index 749fa9084aaa2d35e8179842440d2be4554e64eb..17d920c58f04e5a40322887181485ea2e65d1f22 100644 GIT binary patch delta 385 zcmZoLXfT-2!J?-ryk}yM4CAGVE5jM#ay zj7-9;KX@4!7$+|jHJ=>7w1n}(=C4funHdjF{>r8-ug|E*V9ekRB&`|3fTS}+GLZCU z0Eq`P=ub9hSN69%fKt*u(f3OfoZq*vep1 zlTnJ{5Ti4Qy?HS^C%eG^nNdB9crslUNVor4GNGe>@*cjQjHZ*f@td$RNHa2sO`gaj zHkntTTlB!9$L$P^z5z@O3=HK!`~c{|2b0$dh_i<4GcbftJ}ICq_V>T@fA4>P{1(n= zlH^%lxQ!90&c$l7uwaT2RLU+9Dg`o5lzqpi?sGGCM=>nYS_U)(1`dGO3KJE@fFX83 iP>Y@6zbb^lsf^ zW@Hj(W#D6AV4S>A)O>OP(-OuTo4+#sXJ$M#`74{Uyg8#DgE2!ekhErq1Cq`R*+9~p z0VE#GU_RNLUD>mYF_l3GDAvpn&7cP)xxi#H!(7Hzu=r9id6+?o;RxenFv-jaVk?75 zO-3n(Q;g0a_U6Uxoa_RuGs^`8^h><@>!!=-IfX5ryoc{6qwVBv{3g5{dVa1U3TAo+ z(u@pZlPB_sO=cD7HY^q~TEM{Q8^FZCz|aB2FMu9>Apm4R0V9wW24Zy}F3<;Q+{bQAyp diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll index 1a911f4db065d379ef26f4e759d4c0718cd6220f..f04f3684ada669ede65ad643cc80d1c445e0d3e7 100644 GIT binary patch delta 1990 zcmXYyUuauZ9LLYO$!%}Cc4$i{n{^~ht42iYzsVewgtWuz#6p!h25YjULUjl-d~)vI zmQK>h=obzOO zT0f>wh7IlO$3yK*xaW^4rNj3tFSeJQD6i}7yE8ve_+NNWspnM3@VL5ZSXRFpzN*A8 z8)i)e5Tu|d`)2$i~yc)iSuPO7LS!LS5H`Kf8AFoMn(rKE`Gnp%NB795edo8M) z>WJF&HW_~jV@e%Mx!sTW1k<$?-(zi$X-{1+2fag9T8^$QrJ2&QOG?XQq_i}Bmy3-4 z&|GAx<}77Fo&|Y2c^1r&3-pULOP10v(=XF0(_bJj(y!30T1vm>v!F()#)7)Z18)_x z#G8TZXC7AP%Js#2;_s!^&jU4?6O8qOj0 zpVy$-pm~MqI)0r_i)o8#Ozv395qD_rnx^0P5(ZsM8TT0vxRFZn^p-Nsq~vL`n4G2f z0=|eTS&Co8S1?se@quLDYoHn_QR`GAOv_UIHok-D(A>pzF0vQNas}2g0Xc#(+`%Vg<;fk=o~+H1>*OsMV-ncMsLUB(&X|#9(;2oTS703z zkR!N-iOC66BWyXsmgITzWf)_2$O&2P<00YnzH#N7r{tmn>qZT{fE>XsOiWIo8fD8- zwj>wfJf=bp;AKoij$s1(cr|AJ5Yt{(zP#x%p5Ej=FBp>zB62KjpDsQ<`M__@+2rAG zkDvJX_t{@g1>xQHr*EG3^b4VT_IXzw*6Lu`SUwo8oZX(h`sm@CO24+`nBPP5JE@io zmcmC?9&&G)bSpfzl0Pun*_!+OgRjchKl`cnL+`I|wCT;i6gF4hdDf0D%-NB--N}Ey zdt&*IOZPASd9U@#)FsokpQDnq8@U7KNA_r?&^}lBT8FdFRD1uqdnxDTx%Pu^@9B-% G;r{`EuQsFr delta 2025 zcmXw)U1(cn9EaaGAMHuk4A<(#<_F2rS^}=y@QZCs60%;zp__EFjg9qWNyX0IDI$nF zCw2o1Dl6wgFHdM4R1k;pO8husb&v}o1HJGnZ(u(A1tT2RbpHe(Q)*I(Wr>zI{3o7W86!d-CqM_qj8zo>pDMW9nzais~DlRN`k1 zE9!!JU^rqpqsG)~x@NfT)bVwEUDefCW}ayi-&Aj?f1D-q5}hT}Ig+_fC&agep3|bb zs`jfLXO;11Frw74l*|2yk1>5q@tdsOWV)%|GzYy$R$7j(Ev1>%vP)9SZ6vicy)<7k z`d#xSM>TIL3kobK&?&HBl3b);qFJ_-euaL8PKEvqxk}%qS+kUW-D5$WQk?}2lee9D z%mT}N7Bnqo*%HkV)3Ox5PCvqQEXChum)l&kODAU9*PcA0zLwG^rA{COTCe0?z>r9vN%XC^yTTCNz$5M{CL9=U`-UBCQ(6^NFfbkX=Qc3RKQl^=t+)WOX zw-jH*moQ~Z@m0KwsacBmC3{X2)l7<7rW#^emg3j(9ZZL27t_b|F@vQ1-)!M^ibJPl zZ6+nh&13SIBBq4#%6ya=xa688XCyZ*IUDE` zY0jILK`Jfxkx9#`b4-imDqMg*{bh1UUN@_DoQNDlH6+)}!4h<#KO{SbaAU~Zr`*h7 zNVZhNEPxZkVoGEeHZVRpgc01p$7JQm6;h6@&5;}AH5g%HIKZgP1y9bHk!2GZwj{f- zf$_;9T*E}<7^)Gr9AQiH3Gy`n<(a$Wiwhe@Z96_Wglm|H978qA zmZNM*F2NHRm+Zr9n2;R77!L3%YyJ=uPEJ0Yi7a<-@{Z$YWrL6$3ESsO2OoJTI6nNt z`$rc~u6959ZE)b&aQo9&7ae^(NMCv;>rB5qb0+uP^r0uT+8Z=y_XcM#tsf44$=+1@ zrPB%XyZEtrpEJLW=jKeXFKs@@&3nqc@0;2E;P6~w>T0#}#YN}O(#pZ=Pip?{-=$SK zda-x&?o#iY-mTtuz3+Qp^=<`M=B^yD-5Yys*X;P@*Rv0+cV4{n*T37p-g(yiO#lBn j6=?TS^IQD5TWnX{FLitO<-e1O#tZE|ul=D{4h{bY&$U1L -- 2.25.1 From 92723fb49451e3f87eb650625145ee3a35b68f0f Mon Sep 17 00:00:00 2001 From: Inohara Date: Fri, 5 May 2023 10:43:54 +0400 Subject: [PATCH 8/8] fix --- .../IceCreamShopContracts.dll | Bin 31744 -> 0 bytes .../IceCreamShopDataModels.dll | Bin 6144 -> 0 bytes .../IceCreamShopListImplement.dll | Bin 26624 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll delete mode 100644 IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopContracts.dll deleted file mode 100644 index cd54247fe1eee6db399dce565d106f08c9421eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31744 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 b!)@|!cwKG$o53|R{tapW|0MtIHSoUy`{DHq diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopDataModels.dll deleted file mode 100644 index 17d920c58f04e5a40322887181485ea2e65d1f22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 diff --git a/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll b/IceCreamShop/ImplementationExtensions/IceCreamShopListImplement.dll deleted file mode 100644 index f04f3684ada669ede65ad643cc80d1c445e0d3e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26624 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