From 071b44d73d0bde84e9354794eeb15c04ed967e93 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:37:52 +0400 Subject: [PATCH 1/6] 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 + } +} From 8a61dd2832f639c85bcbfb5823196480850155a8 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 15:57:59 +0400 Subject: [PATCH 2/6] 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; } } } From 5eea91c76d08b2ea1385f003aac07c0be1c027f7 Mon Sep 17 00:00:00 2001 From: Ino Date: Tue, 11 Apr 2023 16:57:04 +0400 Subject: [PATCH 3/6] =?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 From 5b8087029bca06f0101a3aed67a601d552034c76 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 11:59:00 +0400 Subject: [PATCH 4/6] =?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) { From 5d6ad409fca24d821aea9fca6fed9cfd791cd043 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 12:03:05 +0400 Subject: [PATCH 5/6] =?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 From b9096879aef99a76cfef6ff810ab794b5f5c0a83 Mon Sep 17 00:00:00 2001 From: Ino Date: Wed, 12 Apr 2023 12:04:35 +0400 Subject: [PATCH 6/6] =?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"; } }