From b5bf087ddae46c9f373d52f3ceb82813d26062cd Mon Sep 17 00:00:00 2001 From: Alina Batylkina Date: Wed, 24 May 2023 00:21:32 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F=208?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FurnitureAssembly/ClientsForm.cs | 15 +-- .../FurnitureAssembly/ComponentsForm.cs | 30 ++--- .../DataGridViewExtension.cs | 51 +++++++++ .../FurnitureAssembly/FormMail.cs | 9 +- .../FurnitureAssemblyView.csproj | 18 ++- .../FurnitureAssembly/FurnitureForm.cs | 44 ++++---- .../FurnitureAssembly/FurnituresForm.cs | 32 ++---- .../FurnitureAssembly/ImplementersForm.cs | 35 ++---- .../FurnitureAssembly/MainForm.Designer.cs | 12 +- .../FurnitureAssembly/MainForm.cs | 104 +++++++++--------- .../FurnitureAssembly/Program.cs | 90 ++++++++------- .../BusinessLogics/BackUpLogic.cs | 97 ++++++++++++++++ .../Attributes/ColumnAttribute.cs | 24 ++++ .../Attributes/GridViewAutoSize.cs | 14 +++ .../BindingModels/BackUpSaveBinidngModel.cs | 7 ++ .../BindingModels/MessageInfoBindingModel.cs | 1 + .../BusinessLogicsContracts/IBackUpLogic.cs | 9 ++ .../DI/DependencyManager.cs | 64 +++++++++++ .../DI/IDependencyContainer.cs | 34 ++++++ .../DI/IImplementationExtension.cs | 11 ++ .../DI/ServiceDependencyContainer.cs | 57 ++++++++++ .../DI/ServiceProviderLoader.cs | 52 +++++++++ .../DI/UnityDependencyContainer.cs | 52 +++++++++ .../FurnitureAssemblyContracts.csproj | 7 ++ .../StoragesContracts/IBackUpInfo.cs | 8 ++ .../ViewModels/ClientViewModel.cs | 10 +- .../ViewModels/ComponentViewModel.cs | 8 +- .../ViewModels/FurnitureViewModel.cs | 9 +- .../ViewModels/ImplementerViewModel.cs | 13 ++- .../ViewModels/MessageInfoViewModel.cs | 16 ++- .../ViewModels/OrderViewModel.cs | 39 ++++--- .../Models/IMessageInfoModel.cs | 2 +- .../DatabaseImplementationExtension.cs | 22 ++++ .../FurnitureAssemblyDatabase.cs | 2 +- .../FurnitureAssemblyDatabaseImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 26 +++++ .../Models/Client.cs | 6 + .../Models/Component.cs | 5 + .../Models/Furniture.cs | 6 + .../Models/FurnitureComponent.cs | 1 - .../Models/Implementer.cs | 7 ++ .../Models/MessageInfo.cs | 14 ++- .../Models/Order.cs | 14 ++- .../FileImplementationExtension.cs | 22 ++++ .../FurnitureAssemblyFileImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 31 ++++++ .../Models/Client.cs | 9 +- .../Models/Component.cs | 5 + .../Models/Furniture.cs | 6 + .../Models/Implementer.cs | 10 +- .../Models/MessageInfo.cs | 14 ++- .../Models/Order.cs | 19 ++-- .../FurnitureAssemblyListImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 18 +++ .../ListImplementationExtension.cs | 22 ++++ .../Models/MessageInfo.cs | 1 + .../FurnitureAssemblyContracts.dll | Bin 0 -> 31744 bytes .../FurnitureAssemblyDataModels.dll | Bin 0 -> 6656 bytes .../FurnitureAssemblyDatabaseImplement.dll | Bin 0 -> 88576 bytes .../FurnitureAssemblyFileImplement.dll | Bin 0 -> 40960 bytes .../FurnitureAssemblyListImplement.dll | Bin 0 -> 25600 bytes 61 files changed, 957 insertions(+), 289 deletions(-) create mode 100644 FurnitureAssembly/FurnitureAssembly/DataGridViewExtension.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyBusinessLogic/BusinessLogics/BackUpLogic.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/Attributes/ColumnAttribute.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/Attributes/GridViewAutoSize.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/DependencyManager.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/IDependencyContainer.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/IImplementationExtension.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceDependencyContainer.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceProviderLoader.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/DI/UnityDependencyContainer.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyFileImplement/FileImplementationExtension.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/BackUpInfo.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyListImplement/Implements/BackUpInfo.cs create mode 100644 FurnitureAssembly/FurnitureAssemblyListImplement/ListImplementationExtension.cs create mode 100644 FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyContracts.dll create mode 100644 FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyDataModels.dll create mode 100644 FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyDatabaseImplement.dll create mode 100644 FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyFileImplement.dll create mode 100644 FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyListImplement.dll diff --git a/FurnitureAssembly/FurnitureAssembly/ClientsForm.cs b/FurnitureAssembly/FurnitureAssembly/ClientsForm.cs index af45a86..e5e98af 100644 --- a/FurnitureAssembly/FurnitureAssembly/ClientsForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/ClientsForm.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssembly; +using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; using System; @@ -32,17 +33,7 @@ namespace FurnitureAssemblyView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["Email"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["Password"].Visible = false; - } + dataGridView.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) diff --git a/FurnitureAssembly/FurnitureAssembly/ComponentsForm.cs b/FurnitureAssembly/FurnitureAssembly/ComponentsForm.cs index 3d1ab9a..346d203 100644 --- a/FurnitureAssembly/FurnitureAssembly/ComponentsForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/ComponentsForm.cs @@ -1,6 +1,7 @@ using FurnitureAssembly; using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -33,13 +34,7 @@ namespace FurnitureAssemblyView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) @@ -52,13 +47,10 @@ namespace FurnitureAssemblyView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(ComponentForm)); - if (service is ComponentForm form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -102,15 +94,11 @@ namespace FurnitureAssemblyView { if (dataGridView.SelectedRows.Count == 1) { - var service = - Program.ServiceProvider?.GetService(typeof(ComponentForm)); - if (service is ComponentForm form) + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/FurnitureAssembly/FurnitureAssembly/DataGridViewExtension.cs b/FurnitureAssembly/FurnitureAssembly/DataGridViewExtension.cs new file mode 100644 index 0000000..6952f2e --- /dev/null +++ b/FurnitureAssembly/FurnitureAssembly/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using FurnitureAssemblyContracts.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FurnitureAssembly +{ + public static class DataGridViewExtension + { + public static void FillandConfigGrid(this DataGridView grid, List? data) + { + if (data == null) + { + return; + } + grid.DataSource = data; + var type = typeof(T); + var properties = type.GetProperties(); + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем { column.Name }"); + } + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства { property.Name }"); + } + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = + (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} diff --git a/FurnitureAssembly/FurnitureAssembly/FormMail.cs b/FurnitureAssembly/FurnitureAssembly/FormMail.cs index fd2afdb..5fe7996 100644 --- a/FurnitureAssembly/FurnitureAssembly/FormMail.cs +++ b/FurnitureAssembly/FurnitureAssembly/FormMail.cs @@ -20,14 +20,7 @@ namespace FurnitureAssembly { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridViewMail.DataSource = list; - dataGridViewMail.Columns["ClientId"].Visible = false; - dataGridViewMail.Columns["MessageId"].Visible = false; - dataGridViewMail.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridViewMail.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка писем"); } catch (Exception ex) diff --git a/FurnitureAssembly/FurnitureAssembly/FurnitureAssemblyView.csproj b/FurnitureAssembly/FurnitureAssembly/FurnitureAssemblyView.csproj index 0467864..17b56b1 100644 --- a/FurnitureAssembly/FurnitureAssembly/FurnitureAssemblyView.csproj +++ b/FurnitureAssembly/FurnitureAssembly/FurnitureAssemblyView.csproj @@ -8,16 +8,14 @@ enable - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + diff --git a/FurnitureAssembly/FurnitureAssembly/FurnitureForm.cs b/FurnitureAssembly/FurnitureAssembly/FurnitureForm.cs index db12f3c..d7108b3 100644 --- a/FurnitureAssembly/FurnitureAssembly/FurnitureForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/FurnitureForm.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using FurnitureAssemblyContracts.DI; namespace FurnitureAssemblyView { @@ -85,35 +86,34 @@ namespace FurnitureAssemblyView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FurnitureComponentForm)); - if (service is FurnitureComponentForm form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - if (_furnitureComponents.ContainsKey(form.Id)) - { - _furnitureComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _furnitureComponents.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 (_furnitureComponents.ContainsKey(form.Id)) + { + _furnitureComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _furnitureComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } } private void buttonChange_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FurnitureComponentForm)); + var service = DependencyManager.Instance.Resolve(); if (service is FurnitureComponentForm form) { int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); diff --git a/FurnitureAssembly/FurnitureAssembly/FurnituresForm.cs b/FurnitureAssembly/FurnitureAssembly/FurnituresForm.cs index e141d16..ceb9353 100644 --- a/FurnitureAssembly/FurnitureAssembly/FurnituresForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/FurnituresForm.cs @@ -10,6 +10,7 @@ using System.Windows.Forms; using FurnitureAssembly; using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.DI; using FurnitureAssemblyView; using Microsoft.Extensions.Logging; @@ -31,15 +32,7 @@ namespace FurnitureAssemblyView { try { - var list = _logic.ReadList(null); - - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["FurnitureComponents"].Visible = false; - DataGridView.Columns["FurnitureName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + DataGridView.FillandConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка компонентов"); @@ -53,30 +46,23 @@ namespace FurnitureAssemblyView private void AddButton_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FurnitureForm)); + var form = DependencyManager.Instance.Resolve(); - if (service is FurnitureForm form) + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } private void ChangeButton_Click(object sender, EventArgs e) { if (DataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FurnitureForm)); + var form = DependencyManager.Instance.Resolve(); - if (service is FurnitureForm form) + form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); - - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/FurnitureAssembly/FurnitureAssembly/ImplementersForm.cs b/FurnitureAssembly/FurnitureAssembly/ImplementersForm.cs index 81af3be..89251fb 100644 --- a/FurnitureAssembly/FurnitureAssembly/ImplementersForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/ImplementersForm.cs @@ -1,6 +1,7 @@ using FurnitureAssembly; using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.BusinessLogicsContracts; +using FurnitureAssemblyContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -33,15 +34,7 @@ namespace FurnitureAssemblyView { 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("Загрузка исполнителей"); + dataGridView.FillandConfigGrid(_logic.ReadList(null)); } catch (Exception ex) { @@ -53,13 +46,11 @@ namespace FurnitureAssemblyView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(ImplementerForm)); - if (service is ImplementerForm form) + var form = DependencyManager.Instance.Resolve(); + + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -67,16 +58,12 @@ namespace FurnitureAssemblyView { if (dataGridView.SelectedRows.Count == 1) { - var service = - Program.ServiceProvider?.GetService(typeof(ImplementerForm)); - if (service is ImplementerForm form) + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/FurnitureAssembly/FurnitureAssembly/MainForm.Designer.cs b/FurnitureAssembly/FurnitureAssembly/MainForm.Designer.cs index 7029b7e..01ef100 100644 --- a/FurnitureAssembly/FurnitureAssembly/MainForm.Designer.cs +++ b/FurnitureAssembly/FurnitureAssembly/MainForm.Designer.cs @@ -46,6 +46,7 @@ this.списокЗаказовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.запускРаботToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mailToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CreateBackUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); buttonReady = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); this.menuStrip.SuspendLayout(); @@ -131,7 +132,8 @@ this.справочникиToolStripMenuItem, this.отчетыToolStripMenuItem, this.запускРаботToolStripMenuItem, - this.mailToolStripMenuItem}); + this.mailToolStripMenuItem, + this.CreateBackUpToolStripMenuItem}); this.menuStrip.Location = new System.Drawing.Point(0, 0); this.menuStrip.Name = "menuStrip"; this.menuStrip.Padding = new System.Windows.Forms.Padding(4, 1, 0, 1); @@ -216,6 +218,13 @@ this.запускРаботToolStripMenuItem.Text = " Запуск работ"; this.запускРаботToolStripMenuItem.Click += new System.EventHandler(this.doWorkToolStripMenuItem_Click); // + // CreateBackUpToolStripMenuItem + // + this.CreateBackUpToolStripMenuItem.Name = "CreateBackUpToolStripMenuItem"; + this.CreateBackUpToolStripMenuItem.Size = new System.Drawing.Size(97, 20); + this.CreateBackUpToolStripMenuItem.Text = "Создать Бэкап"; + this.CreateBackUpToolStripMenuItem.Click += new System.EventHandler(this.CreateBackUpToolStripMenuItem_Click); + // // MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); @@ -260,5 +269,6 @@ private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem mailToolStripMenuItem; + private ToolStripMenuItem CreateBackUpToolStripMenuItem; } } \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssembly/MainForm.cs b/FurnitureAssembly/FurnitureAssembly/MainForm.cs index 26f272e..b335dcc 100644 --- a/FurnitureAssembly/FurnitureAssembly/MainForm.cs +++ b/FurnitureAssembly/FurnitureAssembly/MainForm.cs @@ -12,6 +12,8 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using FurnitureAssemblyContracts.BusinessLogicsContarcts; +using FurnitureAssemblyContracts.DI; namespace FurnitureAssemblyView { @@ -21,14 +23,15 @@ namespace FurnitureAssemblyView private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workModeling; - - public MainForm(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workModeling) + private readonly IBackUpLogic _backUpLogic; + public MainForm(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workModeling, IBackUpLogic backUpLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workModeling = workModeling; + _backUpLogic = backUpLogic; } private void MainForm_Load(object sender, EventArgs e) @@ -40,15 +43,7 @@ namespace FurnitureAssemblyView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["FurnitureId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } + dataGridView.FillandConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } @@ -61,31 +56,24 @@ namespace FurnitureAssemblyView private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(ComponentsForm)); - if (service is ComponentsForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + + form.ShowDialog(); } private void изделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FurnituresForm)); + var form = DependencyManager.Instance.Resolve(); - if (service is FurnituresForm form) - { - form.ShowDialog(); - } + form.ShowDialog(); } private void buttonCreate_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(OrderForm)); - if (service is OrderForm form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + + form.ShowDialog(); + LoadData(); } private void buttonToWork_Click(object sender, EventArgs e) @@ -216,54 +204,64 @@ namespace FurnitureAssemblyView private void FurnituresComponentsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = - Program.ServiceProvider?.GetService(typeof(ReportFurnitureComponentsForm)); - if (service is ReportFurnitureComponentsForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + + form.ShowDialog(); } private void OrdersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = - Program.ServiceProvider?.GetService(typeof(ReportOrdersForm)); - if (service is ReportOrdersForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + + form.ShowDialog(); } private void ClientsToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(ClientsForm)); - if (service is ClientsForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(ImplementersForm)); - if (service is ImplementersForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + + form.ShowDialog(); } private void doWorkToolStripMenuItem_Click(object sender, EventArgs e) { _workModeling.DoWork(( - Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, + DependencyManager.Instance.Resolve() as IImplementerLogic)!, _orderLogic); } private void mailToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMail)); - if (service is FormMail 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/FurnitureAssembly/FurnitureAssembly/Program.cs b/FurnitureAssembly/FurnitureAssembly/Program.cs index bc8ddcc..e9a82f5 100644 --- a/FurnitureAssembly/FurnitureAssembly/Program.cs +++ b/FurnitureAssembly/FurnitureAssembly/Program.cs @@ -2,13 +2,13 @@ using FurnitureAssemblyBusinessLogic; using FurnitureAssemblyBusinessLogic.OfficePackage.Implements; using FurnitureAssemblyBusinessLogic.OfficePackage; using FurnitureAssemblyContracts.BusinessLogicsContarcts; -using FurnitureAssemblyContracts.StoragesContracts; -using FurnitureAssemblyDatabaseImplement.Implements; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; using FurnitureAssemblyBusinessLogic.MailWorker; using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.DI; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyDatabaseImplement.Implements; using FurnitureAssemblyContracts.BusinessLogicsContracts; using FurnitureAssemblyBusinessLogic.BusinessLogics; using FurnitureAssemblyView; @@ -17,8 +17,6 @@ namespace FurnitureAssembly { internal static class Program { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; /// /// The main entry point for the application. /// @@ -28,13 +26,10 @@ namespace FurnitureAssembly // 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 { - var mailSender = - _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = @@ -57,57 +52,60 @@ namespace FurnitureAssembly } catch (Exception ex) { - var logger = _serviceProvider.GetService(); + var logger = DependencyManager.Instance.Resolve(); logger?.LogError(ex, " "); } - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + 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(); - services.AddSingleton(); + DependencyManager.Instance.RegisterType(true); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - 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(); + 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) => ServiceProvider?.GetService()?.MailCheck(); + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BusinessLogics/BackUpLogic.cs b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..ef5ed08 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,97 @@ +using FurnitureAssemblyContracts.BindingModels; +using FurnitureAssemblyContracts.BusinessLogicsContarcts; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyDataModels; +using Microsoft.Extensions.Logging; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.Serialization.Json; + +namespace FurnitureAssemblyBusinessLogic +{ + 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/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/ColumnAttribute.cs b/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..f453606 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,24 @@ +using System; + +namespace FurnitureAssemblyContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public ColumnAttribute(string title = "", bool visible = true, int width + = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool + isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + public string Title { get; private set; } + public bool Visible { get; private set; } + public int Width { get; private set; } + public GridViewAutoSize GridViewAutoSize { get; private set; } + public bool IsUseAutoSize { get; private set; } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/GridViewAutoSize.cs b/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..722d1bb --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,14 @@ +namespace FurnitureAssemblyContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/BackUpSaveBinidngModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..23320f7 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,7 @@ +namespace FurnitureAssemblyContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/MessageInfoBindingModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/MessageInfoBindingModel.cs index 10e611a..ef4b265 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/MessageInfoBindingModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,6 @@ namespace FurnitureAssemblyContracts.BindingModels public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; + public int Id => throw new NotImplementedException(); } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IBackUpLogic.cs b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..c0f25b3 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,9 @@ +using FurnitureAssemblyContracts.BindingModels; + +namespace FurnitureAssemblyContracts.BusinessLogicsContarcts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/DI/DependencyManager.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..6b99863 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/DependencyManager.cs @@ -0,0 +1,64 @@ +using Microsoft.Extensions.Logging; + +namespace FurnitureAssemblyContracts.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/FurnitureAssembly/FurnitureAssemblyContracts/DI/IDependencyContainer.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..e0fbe35 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/IDependencyContainer.cs @@ -0,0 +1,34 @@ +using Microsoft.Extensions.Logging; + +namespace FurnitureAssemblyContracts.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/FurnitureAssembly/FurnitureAssemblyContracts/DI/IImplementationExtension.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..0878428 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/IImplementationExtension.cs @@ -0,0 +1,11 @@ +namespace FurnitureAssemblyContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceDependencyContainer.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..cebccbe --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace FurnitureAssemblyContracts.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/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceProviderLoader.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..6778099 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,52 @@ +using System.Reflection; + +namespace FurnitureAssemblyContracts.DI +{ + public static partial class ServiceProviderLoader + { + /// + /// Загрузка всех классов-реализаций IImplementationExtension + /// + /// + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", + SearchOption.AllDirectories); + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && + typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + return source; + } + private static string TryGetImplementationExtensionsFolder() + { + var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); + while (directory != null && !directory.GetDirectories("ImplementationExtensions", + SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/DI/UnityDependencyContainer.cs b/FurnitureAssembly/FurnitureAssemblyContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..6425937 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,52 @@ +using Microsoft.Extensions.Logging; +using Unity; +using Unity.Microsoft.Logging; + +namespace FurnitureAssemblyContracts.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 + { + if (isSingle) + { + container.RegisterSingleton(); + } + else + { + container.RegisterType(); + } + } + + public T Resolve() + { + return container.Resolve(); + } + + void IDependencyContainer.RegisterType(bool isSingle) + { + if (isSingle) + { + container.RegisterSingleton(); + } + else + { + container.RegisterType(); + } + } + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/FurnitureAssemblyContracts.csproj b/FurnitureAssembly/FurnitureAssemblyContracts/FurnitureAssemblyContracts.csproj index c45b9a0..a8e5f90 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/FurnitureAssemblyContracts.csproj +++ b/FurnitureAssembly/FurnitureAssemblyContracts/FurnitureAssemblyContracts.csproj @@ -6,6 +6,13 @@ enable + + + + + + + diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IBackUpInfo.cs b/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..f770812 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,8 @@ +namespace FurnitureAssemblyContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ClientViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ClientViewModel.cs index 22784d6..d4dec8a 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ClientViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ClientViewModel.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyDataModels.Models; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace FurnitureAssemblyContracts.ViewModels { public class ClientViewModel : IClientModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО клиента")] + [Column(title: "ФИО клиента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] + [Column(title: "Логин (эл. почта)", width: 150)] public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 150)] public string Password { get; set; } = string.Empty; } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ComponentViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ComponentViewModel.cs index 516ff28..40de866 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ComponentViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyDataModels.Models; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,10 +11,11 @@ namespace FurnitureAssemblyContracts.ViewModels { public class ComponentViewModel : IComponentModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название компонента")] + [Column(title: "Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Cost { get; set; } } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/FurnitureViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/FurnitureViewModel.cs index f0a1775..73abdcd 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/FurnitureViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/FurnitureViewModel.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyDataModels.Models; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,11 +11,13 @@ namespace FurnitureAssemblyContracts.ViewModels { public class FurnitureViewModel : IFurnitureModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название изделия")] + [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string FurnitureName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Price { get; set; } + [Column(visible: false)] public Dictionary FurnitureComponents { get; set; } = new(); } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs index 117e972..1ec5b16 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyDataModels.Models; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,15 +11,15 @@ namespace FurnitureAssemblyContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column(title: "ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 150)] public string Password { get; set; } = string.Empty; - [DisplayName("Опыт работы")] + [Column(title: "Опыт работы", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int WorkExperience { get; set; } - - [DisplayName("Квалификация")] + [Column(title: "Квалификация", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] public int Qualification { get; set; } } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/MessageInfoViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/MessageInfoViewModel.cs index 98b85aa..60490d2 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/MessageInfoViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/MessageInfoViewModel.cs @@ -1,20 +1,24 @@ -using FurnitureAssemblyDataModels.Models; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Models; using System.ComponentModel; namespace FurnitureAssemblyContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; - + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Отправитель")] + [Column(title: "Отправитель", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] + [Column(title: "Дата письма", width: 100)] public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] + [Column(title: "Заголовок", width: 170)] public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] + [Column(title: "Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; + [Column(visible: false)] + public int Id => throw new NotImplementedException(); } } diff --git a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs index 77d0e9e..065bfd5 100644 --- a/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using FurnitureAssemblyDataModels.Enums; +using FurnitureAssemblyContracts.Attributes; +using FurnitureAssemblyDataModels.Enums; using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; @@ -11,27 +12,29 @@ namespace FurnitureAssemblyContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] + [Column(title: "Номер", width: 50)] public int Id { get; set; } - - public int FurnitureId { get; set; } - [DisplayName("Изделие")] - public string FurnitureName { get; set; } //= string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } - [DisplayName("Сумма")] - public double Sum { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } + [Column(visible: false)] public int ClientId { get; set; } - [DisplayName("Клиент")] + [Column(title: "Клиент", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int FurnitureId { get; set; } + [Column(title: "Изделие", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string FurnitureName { get; set; } = string.Empty; + [Column(title: "Количество", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public int Count { get; set; } + [Column(title: "Сумма", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public double Sum { get; set; } + [Column(title: "Статус", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column(title: "Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + [Column(title: "Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } + [Column(visible: false)] public int? ImplementerId { get; set; } - [DisplayName("Исполнитель")] + [Column(title: "Исполнитель", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string? ImplementerFIO { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IMessageInfoModel.cs b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IMessageInfoModel.cs index 6139889..b8eb1b3 100644 --- a/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IMessageInfoModel.cs +++ b/FurnitureAssembly/FurnitureAssemblyDataModels/Models/IMessageInfoModel.cs @@ -1,6 +1,6 @@ namespace FurnitureAssemblyDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/DatabaseImplementationExtension.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..1364576 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,22 @@ +using FurnitureAssemblyContracts.DI; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyDatabaseImplement.Implements; + +namespace FurnitureAssemblyDatabaseImplement +{ + 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/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs index 7c18edc..f26bea0 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabase.cs @@ -14,7 +14,7 @@ namespace FurnitureAssemblyDatabaseImplement { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-23CS6SP\SQLEXPRESS;Initial Catalog=FurnitureAssemblyDatabaseFull;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-A68O3K0;Initial Catalog=FurnitureAssemblyDatabaseFull;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabaseImplement.csproj b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabaseImplement.csproj index cfa719e..55841a6 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabaseImplement.csproj +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/FurnitureAssemblyDatabaseImplement.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/BackUpInfo.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..e2bf4b8 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,26 @@ +using FurnitureAssemblyContracts.StoragesContracts; + +namespace FurnitureAssemblyDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new FurnitureAssemblyDatabase(); + 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/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Client.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Client.cs index 76914fd..5d55a58 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Client.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Client.cs @@ -8,17 +8,23 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class Client : IClientModel { + [DataMember] public int Id { get; private set; } [Required] + [DataMember] public string ClientFIO { get; private set; } = string.Empty; [Required] + [DataMember] public string Email { get; private set; } = string.Empty; [Required] + [DataMember] public string Password { get; private set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Messages { get; set; } = new(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Component.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Component.cs index 1ec3c8a..73634d2 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Component.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Component.cs @@ -4,15 +4,20 @@ using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } [Required] + [DataMember] public string ComponentName { get; private set; } = string.Empty; [Required] + [DataMember] public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List FurnitureComponents { get; set; } = new(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs index 992dc97..ffdfe7d 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Furniture.cs @@ -6,20 +6,26 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class Furniture : IFurnitureModel { + [DataMember] public int Id { get; set; } [Required] + [DataMember] public string FurnitureName { get; set; } = string.Empty; [Required] + [DataMember] public double Price { get; set; } private Dictionary? _furnitureComponents = null; [NotMapped] + [DataMember] public Dictionary FurnitureComponents { get diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/FurnitureComponent.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/FurnitureComponent.cs index 67081f0..f91d37d 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/FurnitureComponent.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/FurnitureComponent.cs @@ -14,7 +14,6 @@ namespace FurnitureAssemblyDatabaseImplement.Models public int FurnitureId { get; set; } [Required] public int ComponentId { get; set; } - [Required] public int Count { get; set; } public virtual Component Component { get; set; } = new(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs index 2f052b0..35ae83c 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Implementer.cs @@ -6,21 +6,28 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } [Required] + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; [Required] + [DataMember] public string Password { get; private set; } = string.Empty; [Required] + [DataMember] public int WorkExperience { get; private set; } [Required] + [DataMember] public int Qualification { get; private set; } [ForeignKey("ImplementerId")] public virtual List Orders { get; private set; } = new(); diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/MessageInfo.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/MessageInfo.cs index 1895136..e1f5a99 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/MessageInfo.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/MessageInfo.cs @@ -2,23 +2,27 @@ using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { [Key] + [DataMember] public string MessageId { get; private set; } = string.Empty; - + [DataMember] public int? ClientId { get; private set; } - + [DataMember] public string SenderName { get; private set; } = string.Empty; - + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; - + [DataMember] public string Subject { get; private set; } = string.Empty; - + [DataMember] public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); public virtual Client? Client { get; private set; } diff --git a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs index c59d228..e200d62 100644 --- a/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs +++ b/FurnitureAssembly/FurnitureAssemblyDatabaseImplement/Models/Order.cs @@ -12,30 +12,38 @@ using System.Threading.Tasks; using System.Xml.Linq; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace FurnitureAssemblyDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { [ForeignKey("ProductId")] + [DataMember] public int FurnitureId { get; set; } [Required] + [DataMember] public int Count { get; set; } [Required] + [DataMember] public double Sum { get; set; } [Required] + [DataMember] public OrderStatus Status { get; set; } [Required] + [DataMember] public DateTime DateCreate { get; set; } - + [DataMember] public DateTime? DateImplement { get; set; } - + [DataMember] public int Id { get; set; } [Required] + [DataMember] public int ClientId { get; private set; } - public virtual Client Client { get; set; } public virtual Furniture Furniture { get; set; } + [DataMember] public int? ImplementerId { get; private set; } public virtual Implementer? Implementer { get; set; } diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/FileImplementationExtension.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..9654243 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/FileImplementationExtension.cs @@ -0,0 +1,22 @@ +using FurnitureAssemblyContracts.DI; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyDatabaseImplement.Implements; + +namespace FurnitureAssemFileImplement +{ + 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/FurnitureAssembly/FurnitureAssemblyFileImplement/FurnitureAssemblyFileImplement.csproj b/FurnitureAssembly/FurnitureAssemblyFileImplement/FurnitureAssemblyFileImplement.csproj index 5003737..1ffafce 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/FurnitureAssemblyFileImplement.csproj +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/FurnitureAssemblyFileImplement.csproj @@ -12,5 +12,9 @@ + + + + diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/BackUpInfo.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..5231f0e --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,31 @@ +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyFileImplement; +using System.Reflection; + +namespace FurnitureAssemFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + DataFileSingleton dataFileSingleton = DataFileSingleton.GetInstance(); + return (List?) dataFileSingleton.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T))? + .GetValue(dataFileSingleton); + } + + 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/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Client.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Client.cs index 620d671..31dce37 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Client.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Client.cs @@ -1,18 +1,21 @@ using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement_.Models { + [DataContract] public class Client : IClientModel { + [DataMember] public int Id { get; private set; } - + [DataMember] public string ClientFIO { get; private set; } = string.Empty; - + [DataMember] public string Email { get; private set; } = string.Empty; - + [DataMember] public string Password { get; private set; } = string.Empty; public static Client? Create(ClientBindingModel model) diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Component.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Component.cs index 7036dec..7d574e8 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Component.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Component.cs @@ -1,14 +1,19 @@ using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement.Models { + [DataContract] public class Component : IComponentModel { + [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) diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Furniture.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Furniture.cs index 80ad7dc..6595cb0 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Furniture.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Furniture.cs @@ -1,17 +1,23 @@ using FurnitureAssemblyContracts.BindingModels; using FurnitureAssemblyContracts.ViewModels; using FurnitureAssemblyDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement.Models { + [DataContract] public class Furniture : IFurnitureModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string FurnitureName { get; private set; } = string.Empty; + [DataMember] public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _furnitureComponents = null; + [DataMember] public Dictionary FurnitureComponents { get diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs index df3a6b4..d823aa0 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Implementer.cs @@ -4,21 +4,25 @@ using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement_.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/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/MessageInfo.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/MessageInfo.cs index 875289a..a321042 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/MessageInfo.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/MessageInfo.cs @@ -4,25 +4,29 @@ using FurnitureAssemblyDataModels.Models; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { + [DataMember] public string MessageId { get; private set; } = string.Empty; - + [DataMember] public int? ClientId { get; private set; } - + [DataMember] public string SenderName { get; private set; } = string.Empty; - + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; - + [DataMember] public string Subject { get; private set; } = string.Empty; - + [DataMember] public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs index 3913211..d2c5f7e 100644 --- a/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs +++ b/FurnitureAssembly/FurnitureAssemblyFileImplement/Models/Order.cs @@ -7,30 +7,35 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace FurnitureAssemblyFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int FurnitureId { get; private set; } - + [DataMember] public string FurnitureName { get; private set; } = string.Empty; - + [DataMember] public int Count { get; private set; } - + [DataMember] public double Sum { get; private set; } - + [DataMember] public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - + [DataMember] public DateTime DateCreate { get; private set; } = DateTime.Now; - + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] public int ClientId { get; private set; } - + [DataMember] public int Id { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; public static Order? Create(OrderBindingModel? model) diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/FurnitureAssemblyListImplement.csproj b/FurnitureAssembly/FurnitureAssemblyListImplement/FurnitureAssemblyListImplement.csproj index 00764bc..b8b6f05 100644 --- a/FurnitureAssembly/FurnitureAssemblyListImplement/FurnitureAssemblyListImplement.csproj +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/FurnitureAssemblyListImplement.csproj @@ -12,4 +12,8 @@ + + + + diff --git a/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/BackUpInfo.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..b099c9c --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,18 @@ +using FurnitureAssemblyContracts.StoragesContracts; + + +namespace FurnitureAssemblyListImplement.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/FurnitureAssembly/FurnitureAssemblyListImplement/ListImplementationExtension.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..8f39b42 --- /dev/null +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/ListImplementationExtension.cs @@ -0,0 +1,22 @@ +using FurnitureAssemblyContracts.DI; +using FurnitureAssemblyContracts.StoragesContracts; +using FurnitureAssemblyListImplement.Implements; + +namespace FurnitureAssemblyListImplement +{ + 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/FurnitureAssembly/FurnitureAssemblyListImplement/Models/MessageInfo.cs b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/MessageInfo.cs index 332bb9f..96e81a9 100644 --- a/FurnitureAssembly/FurnitureAssemblyListImplement/Models/MessageInfo.cs +++ b/FurnitureAssembly/FurnitureAssemblyListImplement/Models/MessageInfo.cs @@ -17,6 +17,7 @@ namespace FurnitureAssemblyListImplement.Models public string Subject { get; private set; } = string.Empty; public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyContracts.dll b/FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..ecc0703ae74d09c15e74f68f95403ec7e041f097 GIT binary patch literal 31744 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 literal 0 HcmV?d00001 diff --git a/FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyDataModels.dll b/FurnitureAssembly/ImplementationExtensions/FurnitureAssemblyDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..6b7e3d56a7371a3ec78f2f34aaf3849fe03e9478 GIT binary patch literal 6656 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 literal 0 HcmV?d00001