From ca6a4cf63a0aefae4a14118f96152b885089cfb9 Mon Sep 17 00:00:00 2001 From: shoot Date: Sat, 22 Jun 2024 22:32:20 +0400 Subject: [PATCH] PIbd22_NikiforovaMV_lab8 --- AutomobilePlant/DataGridViewExtension.cs | 50 +++ AutomobilePlant/FormCar.cs | 62 ++-- AutomobilePlant/FormCars.cs | 32 +- AutomobilePlant/FormClients.cs | 10 +- AutomobilePlant/FormComponents.cs | 35 +- AutomobilePlant/FormImplementers.cs | 34 +- AutomobilePlant/FormMails.cs | 9 +- AutomobilePlant/FormMain.Designer.cs | 26 +- AutomobilePlant/FormMain.cs | 115 ++++--- AutomobilePlant/FormMain.resx | 3 + AutomobilePlant/Program.cs | 91 +++--- .../BusinessLogics/BackUpLogic.cs | 100 ++++++ .../Views/Shared/_Layout.cshtml | 2 +- .../Attributes/ColumnAttribute.cs | 26 ++ .../Attributes/GridViewAutoSize.cs | 20 ++ .../AutomobilePlantContracts.csproj | 6 + .../BindingModels/BackUpSaveBinidngModel.cs | 13 + .../BindingModels/MessageInfoBindingModel.cs | 1 + .../BusinessLogicContracts/IBackUpLogic.cs | 14 + .../DI/DependencyManager.cs | 49 +++ .../DI/IDependencyContainer.cs | 24 ++ .../DI/IImplementationExtension.cs | 15 + .../DI/ServiceDependencyContainer.cs | 62 ++++ .../DI/ServiceProviderLoader.cs | 52 +++ .../DI/UnityDependencyContainer.cs | 44 +++ .../StorageContracts/IBackUpInfo.cs | 14 + .../ViewModels/CarViewModel.cs | 16 +- .../ViewModels/ClientViewModel.cs | 18 +- .../ViewModels/ComponentViewModel.cs | 14 +- .../ViewModels/ImplementerViewModel.cs | 22 +- .../ViewModels/MessageInfoViewModel.cs | 17 +- .../ViewModels/OrderViewModel.cs | 48 +-- .../Models/IMessageInfoModel.cs | 2 +- .../AutomobilePlantDatabase.cs | 2 +- .../AutomobilePlantDatabaseImplement.csproj | 4 + .../DatabaseImplementationExtension.cs | 27 ++ .../Implements/BackUpInfo.cs | 32 ++ .../20240621194115_init.Designer.cs | 298 ++++++++++++++++++ .../Migrations/20240621194115_init.cs | 214 +++++++++++++ .../Models/Car.cs | 16 +- .../Models/Client.cs | 16 +- .../Models/Component.cs | 13 +- .../Models/Implementer.cs | 23 +- .../Models/MessageInfo.cs | 15 +- .../Models/Order.cs | 32 +- .../AutomobilePlantFileImplement.csproj | 4 + .../FileImplementationExtension.cs | 27 ++ .../Implements/BackUpInfo.cs | 33 ++ AutomobilePlantFileImplement/Models/Car.cs | 18 +- AutomobilePlantFileImplement/Models/Client.cs | 19 +- .../Models/Component.cs | 14 +- .../Models/Implementer.cs | 23 +- .../Models/MessageInfo.cs | 17 +- AutomobilePlantFileImplement/Models/Order.cs | 36 ++- .../AutomobilePlantListImplements.csproj | 6 +- .../Implements/BackUpInfo.cs | 22 ++ .../ListImplementationExtension.cs | 27 ++ .../Models/MessageInfo.cs | 2 + AutomobilePlantRestApi/appsettings.json | 26 +- .../AutomobilePlantContracts.dll | Bin 0 -> 31744 bytes .../AutomobilePlantDataModels.dll | Bin 0 -> 6144 bytes .../AutomobilePlantDatabaseImplement.dll | Bin 0 -> 75776 bytes .../AutomobilePlantFileImplement.dll | Bin 0 -> 40448 bytes .../AutomobilePlantListImplements.dll | Bin 0 -> 26112 bytes 64 files changed, 1611 insertions(+), 401 deletions(-) create mode 100644 AutomobilePlant/DataGridViewExtension.cs create mode 100644 AutomobilePlantBusinessLogic/BusinessLogics/BackUpLogic.cs create mode 100644 AutomobilePlantContracts/Attributes/ColumnAttribute.cs create mode 100644 AutomobilePlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 AutomobilePlantContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 AutomobilePlantContracts/BusinessLogicContracts/IBackUpLogic.cs create mode 100644 AutomobilePlantContracts/DI/DependencyManager.cs create mode 100644 AutomobilePlantContracts/DI/IDependencyContainer.cs create mode 100644 AutomobilePlantContracts/DI/IImplementationExtension.cs create mode 100644 AutomobilePlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 AutomobilePlantContracts/DI/ServiceProviderLoader.cs create mode 100644 AutomobilePlantContracts/DI/UnityDependencyContainer.cs create mode 100644 AutomobilePlantContracts/StorageContracts/IBackUpInfo.cs create mode 100644 AutomobilePlantDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 AutomobilePlantDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.Designer.cs create mode 100644 AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.cs create mode 100644 AutomobilePlantFileImplement/FileImplementationExtension.cs create mode 100644 AutomobilePlantFileImplement/Implements/BackUpInfo.cs create mode 100644 AutomobilePlantListImplements/Implements/BackUpInfo.cs create mode 100644 AutomobilePlantListImplements/ListImplementationExtension.cs create mode 100644 ImplementationExtensions/AutomobilePlantContracts.dll create mode 100644 ImplementationExtensions/AutomobilePlantDataModels.dll create mode 100644 ImplementationExtensions/AutomobilePlantDatabaseImplement.dll create mode 100644 ImplementationExtensions/AutomobilePlantFileImplement.dll create mode 100644 ImplementationExtensions/AutomobilePlantListImplements.dll diff --git a/AutomobilePlant/DataGridViewExtension.cs b/AutomobilePlant/DataGridViewExtension.cs new file mode 100644 index 0000000..947556a --- /dev/null +++ b/AutomobilePlant/DataGridViewExtension.cs @@ -0,0 +1,50 @@ +using AutomobilePlantContracts.Attributes; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlant +{ + 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/AutomobilePlant/FormCar.cs b/AutomobilePlant/FormCar.cs index 315f1d3..3ea576c 100644 --- a/AutomobilePlant/FormCar.cs +++ b/AutomobilePlant/FormCar.cs @@ -12,6 +12,7 @@ using System.Windows.Forms; using AutomobilePlantContracts.BusinessLogicContracts; using AutomobilePlantContracts.SearchModels; using AutomobilePlantContracts.BindingModels; +using AutomobilePlantContracts.DI; namespace AutomobilePlant { @@ -94,50 +95,45 @@ namespace AutomobilePlant private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCarComponent)); - if (service is FormCarComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) + if (form.ComponentModel == null) { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - if (_carComponents.ContainsKey(form.Id)) - { - _carComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _carComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } - LoadData(); - } - } + return; + } + } + _logger.LogInformation("Добавление нового компонента: { ComponentName}-{Count}", form.ComponentModel.ComponentName, form.Count); + if (_carComponents.ContainsKey(form.Id)) + { + _carComponents[form.Id] = (form.ComponentModel, form.Count); + } + else + { + _carComponents.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(FormCarComponent)); - if (service is FormCarComponent form) + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _carComponents[id].Item2; + + if (form.ShowDialog() == DialogResult.OK) { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _carComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) + if (form.ComponentModel == null) { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента:{ ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _carComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); + return; } - } + _logger.LogInformation("Изменение компонента:{ ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count); + _carComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); + } } } diff --git a/AutomobilePlant/FormCars.cs b/AutomobilePlant/FormCars.cs index c68e240..a77388e 100644 --- a/AutomobilePlant/FormCars.cs +++ b/AutomobilePlant/FormCars.cs @@ -11,6 +11,7 @@ using System.Windows.Forms; using AutomobilePlantContracts.BusinessLogicContracts; using AutomobilePlantContracts.SearchModels; using AutomobilePlantContracts.BindingModels; +using AutomobilePlantContracts.DI; namespace AutomobilePlant { @@ -34,15 +35,8 @@ namespace AutomobilePlant { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["CarName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["CarComponents"].Visible = false; - } - _logger.LogInformation("Загрузка автомобилей"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка автомобилей"); } catch (Exception ex) { @@ -53,13 +47,10 @@ namespace AutomobilePlant private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCar)); - if (service is FormCar form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -67,14 +58,11 @@ namespace AutomobilePlant { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormCar)); - if (service is FormCar 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/AutomobilePlant/FormClients.cs b/AutomobilePlant/FormClients.cs index 9529e69..6db9b7b 100644 --- a/AutomobilePlant/FormClients.cs +++ b/AutomobilePlant/FormClients.cs @@ -33,14 +33,8 @@ namespace AutomobilePlant { 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("Загрузка клиентов"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/AutomobilePlant/FormComponents.cs b/AutomobilePlant/FormComponents.cs index f9a7d77..852aac8 100644 --- a/AutomobilePlant/FormComponents.cs +++ b/AutomobilePlant/FormComponents.cs @@ -1,5 +1,6 @@ using AutomobilePlantContracts.BindingModels; using AutomobilePlantContracts.BusinessLogicContracts; +using AutomobilePlantContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -34,14 +35,8 @@ namespace AutomobilePlant { 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("Загрузка компонентов"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) { @@ -52,28 +47,22 @@ namespace AutomobilePlant 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 ButtonEdit_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent 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/AutomobilePlant/FormImplementers.cs b/AutomobilePlant/FormImplementers.cs index b29b12b..17f5ed1 100644 --- a/AutomobilePlant/FormImplementers.cs +++ b/AutomobilePlant/FormImplementers.cs @@ -1,5 +1,6 @@ using AutomobilePlantContracts.BindingModels; using AutomobilePlantContracts.BusinessLogicContracts; +using AutomobilePlantContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -32,32 +33,22 @@ namespace AutomobilePlant { 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)); + _logger.LogInformation("Загрузка исполнителей"); } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки исполнителей"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonCreate_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -65,14 +56,11 @@ namespace AutomobilePlant { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/AutomobilePlant/FormMails.cs b/AutomobilePlant/FormMails.cs index e9c6469..e68c319 100644 --- a/AutomobilePlant/FormMails.cs +++ b/AutomobilePlant/FormMails.cs @@ -28,14 +28,7 @@ namespace AutomobilePlant { 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/AutomobilePlant/FormMain.Designer.cs b/AutomobilePlant/FormMain.Designer.cs index 49f6cb8..5d7e425 100644 --- a/AutomobilePlant/FormMain.Designer.cs +++ b/AutomobilePlant/FormMain.Designer.cs @@ -34,16 +34,17 @@ this.автомобилиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.клиентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.исполнителиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.письмаToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.списокАвтомобилейToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.компонентыПоАвтомобилямToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.списокЗаказовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.запускРаботToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.создатьБэкапToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.dataGridView = new System.Windows.Forms.DataGridView(); this.buttonCreateOrder = new System.Windows.Forms.Button(); this.buttonSetToFinish = new System.Windows.Forms.Button(); this.buttonUpdate = new System.Windows.Forms.Button(); - письмаToolStripMenuItem = new ToolStripMenuItem(); this.menuStrip.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); this.SuspendLayout(); @@ -54,7 +55,8 @@ this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.справочникиToolStripMenuItem, this.отчетыToolStripMenuItem, - this.запускРаботToolStripMenuItem}); + this.запускРаботToolStripMenuItem, + this.создатьБэкапToolStripMenuItem}); this.menuStrip.Location = new System.Drawing.Point(0, 0); this.menuStrip.Name = "menuStrip"; this.menuStrip.Size = new System.Drawing.Size(1436, 28); @@ -68,7 +70,7 @@ this.автомобилиToolStripMenuItem, this.клиентыToolStripMenuItem, this.исполнителиToolStripMenuItem, - this.письмаToolStripMenuItem}); + this.письмаToolStripMenuItem}); this.справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; this.справочникиToolStripMenuItem.Size = new System.Drawing.Size(117, 24); this.справочникиToolStripMenuItem.Text = "Справочники"; @@ -101,6 +103,13 @@ this.исполнителиToolStripMenuItem.Text = "Исполнители"; this.исполнителиToolStripMenuItem.Click += new System.EventHandler(this.исполнителиToolStripMenuItem_Click); // + // письмаToolStripMenuItem + // + this.письмаToolStripMenuItem.Name = "письмаToolStripMenuItem"; + this.письмаToolStripMenuItem.Size = new System.Drawing.Size(185, 26); + this.письмаToolStripMenuItem.Text = "Письма"; + this.письмаToolStripMenuItem.Click += new System.EventHandler(this.письмаToolStripMenuItem_Click); + // // отчетыToolStripMenuItem // this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -139,12 +148,12 @@ this.запускРаботToolStripMenuItem.Text = "Запуск работ"; this.запускРаботToolStripMenuItem.Click += new System.EventHandler(this.запускРаботToolStripMenuItem_Click); // - // письмаToolStripMenuItem + // создатьБэкапToolStripMenuItem // - письмаToolStripMenuItem.Name = "письмаToolStripMenuItem"; - письмаToolStripMenuItem.Size = new Size(224, 26); - письмаToolStripMenuItem.Text = "Письма"; - письмаToolStripMenuItem.Click += письмаToolStripMenuItem_Click; + this.создатьБэкапToolStripMenuItem.Name = "создатьБэкапToolStripMenuItem"; + this.создатьБэкапToolStripMenuItem.Size = new System.Drawing.Size(122, 24); + this.создатьБэкапToolStripMenuItem.Text = "Создать бэкап"; + this.создатьБэкапToolStripMenuItem.Click += new System.EventHandler(this.создатьБэкапToolStripMenuItem_Click); // // dataGridView // @@ -226,5 +235,6 @@ private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem письмаToolStripMenuItem; + private ToolStripMenuItem создатьБэкапToolStripMenuItem; } } \ No newline at end of file diff --git a/AutomobilePlant/FormMain.cs b/AutomobilePlant/FormMain.cs index 38def58..cb11e34 100644 --- a/AutomobilePlant/FormMain.cs +++ b/AutomobilePlant/FormMain.cs @@ -1,6 +1,7 @@ using AutomobilePlantBusinessLogic.BusinessLogics; using AutomobilePlantContracts.BindingModels; using AutomobilePlantContracts.BusinessLogicContracts; +using AutomobilePlantContracts.DI; using AutomobilePlantDataModels.Enums; using Microsoft.Extensions.Logging; using System; @@ -21,14 +22,16 @@ namespace AutomobilePlant 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) { @@ -40,16 +43,8 @@ namespace AutomobilePlant _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["CarId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - - } - _logger.LogInformation("Загрузка заказов"); + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); + _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) { @@ -60,57 +55,39 @@ namespace AutomobilePlant 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(FormCars)); - if (service is FormCars 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 исполнителиToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); - if (service is FormImplementers form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void компонентыПоАвтомобилямToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportCarComponents)); - if (service is FormReportCarComponents form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void списокЗаказовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrder)); - if (service is FormReportOrder form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void списокАвтомобилейToolStripMenuItem_Click(object sender, EventArgs e) { @@ -123,18 +100,14 @@ namespace AutomobilePlant }); MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } - } 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 ButtonSetToFinish_Click(object sender, EventArgs e) { @@ -170,16 +143,36 @@ namespace AutomobilePlant private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void письмаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMails)); - if (service is FormMails form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void создатьБэкапToolStripMenuItem_Click(object sender, EventArgs e) + { + try { - form.ShowDialog(); + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } diff --git a/AutomobilePlant/FormMain.resx b/AutomobilePlant/FormMain.resx index 81a9e3d..3ecc32f 100644 --- a/AutomobilePlant/FormMain.resx +++ b/AutomobilePlant/FormMain.resx @@ -60,4 +60,7 @@ 17, 17 + + 60 + \ No newline at end of file diff --git a/AutomobilePlant/Program.cs b/AutomobilePlant/Program.cs index 13d1471..2ed1377 100644 --- a/AutomobilePlant/Program.cs +++ b/AutomobilePlant/Program.cs @@ -4,6 +4,7 @@ using AutomobilePlantBusinessLogic.OfficePackage; using AutomobilePlantBusinessLogic.OfficePackage.Implements; using AutomobilePlantContracts.BindingModels; using AutomobilePlantContracts.BusinessLogicContracts; +using AutomobilePlantContracts.DI; using AutomobilePlantContracts.StorageContracts; using AutomobilePlantDatabaseImplement.Implements; using Microsoft.Extensions.DependencyInjection; @@ -14,20 +15,15 @@ namespace AutomobilePlant { internal static class Program { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; - [STAThread] static void Main() { ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + InitDependency(); try { - var mailSender = _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, @@ -37,61 +33,58 @@ namespace AutomobilePlant PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) }); - // + // var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } 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 MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => - { - option.SetMinimumLevel(LogLevel.Information); - option.AddNLog("nlog.config"); - }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.InitDependency(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); - 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(); + 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(isSingle: true); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); } - } + } } \ No newline at end of file diff --git a/AutomobilePlantBusinessLogic/BusinessLogics/BackUpLogic.cs b/AutomobilePlantBusinessLogic/BusinessLogics/BackUpLogic.cs new file mode 100644 index 0000000..320cc76 --- /dev/null +++ b/AutomobilePlantBusinessLogic/BusinessLogics/BackUpLogic.cs @@ -0,0 +1,100 @@ +using AutomobilePlantContracts.BindingModels; +using AutomobilePlantContracts.BusinessLogicContracts; +using AutomobilePlantContracts.StorageContracts; +using AutomobilePlantDataModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization.Json; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantBusinessLogic.BusinessLogics +{ + public class BackUpLogic : IBackUpLogic + { + private readonly ILogger _logger; + private readonly IBackUpInfo _backUpInfo; + public BackUpLogic(ILogger logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + public void CreateBackUp(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + try + { + _logger.LogDebug("Clear folder"); + // зачистка папки и удаление старого архива + var dirInfo = new DirectoryInfo(model.FolderName); + if (dirInfo.Exists) + { + foreach (var file in dirInfo.GetFiles()) + { + file.Delete(); + } + } + _logger.LogDebug("Delete archive"); + string fileName = $"{model.FolderName}.zip"; + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + // берем метод для сохранения + _logger.LogDebug("Get assembly"); + var typeIId = typeof(IId); + var assembly = typeIId.Assembly; + if (assembly == null) + { + throw new ArgumentNullException("Сборка не найдена", nameof(assembly)); + } + var types = assembly.GetTypes(); + var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance); + _logger.LogDebug("Find {count} types", types.Length); + foreach (var type in types) + { + if (type.IsInterface && type.GetInterface(typeIId.Name) != null) + { + var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); + if (modelType == null) + { + throw new InvalidOperationException($"Не найден класс - модель для {type.Name}"); + } + _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); + // вызываем метод на выполнение + method?.MakeGenericMethod(modelType).Invoke(this, new + object[] { model.FolderName }); + } + } + _logger.LogDebug("Create zip and remove folder"); + // архивируем + ZipFile.CreateFromDirectory(model.FolderName, fileName); + // удаляем папку + dirInfo.Delete(true); + } + catch (Exception) + { + throw; + } + } + private void SaveToFile(string folderName) where T : class, new() + { + var records = _backUpInfo.GetList(); + if (records == null) + { + _logger.LogWarning("{type} type get null list", typeof(T).Name); + return; + } + var jsonFormatter = new DataContractJsonSerializer(typeof(List)); + using var fs = new FileStream(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } +} diff --git a/AutomobilePlantClientApp/Views/Shared/_Layout.cshtml b/AutomobilePlantClientApp/Views/Shared/_Layout.cshtml index 3333c49..5d0defd 100644 --- a/AutomobilePlantClientApp/Views/Shared/_Layout.cshtml +++ b/AutomobilePlantClientApp/Views/Shared/_Layout.cshtml @@ -48,7 +48,7 @@ diff --git a/AutomobilePlantContracts/Attributes/ColumnAttribute.cs b/AutomobilePlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..540828b --- /dev/null +++ b/AutomobilePlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.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/AutomobilePlantContracts/Attributes/GridViewAutoSize.cs b/AutomobilePlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..fa6f210 --- /dev/null +++ b/AutomobilePlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/AutomobilePlantContracts/AutomobilePlantContracts.csproj b/AutomobilePlantContracts/AutomobilePlantContracts.csproj index 743e9bf..1d6431f 100644 --- a/AutomobilePlantContracts/AutomobilePlantContracts.csproj +++ b/AutomobilePlantContracts/AutomobilePlantContracts.csproj @@ -6,6 +6,12 @@ enable + + + + + + diff --git a/AutomobilePlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/AutomobilePlantContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..dd2c599 --- /dev/null +++ b/AutomobilePlantContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/AutomobilePlantContracts/BindingModels/MessageInfoBindingModel.cs b/AutomobilePlantContracts/BindingModels/MessageInfoBindingModel.cs index a91bbb1..b112587 100644 --- a/AutomobilePlantContracts/BindingModels/MessageInfoBindingModel.cs +++ b/AutomobilePlantContracts/BindingModels/MessageInfoBindingModel.cs @@ -20,5 +20,6 @@ namespace AutomobilePlantContracts.BindingModels public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; + public int Id => throw new NotImplementedException(); } } diff --git a/AutomobilePlantContracts/BusinessLogicContracts/IBackUpLogic.cs b/AutomobilePlantContracts/BusinessLogicContracts/IBackUpLogic.cs new file mode 100644 index 0000000..4ba591b --- /dev/null +++ b/AutomobilePlantContracts/BusinessLogicContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using AutomobilePlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.BusinessLogicContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/AutomobilePlantContracts/DI/DependencyManager.cs b/AutomobilePlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..8a1f845 --- /dev/null +++ b/AutomobilePlantContracts/DI/DependencyManager.cs @@ -0,0 +1,49 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + + private static DependencyManager? _manager; + + private static readonly object _locjObject = new(); + + private DependencyManager() + { + _dependencyManager = new UnityDependencyContainer(); + } + + 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/AutomobilePlantContracts/DI/IDependencyContainer.cs b/AutomobilePlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..fba2285 --- /dev/null +++ b/AutomobilePlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.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/AutomobilePlantContracts/DI/IImplementationExtension.cs b/AutomobilePlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..0dd6a30 --- /dev/null +++ b/AutomobilePlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + // Регистрация сервисов + public void RegisterServices(); + } +} diff --git a/AutomobilePlantContracts/DI/ServiceDependencyContainer.cs b/AutomobilePlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..bc24305 --- /dev/null +++ b/AutomobilePlantContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,62 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.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/AutomobilePlantContracts/DI/ServiceProviderLoader.cs b/AutomobilePlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..5e771ac --- /dev/null +++ b/AutomobilePlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.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/AutomobilePlantContracts/DI/UnityDependencyContainer.cs b/AutomobilePlantContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..623630b --- /dev/null +++ b/AutomobilePlantContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,44 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Unity; +using Unity.Lifetime; +using Unity.Microsoft.Logging; + +namespace AutomobilePlantContracts.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/AutomobilePlantContracts/StorageContracts/IBackUpInfo.cs b/AutomobilePlantContracts/StorageContracts/IBackUpInfo.cs new file mode 100644 index 0000000..429e760 --- /dev/null +++ b/AutomobilePlantContracts/StorageContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantContracts.StorageContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/AutomobilePlantContracts/ViewModels/CarViewModel.cs b/AutomobilePlantContracts/ViewModels/CarViewModel.cs index c095358..c515a07 100644 --- a/AutomobilePlantContracts/ViewModels/CarViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/CarViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Models; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,11 +11,14 @@ namespace AutomobilePlantContracts.ViewModels { public class CarViewModel : ICarModel { + + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название машины")] - public string CarName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary CarComponents { get; set; } = new(); + [Column("Название машины", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string CarName { get; set; } = string.Empty; + [Column("Цена", width: 100)] + public double Price { get; set; } + [Column(visible: false)] + public Dictionary CarComponents { get; set; } = new(); } } diff --git a/AutomobilePlantContracts/ViewModels/ClientViewModel.cs b/AutomobilePlantContracts/ViewModels/ClientViewModel.cs index 6ed5ca4..5363a44 100644 --- a/AutomobilePlantContracts/ViewModels/ClientViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/ClientViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Models; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace AutomobilePlantContracts.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(title: "ФИО клиента", width: 150)] + public string ClientFIO { get; set; } = string.Empty; + [Column(title: "Логин (эл.почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Email { get; set; } = string.Empty; + [Column(title: "Пароль", width: 150)] + public string Password { get; set; } = string.Empty; } } diff --git a/AutomobilePlantContracts/ViewModels/ComponentViewModel.cs b/AutomobilePlantContracts/ViewModels/ComponentViewModel.cs index 92d581d..213ca41 100644 --- a/AutomobilePlantContracts/ViewModels/ComponentViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Models; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,10 +11,11 @@ namespace AutomobilePlantContracts.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: 100)] + public double Cost { get; set; } } } diff --git a/AutomobilePlantContracts/ViewModels/ImplementerViewModel.cs b/AutomobilePlantContracts/ViewModels/ImplementerViewModel.cs index 3fa40fc..cb73ec0 100644 --- a/AutomobilePlantContracts/ViewModels/ImplementerViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Models; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,19 @@ namespace AutomobilePlantContracts.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("Трудовой стаж", width: 150)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } + [Column("Квалификация", width: 150)] + public int Qualification { get; set; } } } diff --git a/AutomobilePlantContracts/ViewModels/MessageInfoViewModel.cs b/AutomobilePlantContracts/ViewModels/MessageInfoViewModel.cs index c48ca49..b615434 100644 --- a/AutomobilePlantContracts/ViewModels/MessageInfoViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/MessageInfoViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Models; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,16 +11,20 @@ namespace AutomobilePlantContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; - + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Отправитель")] + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] + [Column("Дата письма", width: 100)] public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] + [Column("Заголовок", width: 150)] public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] + [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; + + [Column(visible: false)] + public int Id => throw new NotImplementedException(); } } diff --git a/AutomobilePlantContracts/ViewModels/OrderViewModel.cs b/AutomobilePlantContracts/ViewModels/OrderViewModel.cs index c2280f3..2f7d8ea 100644 --- a/AutomobilePlantContracts/ViewModels/OrderViewModel.cs +++ b/AutomobilePlantContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using AutomobilePlantDataModels.Enums; +using AutomobilePlantContracts.Attributes; +using AutomobilePlantDataModels.Enums; using AutomobilePlantDataModels.Models; using System; using System.Collections.Generic; @@ -11,27 +12,30 @@ namespace AutomobilePlantContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } - public int CarId { get; set; } - [DisplayName("Машина")] - public string CarName { get; set; } = string.Empty; - public int ClientId { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - public int? ImplementerId { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } + [Column(visible: false)] + public int CarId { get; set; } + [Column("Машина", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string CarName { get; set; } = string.Empty; + [Column(visible: false)] + public int ClientId { get; set; } + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int? ImplementerId { get; set; } + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string ImplementerFIO { 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("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } } } diff --git a/AutomobilePlantDataModels/Models/IMessageInfoModel.cs b/AutomobilePlantDataModels/Models/IMessageInfoModel.cs index 25644a3..2b9f5b6 100644 --- a/AutomobilePlantDataModels/Models/IMessageInfoModel.cs +++ b/AutomobilePlantDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AutomobilePlantDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/AutomobilePlantDatabaseImplement/AutomobilePlantDatabase.cs b/AutomobilePlantDatabaseImplement/AutomobilePlantDatabase.cs index 3df895b..43dd8b3 100644 --- a/AutomobilePlantDatabaseImplement/AutomobilePlantDatabase.cs +++ b/AutomobilePlantDatabaseImplement/AutomobilePlantDatabase.cs @@ -16,7 +16,7 @@ namespace AutomobilePlantDatabaseImplement { if (optionsBuilder.IsConfigured == false) { - optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-50UQ1O1\MSSQLSERVER01;Initial Catalog=AutomobileWorkDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); + optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-50UQ1O1\MSSQLSERVER01;Initial Catalog=AutomobilePlantWorkDatabase1;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); } base.OnConfiguring(optionsBuilder); } diff --git a/AutomobilePlantDatabaseImplement/AutomobilePlantDatabaseImplement.csproj b/AutomobilePlantDatabaseImplement/AutomobilePlantDatabaseImplement.csproj index 869eafc..e934e14 100644 --- a/AutomobilePlantDatabaseImplement/AutomobilePlantDatabaseImplement.csproj +++ b/AutomobilePlantDatabaseImplement/AutomobilePlantDatabaseImplement.csproj @@ -24,4 +24,8 @@ + + + + diff --git a/AutomobilePlantDatabaseImplement/DatabaseImplementationExtension.cs b/AutomobilePlantDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..05d1de4 --- /dev/null +++ b/AutomobilePlantDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,27 @@ +using AutomobilePlantContracts.DI; +using AutomobilePlantContracts.StorageContracts; +using AutomobilePlantDatabaseImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantDatabaseImplement +{ + 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/AutomobilePlantDatabaseImplement/Implements/BackUpInfo.cs b/AutomobilePlantDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..43b32bc --- /dev/null +++ b/AutomobilePlantDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using AutomobilePlantContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new AutomobilePlantDatabase(); + 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/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.Designer.cs b/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.Designer.cs new file mode 100644 index 0000000..4548e9c --- /dev/null +++ b/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.Designer.cs @@ -0,0 +1,298 @@ +// +using System; +using AutomobilePlantDatabaseImplement; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace AutomobilePlantDatabaseImplement.Migrations +{ + [DbContext(typeof(AutomobilePlantDatabase))] + [Migration("20240621194115_init")] + partial class init + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Car", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CarName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Cars"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.CarComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CarId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("CarId"); + + b.HasIndex("ComponentId"); + + b.ToTable("CarComponents"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.MessageInfo", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("CarId") + .HasColumnType("int"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("CarId"); + + b.HasIndex("ClientId"); + + b.HasIndex("ImplementerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.CarComponent", b => + { + b.HasOne("AutomobilePlantDatabaseImplement.Models.Car", "Car") + .WithMany("Components") + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutomobilePlantDatabaseImplement.Models.Component", "Component") + .WithMany("CarComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Car"); + + b.Navigation("Component"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.MessageInfo", b => + { + b.HasOne("AutomobilePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Messages") + .HasForeignKey("ClientId"); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Order", b => + { + b.HasOne("AutomobilePlantDatabaseImplement.Models.Car", "Car") + .WithMany("Orders") + .HasForeignKey("CarId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutomobilePlantDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AutomobilePlantDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + + b.Navigation("Car"); + + b.Navigation("Client"); + + b.Navigation("Implementer"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Car", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Client", b => + { + b.Navigation("Messages"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Component", b => + { + b.Navigation("CarComponents"); + }); + + modelBuilder.Entity("AutomobilePlantDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.cs b/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.cs new file mode 100644 index 0000000..14e5f00 --- /dev/null +++ b/AutomobilePlantDatabaseImplement/Migrations/20240621194115_init.cs @@ -0,0 +1,214 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AutomobilePlantDatabaseImplement.Migrations +{ + /// + public partial class init : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Cars", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CarName = table.Column(type: "nvarchar(max)", nullable: false), + Price = table.Column(type: "float", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Cars", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Clients", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ClientFIO = table.Column(type: "nvarchar(max)", nullable: false), + Email = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Clients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Components", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ComponentName = table.Column(type: "nvarchar(max)", nullable: false), + Cost = table.Column(type: "float", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Components", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ImplementerFIO = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false), + WorkExperience = table.Column(type: "int", nullable: false), + Qualification = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + MessageId = table.Column(type: "nvarchar(450)", nullable: false), + ClientId = table.Column(type: "int", nullable: true), + SenderName = table.Column(type: "nvarchar(max)", nullable: false), + DateDelivery = table.Column(type: "datetime2", nullable: false), + Subject = table.Column(type: "nvarchar(max)", nullable: false), + Body = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.MessageId); + table.ForeignKey( + name: "FK_Messages_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "CarComponents", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CarId = table.Column(type: "int", nullable: false), + ComponentId = table.Column(type: "int", nullable: false), + Count = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CarComponents", x => x.Id); + table.ForeignKey( + name: "FK_CarComponents_Cars_CarId", + column: x => x.CarId, + principalTable: "Cars", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CarComponents_Components_ComponentId", + column: x => x.ComponentId, + principalTable: "Components", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + CarId = table.Column(type: "int", nullable: false), + ClientId = table.Column(type: "int", nullable: false), + ImplementerId = table.Column(type: "int", nullable: true), + Count = table.Column(type: "int", nullable: false), + Sum = table.Column(type: "float", nullable: false), + Status = table.Column(type: "int", nullable: false), + DateCreate = table.Column(type: "datetime2", nullable: false), + DateImplement = table.Column(type: "datetime2", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Cars_CarId", + column: x => x.CarId, + principalTable: "Cars", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerId", + column: x => x.ImplementerId, + principalTable: "Implementers", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_CarComponents_CarId", + table: "CarComponents", + column: "CarId"); + + migrationBuilder.CreateIndex( + name: "IX_CarComponents_ComponentId", + table: "CarComponents", + column: "ComponentId"); + + migrationBuilder.CreateIndex( + name: "IX_Messages_ClientId", + table: "Messages", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_CarId", + table: "Orders", + column: "CarId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ClientId", + table: "Orders", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ImplementerId", + table: "Orders", + column: "ImplementerId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CarComponents"); + + migrationBuilder.DropTable( + name: "Messages"); + + migrationBuilder.DropTable( + name: "Orders"); + + migrationBuilder.DropTable( + name: "Components"); + + migrationBuilder.DropTable( + name: "Cars"); + + migrationBuilder.DropTable( + name: "Clients"); + + migrationBuilder.DropTable( + name: "Implementers"); + } + } +} diff --git a/AutomobilePlantDatabaseImplement/Models/Car.cs b/AutomobilePlantDatabaseImplement/Models/Car.cs index b84c10e..b1c2d1b 100644 --- a/AutomobilePlantDatabaseImplement/Models/Car.cs +++ b/AutomobilePlantDatabaseImplement/Models/Car.cs @@ -9,21 +9,27 @@ using System.Linq; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace AutomobilePlantDatabaseImplement.Models { - public class Car : ICarModel + [DataContract] + public class Car : ICarModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public string CarName { get; private set; } = string.Empty; + [DataMember] + public string CarName { get; private set; } = string.Empty; [Required] - public double Price { get; private set; } + [DataMember] + public double Price { get; private set; } private Dictionary? _carComponents = null; [NotMapped] - public Dictionary CarComponents + [DataMember] + public Dictionary CarComponents { get { diff --git a/AutomobilePlantDatabaseImplement/Models/Client.cs b/AutomobilePlantDatabaseImplement/Models/Client.cs index 8078b9b..8b1c744 100644 --- a/AutomobilePlantDatabaseImplement/Models/Client.cs +++ b/AutomobilePlantDatabaseImplement/Models/Client.cs @@ -8,21 +8,27 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace AutomobilePlantDatabaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [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; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); diff --git a/AutomobilePlantDatabaseImplement/Models/Component.cs b/AutomobilePlantDatabaseImplement/Models/Component.cs index aa0abd4..8bb003f 100644 --- a/AutomobilePlantDatabaseImplement/Models/Component.cs +++ b/AutomobilePlantDatabaseImplement/Models/Component.cs @@ -9,17 +9,22 @@ using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace AutomobilePlantDatabaseImplement.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 CarComponents { get; set; } = new(); diff --git a/AutomobilePlantDatabaseImplement/Models/Implementer.cs b/AutomobilePlantDatabaseImplement/Models/Implementer.cs index 03130c4..6c4df02 100644 --- a/AutomobilePlantDatabaseImplement/Models/Implementer.cs +++ b/AutomobilePlantDatabaseImplement/Models/Implementer.cs @@ -5,22 +5,25 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace AutomobilePlantDatabaseImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; private set; } - - public string ImplementerFIO { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; - - public int WorkExperience { get; private set; } - - public int Qualification { get; private set; } + [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; } [ForeignKey("ImplementerId")] public virtual List Orders { get; private set; } = new(); diff --git a/AutomobilePlantDatabaseImplement/Models/MessageInfo.cs b/AutomobilePlantDatabaseImplement/Models/MessageInfo.cs index 4643729..a26197a 100644 --- a/AutomobilePlantDatabaseImplement/Models/MessageInfo.cs +++ b/AutomobilePlantDatabaseImplement/Models/MessageInfo.cs @@ -5,24 +5,27 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace AutomobilePlantDatabaseImplement.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 virtual Client? Client { get; private set; } @@ -53,5 +56,7 @@ namespace AutomobilePlantDatabaseImplement.Models SenderName = SenderName, DateDelivery = DateDelivery, }; + + public int Id => throw new NotImplementedException(); } } diff --git a/AutomobilePlantDatabaseImplement/Models/Order.cs b/AutomobilePlantDatabaseImplement/Models/Order.cs index ac02953..6f19278 100644 --- a/AutomobilePlantDatabaseImplement/Models/Order.cs +++ b/AutomobilePlantDatabaseImplement/Models/Order.cs @@ -8,30 +8,40 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection.Metadata; using System.Runtime.ConstrainedExecution; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace AutomobilePlantDatabaseImplement.Models { - public class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public int CarId { get; private set; } + [DataMember] + public int CarId { get; private set; } [Required] - public int ClientId { get; private set; } - public int? ImplementerId { get; private set; } + [DataMember] + public int ClientId { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } [Required] - public int Count { get; private set; } + [DataMember] + public int Count { get; private set; } [Required] - public double Sum { get; private set; } + [DataMember] + public double Sum { get; private set; } [Required] - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; [Required] - public DateTime DateCreate { get; private set; } = DateTime.Now; - - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] + public DateTime? DateImplement { get; private set; } public virtual Car Car { get; private set; } public virtual Client Client { get; set; } public Implementer? Implementer { get; private set; } diff --git a/AutomobilePlantFileImplement/AutomobilePlantFileImplement.csproj b/AutomobilePlantFileImplement/AutomobilePlantFileImplement.csproj index a6820c2..547b455 100644 --- a/AutomobilePlantFileImplement/AutomobilePlantFileImplement.csproj +++ b/AutomobilePlantFileImplement/AutomobilePlantFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/AutomobilePlantFileImplement/FileImplementationExtension.cs b/AutomobilePlantFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..17da98b --- /dev/null +++ b/AutomobilePlantFileImplement/FileImplementationExtension.cs @@ -0,0 +1,27 @@ +using AutomobilePlantContracts.DI; +using AutomobilePlantContracts.StorageContracts; +using AutomobilePlantFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantFileImplement +{ + 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/AutomobilePlantFileImplement/Implements/BackUpInfo.cs b/AutomobilePlantFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..f6746b8 --- /dev/null +++ b/AutomobilePlantFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,33 @@ +using AutomobilePlantContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + var source = DataFileSingleton.GetInstance(); + return (List?)source.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T)) + ?.GetValue(source); + } + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/AutomobilePlantFileImplement/Models/Car.cs b/AutomobilePlantFileImplement/Models/Car.cs index 47c09a5..8324887 100644 --- a/AutomobilePlantFileImplement/Models/Car.cs +++ b/AutomobilePlantFileImplement/Models/Car.cs @@ -5,24 +5,28 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection.Metadata; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace AutomobilePlantFileImplement.Models { - public class Car : ICarModel + [DataContract] + public class Car : ICarModel { - public string CarName { get; private set; } = string.Empty; - - public double Price { get; private set; } - - public int Id { get; private set; } + [DataMember] + public string CarName { get; private set; } = string.Empty; + [DataMember] + public double Price { get; private set; } + [DataMember] + public int Id { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _carComponents = null; - public Dictionary CarComponents + [DataMember] + public Dictionary CarComponents { get { diff --git a/AutomobilePlantFileImplement/Models/Client.cs b/AutomobilePlantFileImplement/Models/Client.cs index 615de15..ff1425e 100644 --- a/AutomobilePlantFileImplement/Models/Client.cs +++ b/AutomobilePlantFileImplement/Models/Client.cs @@ -4,21 +4,24 @@ using AutomobilePlantDataModels.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 AutomobilePlantFileImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; private set; } - - public string ClientFIO { get; private set; } = string.Empty; - - public string Email { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; + [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/AutomobilePlantFileImplement/Models/Component.cs b/AutomobilePlantFileImplement/Models/Component.cs index ab3185b..68aa630 100644 --- a/AutomobilePlantFileImplement/Models/Component.cs +++ b/AutomobilePlantFileImplement/Models/Component.cs @@ -5,18 +5,22 @@ using System; using System.Collections.Generic; using System.Linq; using System.Numerics; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace AutomobilePlantFileImplement.Models { - public class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { - public string ComponentName { get; private set; } = String.Empty; - - public double Cost { get; set; } - public int Id { get; private set; } + [DataMember] + public string ComponentName { get; private set; } = String.Empty; + [DataMember] + public double Cost { get; set; } + [DataMember] + public int Id { get; private set; } public static Component? Create(ComponentBindingModel? model) { diff --git a/AutomobilePlantFileImplement/Models/Implementer.cs b/AutomobilePlantFileImplement/Models/Implementer.cs index efb1577..7d3d075 100644 --- a/AutomobilePlantFileImplement/Models/Implementer.cs +++ b/AutomobilePlantFileImplement/Models/Implementer.cs @@ -4,23 +4,26 @@ using AutomobilePlantDataModels.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 AutomobilePlantFileImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; private set; } - - public string ImplementerFIO { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; - - public int WorkExperience { get; private set; } - - public int Qualification { get; private set; } + [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/AutomobilePlantFileImplement/Models/MessageInfo.cs b/AutomobilePlantFileImplement/Models/MessageInfo.cs index ac76fd9..dd1765f 100644 --- a/AutomobilePlantFileImplement/Models/MessageInfo.cs +++ b/AutomobilePlantFileImplement/Models/MessageInfo.cs @@ -4,24 +4,27 @@ using AutomobilePlantDataModels.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 AutomobilePlantFileImplement.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 static MessageInfo? Create(MessageInfoBindingModel model) @@ -75,6 +78,8 @@ namespace AutomobilePlantFileImplement.Models new XAttribute("MessageId", MessageId), new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) - ); + ); + + public int Id => throw new NotImplementedException(); } } diff --git a/AutomobilePlantFileImplement/Models/Order.cs b/AutomobilePlantFileImplement/Models/Order.cs index 5e179aa..8f92787 100644 --- a/AutomobilePlantFileImplement/Models/Order.cs +++ b/AutomobilePlantFileImplement/Models/Order.cs @@ -5,29 +5,35 @@ using AutomobilePlantDataModels.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 AutomobilePlantFileImplement.Models { - public class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { - public int CarId { get; private set; } - public int ClientId { get; set; } - public int? ImplementerId { get; set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public int CarId { get; private set; } + [DataMember] + public int ClientId { get; set; } + [DataMember] + public int? ImplementerId { get; set; } + [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; } - public int Count { get; private set; } - - public double Sum { get; private set; } - - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - - public DateTime DateCreate { get; private set; } = DateTime.Now; - - public DateTime? DateImplement { get; private set; } - - public int Id { get; private set; } public static Order? Create(OrderBindingModel? model) { diff --git a/AutomobilePlantListImplements/AutomobilePlantListImplements.csproj b/AutomobilePlantListImplements/AutomobilePlantListImplements.csproj index a6820c2..95c981f 100644 --- a/AutomobilePlantListImplements/AutomobilePlantListImplements.csproj +++ b/AutomobilePlantListImplements/AutomobilePlantListImplements.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -11,4 +11,8 @@ + + + + diff --git a/AutomobilePlantListImplements/Implements/BackUpInfo.cs b/AutomobilePlantListImplements/Implements/BackUpInfo.cs new file mode 100644 index 0000000..2751bc6 --- /dev/null +++ b/AutomobilePlantListImplements/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using AutomobilePlantContracts.StorageContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantListImplements.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/AutomobilePlantListImplements/ListImplementationExtension.cs b/AutomobilePlantListImplements/ListImplementationExtension.cs new file mode 100644 index 0000000..87c8832 --- /dev/null +++ b/AutomobilePlantListImplements/ListImplementationExtension.cs @@ -0,0 +1,27 @@ +using AutomobilePlantContracts.DI; +using AutomobilePlantContracts.StorageContracts; +using AutomobilePlantListImplements.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AutomobilePlantListImplements +{ + 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/AutomobilePlantListImplements/Models/MessageInfo.cs b/AutomobilePlantListImplements/Models/MessageInfo.cs index 1361408..da4b1d1 100644 --- a/AutomobilePlantListImplements/Models/MessageInfo.cs +++ b/AutomobilePlantListImplements/Models/MessageInfo.cs @@ -49,5 +49,7 @@ namespace AutomobilePlantListImplements.Models SenderName = SenderName, DateDelivery = DateDelivery, }; + + public int Id => throw new NotImplementedException(); } } diff --git a/AutomobilePlantRestApi/appsettings.json b/AutomobilePlantRestApi/appsettings.json index d4b4d1e..fde82fc 100644 --- a/AutomobilePlantRestApi/appsettings.json +++ b/AutomobilePlantRestApi/appsettings.json @@ -1,16 +1,16 @@ { - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", - "SmtpClientHost": "smtp.gmail.com", - "SmtpClientPort": "587", - "PopHost": "pop.gmail.com", - "PopPort": "995", - "MailLogin": "mailforlab8@gmail.com", - "MailPassword": "pvmu cnof aakc ckvd" + "SmtpClientHost": "smtp.gmail.com", + "SmtpClientPort": "587", + "PopHost": "pop.gmail.com", + "PopPort": "995", + "MailLogin": "mailforlab8@gmail.com", + "MailPassword": "pvmu cnof aakc ckvd" } diff --git a/ImplementationExtensions/AutomobilePlantContracts.dll b/ImplementationExtensions/AutomobilePlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..9fb917ae3bbec08a70d72a1b78c2cee0add77b1c GIT binary patch literal 31744 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 literal 0 HcmV?d00001 diff --git a/ImplementationExtensions/AutomobilePlantDatabaseImplement.dll b/ImplementationExtensions/AutomobilePlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e8368eee9b434b6aafb604c25caec52d1aa7182 GIT binary patch literal 75776 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 literal 0 HcmV?d00001 diff --git a/ImplementationExtensions/AutomobilePlantFileImplement.dll b/ImplementationExtensions/AutomobilePlantFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..dcf0afa8a80bf6d78a00ba81c5dbadc46b5265ad GIT binary patch literal 40448 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 literal 0 HcmV?d00001 diff --git a/ImplementationExtensions/AutomobilePlantListImplements.dll b/ImplementationExtensions/AutomobilePlantListImplements.dll new file mode 100644 index 0000000000000000000000000000000000000000..867047b62e034dc58e5d2ed3d095d400f0f11790 GIT binary patch literal 26112 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 RNdDsDJ?Q^`mH($A@E_+c(?S3M literal 0 HcmV?d00001