From b2bb6742af9cc9ddc8b7c4a3794c395280793345 Mon Sep 17 00:00:00 2001 From: goldfest Date: Sat, 18 May 2024 14:59:42 +0400 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TravelCompanyContracts.dll | Bin 0 -> 30720 bytes .../TravelCompanyDataModels.dll | Bin 0 -> 6144 bytes .../TravelCompanyDatabaseImplement.dll | Bin 0 -> 76288 bytes .../TravelCompanyFileImplement.dll | Bin 0 -> 40960 bytes .../TravelCompanyListImplement.dll | Bin 0 -> 26624 bytes .../TravelCompany/DataGridViewExtension.cs | 46 +++++++ TravelCompany/TravelCompany/FormClients.cs | 13 +- TravelCompany/TravelCompany/FormComponents.cs | 22 ++-- .../TravelCompany/FormMain.Designer.cs | 31 +++-- TravelCompany/TravelCompany/FormMain.cs | 124 ++++++++---------- TravelCompany/TravelCompany/FormTravel.cs | 81 ++++++------ TravelCompany/TravelCompany/FormTravels.cs | 30 ++--- TravelCompany/TravelCompany/FormViewMail.cs | 11 +- .../TravelCompany/ImplementersForm.cs | 19 +-- TravelCompany/TravelCompany/Program.cs | 109 +++++++-------- .../BusinessLogic/BackUpLogic.cs | 97 ++++++++++++++ .../Attributes/ColumnAttribute.cs | 25 ++++ .../Attributes/GridViewAutoSize.cs | 21 +++ .../BindingModels/BackUpSaveBinidngModel.cs | 7 + .../BindingModels/MessageInfoBindingModel.cs | 4 +- .../BusinessLogicsContracts/IBackUpLogic.cs | 9 ++ .../DI/DependencyManager.cs | 61 +++++++++ .../DI/IDependencyContainer.cs | 35 +++++ .../DI/IImplementationExtension.cs | 17 +++ .../DI/ServiceDependencyContainer.cs | 57 ++++++++ .../DI/ServiceProviderLoader.cs | 55 ++++++++ .../StoragesContracts/IBackUpInfo.cs | 9 ++ .../ViewModels/ClientViewModel.cs | 9 +- .../ViewModels/ComponentViewModel.cs | 7 +- .../ViewModels/ImplementerViewModel.cs | 21 +-- .../ViewModels/MessageInfoViewModel.cs | 31 ++--- .../ViewModels/OrderViewModel.cs | 33 +++-- .../ViewModels/ReportOrdersViewModel.cs | 1 + .../ViewModels/TravelViewModel.cs | 8 +- .../Models/IImplementerModel.cs | 4 +- .../Models/IMessageInfoModel.cs | 2 +- .../ImplementationExtension.cs | 22 ++++ .../Implements/BackUpInfo.cs | 27 ++++ .../Models/Client.cs | 25 ++-- .../Models/Component.cs | 8 ++ .../Models/Implementer.cs | 23 +++- .../Models/MessageInfo.cs | 30 ++++- .../Models/Order.cs | 19 +++ .../Models/Travel.cs | 14 +- .../TravelCompanyDatabaseImplement.csproj | 4 + .../DataFileSingleton.cs | 2 +- .../ImplementationExtension.cs | 22 ++++ .../Implements/BackUpInfo.cs | 39 ++++++ .../Models/Client.cs | 7 + .../Models/Component.cs | 5 + .../Models/Implementer.cs | 21 ++- .../Models/MessageInfo.cs | 11 ++ .../Models/Order.cs | 13 +- .../Models/Travel.cs | 5 + .../TravelCompanyFileImplement.csproj | 3 + .../DataListSingleton.cs | 7 + .../ImplementationExtension.cs | 27 ++++ .../Implements/BackUpInfo.cs | 22 ++++ .../Models/MessageInfo.cs | 2 + .../TravelCompanyListImplement.csproj | 3 + 60 files changed, 1017 insertions(+), 343 deletions(-) create mode 100644 TravelCompany/ImplementationExtensions/TravelCompanyContracts.dll create mode 100644 TravelCompany/ImplementationExtensions/TravelCompanyDataModels.dll create mode 100644 TravelCompany/ImplementationExtensions/TravelCompanyDatabaseImplement.dll create mode 100644 TravelCompany/ImplementationExtensions/TravelCompanyFileImplement.dll create mode 100644 TravelCompany/ImplementationExtensions/TravelCompanyListImplement.dll create mode 100644 TravelCompany/TravelCompany/DataGridViewExtension.cs create mode 100644 TravelCompany/TravelCompanyBusinessLogic/BusinessLogic/BackUpLogic.cs create mode 100644 TravelCompany/TravelCompanyContracts/Attributes/ColumnAttribute.cs create mode 100644 TravelCompany/TravelCompanyContracts/Attributes/GridViewAutoSize.cs create mode 100644 TravelCompany/TravelCompanyContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 TravelCompany/TravelCompanyContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 TravelCompany/TravelCompanyContracts/DI/DependencyManager.cs create mode 100644 TravelCompany/TravelCompanyContracts/DI/IDependencyContainer.cs create mode 100644 TravelCompany/TravelCompanyContracts/DI/IImplementationExtension.cs create mode 100644 TravelCompany/TravelCompanyContracts/DI/ServiceDependencyContainer.cs create mode 100644 TravelCompany/TravelCompanyContracts/DI/ServiceProviderLoader.cs create mode 100644 TravelCompany/TravelCompanyContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 TravelCompany/TravelCompanyDatabaseImplement/ImplementationExtension.cs create mode 100644 TravelCompany/TravelCompanyDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 TravelCompany/TravelCompanyFileImplement/ImplementationExtension.cs create mode 100644 TravelCompany/TravelCompanyFileImplement/Implements/BackUpInfo.cs create mode 100644 TravelCompany/TravelCompanyListImplement/ImplementationExtension.cs create mode 100644 TravelCompany/TravelCompanyListImplement/Implements/BackUpInfo.cs diff --git a/TravelCompany/ImplementationExtensions/TravelCompanyContracts.dll b/TravelCompany/ImplementationExtensions/TravelCompanyContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..4817eb1fa76b666d2061d4183d522fd01d105d10 GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/TravelCompany/ImplementationExtensions/TravelCompanyDataModels.dll b/TravelCompany/ImplementationExtensions/TravelCompanyDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..cc8d88968dcdadc99f712234d3cfcb094181b0b8 GIT binary patch literal 6144 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 HzXJaP2}oj# literal 0 HcmV?d00001 diff --git a/TravelCompany/ImplementationExtensions/TravelCompanyDatabaseImplement.dll b/TravelCompany/ImplementationExtensions/TravelCompanyDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..85163efe6e9859aa485b2fc734e179b61c15a53d GIT binary patch literal 76288 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 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/TravelCompany/TravelCompany/FormClients.cs b/TravelCompany/TravelCompany/FormClients.cs index 5e4c35e..b3c7a34 100644 --- a/TravelCompany/TravelCompany/FormClients.cs +++ b/TravelCompany/TravelCompany/FormClients.cs @@ -28,18 +28,7 @@ namespace TravelCompany.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ClientFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Email"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } + DataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) diff --git a/TravelCompany/TravelCompany/FormComponents.cs b/TravelCompany/TravelCompany/FormComponents.cs index 6fc3a44..39eafdd 100644 --- a/TravelCompany/TravelCompany/FormComponents.cs +++ b/TravelCompany/TravelCompany/FormComponents.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using TravelCompanyContracts.DI; namespace TravelCompany.Forms { @@ -51,13 +52,10 @@ namespace TravelCompany.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -65,14 +63,12 @@ namespace TravelCompany.Forms { 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/TravelCompany/TravelCompany/FormMain.Designer.cs b/TravelCompany/TravelCompany/FormMain.Designer.cs index 2f74bf1..77600c2 100644 --- a/TravelCompany/TravelCompany/FormMain.Designer.cs +++ b/TravelCompany/TravelCompany/FormMain.Designer.cs @@ -40,13 +40,14 @@ компонентыПоПутёвкамToolStripMenuItem = new ToolStripMenuItem(); списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); запускРаботToolStripMenuItem = new ToolStripMenuItem(); + почтаToolStripMenuItem = new ToolStripMenuItem(); buttonCreateOrder = new Button(); buttonTakeOrderInWork = new Button(); buttonOrderReady = new Button(); buttonIssuedOrder = new Button(); buttonRef = new Button(); dataGridView = new DataGridView(); - почтаToolStripMenuItem = new ToolStripMenuItem(); + создатьБекапToolStripMenuItem = new ToolStripMenuItem(); toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -54,7 +55,7 @@ // toolStrip1 // toolStrip1.ImageScalingSize = new Size(20, 20); - toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem }); + toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem, создатьБекапToolStripMenuItem }); toolStrip1.Location = new Point(0, 0); toolStrip1.Name = "toolStrip1"; toolStrip1.Size = new Size(969, 25); @@ -74,28 +75,28 @@ // компонентыToolStripMenuItem // компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(180, 22); + компонентыToolStripMenuItem.Size = new Size(174, 22); компонентыToolStripMenuItem.Text = "Компоненты"; компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; // // ПутёвкиToolStripMenuItem // ПутёвкиToolStripMenuItem.Name = "ПутёвкиToolStripMenuItem"; - ПутёвкиToolStripMenuItem.Size = new Size(180, 22); + ПутёвкиToolStripMenuItem.Size = new Size(174, 22); ПутёвкиToolStripMenuItem.Text = "Туристич. путёвки"; ПутёвкиToolStripMenuItem.Click += консервыToolStripMenuItem_Click; // // клиентыToolStripMenuItem // клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(180, 22); + клиентыToolStripMenuItem.Size = new Size(174, 22); клиентыToolStripMenuItem.Text = "Клиенты"; клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; // // исполнителиToolStripMenuItem // исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(180, 22); + исполнителиToolStripMenuItem.Size = new Size(174, 22); исполнителиToolStripMenuItem.Text = "Исполнители"; исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; // @@ -134,6 +135,13 @@ запускРаботToolStripMenuItem.Text = "Запуск работ"; запускРаботToolStripMenuItem.Click += запускРаботToolStripMenuItem_Click; // + // почтаToolStripMenuItem + // + почтаToolStripMenuItem.Name = "почтаToolStripMenuItem"; + почтаToolStripMenuItem.Size = new Size(53, 25); + почтаToolStripMenuItem.Text = "Почта"; + почтаToolStripMenuItem.Click += почтаToolStripMenuItem_Click; + // // buttonCreateOrder // buttonCreateOrder.Location = new Point(800, 56); @@ -196,12 +204,12 @@ dataGridView.Size = new Size(763, 435); dataGridView.TabIndex = 6; // - // почтаToolStripMenuItem + // создатьБекапToolStripMenuItem // - почтаToolStripMenuItem.Name = "почтаToolStripMenuItem"; - почтаToolStripMenuItem.Size = new Size(53, 25); - почтаToolStripMenuItem.Text = "Почта"; - почтаToolStripMenuItem.Click += почтаToolStripMenuItem_Click; + создатьБекапToolStripMenuItem.Name = "создатьБекапToolStripMenuItem"; + создатьБекапToolStripMenuItem.Size = new Size(97, 25); + создатьБекапToolStripMenuItem.Text = "Создать Бекап"; + создатьБекапToolStripMenuItem.Click += createBackUpToolStripMenuItem_Click; // // FormMain // @@ -245,5 +253,6 @@ private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem почтаToolStripMenuItem; + private ToolStripMenuItem создатьБекапToolStripMenuItem; } } \ No newline at end of file diff --git a/TravelCompany/TravelCompany/FormMain.cs b/TravelCompany/TravelCompany/FormMain.cs index a2e0865..69e7485 100644 --- a/TravelCompany/TravelCompany/FormMain.cs +++ b/TravelCompany/TravelCompany/FormMain.cs @@ -11,6 +11,7 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using TravelCompanyBusinessLogic.BusinessLogic; +using TravelCompanyContracts.DI; namespace TravelCompany.Forms { @@ -20,13 +21,17 @@ namespace TravelCompany.Forms 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) { @@ -34,52 +39,32 @@ namespace TravelCompany.Forms } private void LoadData() { - _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["TravelId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - dataGridView.Columns["TravelName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 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(FormTravels)); - - if (service is FormTravels form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void buttonCreateOrder_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); } private void buttonTakeOrderInWork_Click(object sender, EventArgs e) { @@ -164,72 +149,71 @@ namespace TravelCompany.Forms using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; if (dialog.ShowDialog() == DialogResult.OK) { - _reportLogic.SaveTravelsToWordFile(new ReportBindingModel - { - FileName = dialog.FileName - }); - MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, - MessageBoxIcon.Information); + _reportLogic.SaveTravelsToWordFile(new ReportBindingModel { FileName = dialog.FileName }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void компонентыПоПутёвкамToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormReportTravelComponents)); - if (service is FormReportTravelComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void списокЗаказовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - if (service is FormReportOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void запускРабот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(ImplementersForm)); - if (service is ImplementersForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void почтаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormViewMail)); - if (service is FormViewMail form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } + + private void createBackUpToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + 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/TravelCompany/TravelCompany/FormTravel.cs b/TravelCompany/TravelCompany/FormTravel.cs index 2dd37b9..6b26778 100644 --- a/TravelCompany/TravelCompany/FormTravel.cs +++ b/TravelCompany/TravelCompany/FormTravel.cs @@ -12,6 +12,8 @@ using System.Windows.Forms; using TravelCompanyContracts.BusinessLogicsContracts; using TravelCompanyContracts.SearchModels; using TravelCompanyContracts.BindingModels; +using TravelCompanyContracts.DI; +using TravelCompanyDatabaseImplement.Models; namespace TravelCompany.Forms { @@ -20,14 +22,14 @@ namespace TravelCompany.Forms private readonly ILogger _logger; private readonly ITravelLogic _logic; private int? _id; - private Dictionary _productComponents; + private Dictionary _travelComponents; public int Id { set { _id = value; } } public FormTravel(ILogger logger, ITravelLogic logic) { InitializeComponent(); _logger = logger; _logic = logic; - _productComponents = new Dictionary(); + _travelComponents = new Dictionary(); } private void FormTravel_Load(object sender, EventArgs e) { @@ -44,7 +46,7 @@ namespace TravelCompany.Forms { textBoxName.Text = view.TravelName; textBoxPrice.Text = view.Price.ToString(); - _productComponents = view.TravelComponents ?? new Dictionary(); + _travelComponents = view.TravelComponents ?? new Dictionary(); LoadData(); } } @@ -59,10 +61,10 @@ namespace TravelCompany.Forms _logger.LogInformation("Загрузка компонент изделия"); try { - if (_productComponents != null) + if (_travelComponents != null) { dataGridView.Rows.Clear(); - foreach (var pc in _productComponents) + foreach (var pc in _travelComponents) { dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); } @@ -76,51 +78,44 @@ namespace TravelCompany.Forms } private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormTravelComponent)); - if (service is FormTravelComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { + return; + } + _logger.LogInformation("Добавление нового ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + if (_travelComponents.ContainsKey(form.Id)) + { + _travelComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _travelComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } + private void buttonUpd_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _travelComponents[id].Item2; if (form.ShowDialog() == DialogResult.OK) { if (form.ComponentModel == null) { return; } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count} ", form.ComponentModel.ComponentName, form.Count); - if (_productComponents.ContainsKey(form.Id)) - { - _productComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _productComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } + _logger.LogInformation("Изменение ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + _travelComponents[form.Id] = (form.ComponentModel, form.Count); LoadData(); } } } - private void buttonUpd_Click(object sender, EventArgs e) - { - if (dataGridView.SelectedRows.Count == 1) - { - var service = Program.ServiceProvider?.GetService(typeof(FormTravelComponent)); - if (service is FormTravelComponent form) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _productComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _productComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } private void buttonDel_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) @@ -130,7 +125,7 @@ namespace TravelCompany.Forms try { _logger.LogInformation("Удаление компонента: { ComponentName} - { Count}", dataGridView.SelectedRows[0].Cells[1].Value); - _productComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); + _travelComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); } catch (Exception ex) { @@ -156,7 +151,7 @@ namespace TravelCompany.Forms MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (_productComponents == null || _productComponents.Count == 0) + if (_travelComponents == null || _travelComponents.Count == 0) { MessageBox.Show("Заполните компоненты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -169,7 +164,7 @@ namespace TravelCompany.Forms Id = _id ?? 0, TravelName = textBoxName.Text, Price = Convert.ToDouble(textBoxPrice.Text), - TravelComponents = _productComponents + TravelComponents = _travelComponents }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) @@ -195,7 +190,7 @@ namespace TravelCompany.Forms private double CalcPrice() { double price = 0; - foreach (var elem in _productComponents) + foreach (var elem in _travelComponents) { price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); } diff --git a/TravelCompany/TravelCompany/FormTravels.cs b/TravelCompany/TravelCompany/FormTravels.cs index b772ffd..cbf0703 100644 --- a/TravelCompany/TravelCompany/FormTravels.cs +++ b/TravelCompany/TravelCompany/FormTravels.cs @@ -11,6 +11,7 @@ using TravelCompany; using TravelCompanyContracts.BindingModels; using TravelCompanyContracts.BusinessLogicsContracts; using Microsoft.Extensions.Logging; +using TravelCompanyContracts.DI; namespace TravelCompany.Forms { @@ -34,14 +35,7 @@ namespace TravelCompany.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["TravelComponents"].Visible = false; - dataGridView.Columns["TravelName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка путёвок"); } catch (Exception ex) @@ -52,13 +46,10 @@ namespace TravelCompany.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormTravel)); - if (service is FormTravel form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -66,14 +57,11 @@ namespace TravelCompany.Forms { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormTravel)); - if (service is FormTravel 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/TravelCompany/TravelCompany/FormViewMail.cs b/TravelCompany/TravelCompany/FormViewMail.cs index 278477b..9862810 100644 --- a/TravelCompany/TravelCompany/FormViewMail.cs +++ b/TravelCompany/TravelCompany/FormViewMail.cs @@ -27,15 +27,8 @@ namespace TravelCompany.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка списка писем"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка списка писем"); } catch (Exception ex) { diff --git a/TravelCompany/TravelCompany/ImplementersForm.cs b/TravelCompany/TravelCompany/ImplementersForm.cs index bcef90a..f5d947e 100644 --- a/TravelCompany/TravelCompany/ImplementersForm.cs +++ b/TravelCompany/TravelCompany/ImplementersForm.cs @@ -33,22 +33,9 @@ namespace TravelCompany.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView1.DataSource = list; - dataGridView1.Columns["Id"].Visible = false; - dataGridView1.Columns["ImplementerFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Qualification"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["WorkExperience"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); - } + dataGridView1.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка исполнителей"); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки исполнителей"); diff --git a/TravelCompany/TravelCompany/Program.cs b/TravelCompany/TravelCompany/Program.cs index 44b00a9..53b2ffc 100644 --- a/TravelCompany/TravelCompany/Program.cs +++ b/TravelCompany/TravelCompany/Program.cs @@ -9,6 +9,8 @@ using TravelCompanyBusinessLogic.OfficePackage.Implements; using TravelCompanyBusinessLogic.OfficePackage; using TravelCompanyBusinessLogic.MailWorker; using TravelCompanyContracts.BindingModels; +using TravelCompanyContracts.DI; + namespace TravelCompany.Forms @@ -26,86 +28,69 @@ namespace TravelCompany.Forms // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + InitDependency(); try { - var mailSender = - _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { - MailLogin = - System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? - string.Empty, - MailPassword = - System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? - string.Empty, - SmtpClientHost = - System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? - string.Empty, - SmtpClientPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), - PopHost = - System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, - PopPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) + MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, + MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, + SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty, + SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), + 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); + + var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } catch (Exception ex) { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, " "); + var logger = DependencyManager.Instance.Resolve(); + logger?.LogError(ex, "Mails Problem"); } - - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); } - private static void MailCheck(object obj) => -ServiceProvider?.GetService()?.MailCheck(); + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); } } \ No newline at end of file diff --git a/TravelCompany/TravelCompanyBusinessLogic/BusinessLogic/BackUpLogic.cs b/TravelCompany/TravelCompanyBusinessLogic/BusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..6c07060 --- /dev/null +++ b/TravelCompany/TravelCompanyBusinessLogic/BusinessLogic/BackUpLogic.cs @@ -0,0 +1,97 @@ +using Microsoft.Extensions.Logging; +using TravelCompanyContracts.BindingModels; +using TravelCompanyContracts.BusinessLogicsContracts; +using TravelCompanyContracts.StoragesContracts; +using TravelCompanyDataModels; +using System.IO.Compression; +using System.Reflection; +using System.Runtime.Serialization.Json; + +namespace TravelCompanyBusinessLogic.BusinessLogic +{ + 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/TravelCompany/TravelCompanyContracts/Attributes/ColumnAttribute.cs b/TravelCompany/TravelCompanyContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..7f23069 --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,25 @@ +namespace TravelCompanyContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + + public bool Visible { get; private set; } + + public int Width { get; private set; } + + public GridViewAutoSize GridViewAutoSize { get; private set; } + + public bool IsUseAutoSize { get; private set; } + + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} diff --git a/TravelCompany/TravelCompanyContracts/Attributes/GridViewAutoSize.cs b/TravelCompany/TravelCompanyContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..832915e --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,21 @@ +namespace TravelCompanyContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} diff --git a/TravelCompany/TravelCompanyContracts/BindingModels/BackUpSaveBinidngModel.cs b/TravelCompany/TravelCompanyContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..8773e78 --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,7 @@ +namespace TravelCompanyContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/TravelCompany/TravelCompanyContracts/BindingModels/MessageInfoBindingModel.cs b/TravelCompany/TravelCompanyContracts/BindingModels/MessageInfoBindingModel.cs index 875253e..fcac675 100644 --- a/TravelCompany/TravelCompanyContracts/BindingModels/MessageInfoBindingModel.cs +++ b/TravelCompany/TravelCompanyContracts/BindingModels/MessageInfoBindingModel.cs @@ -20,5 +20,7 @@ namespace TravelCompanyContracts.BindingModels public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } - } + public int Id => throw new NotImplementedException(); + + } } diff --git a/TravelCompany/TravelCompanyContracts/BusinessLogicsContracts/IBackUpLogic.cs b/TravelCompany/TravelCompanyContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..ad3dd56 --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,9 @@ +using TravelCompanyContracts.BindingModels; + +namespace TravelCompanyContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/TravelCompany/TravelCompanyContracts/DI/DependencyManager.cs b/TravelCompany/TravelCompanyContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..65eab9b --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/DI/DependencyManager.cs @@ -0,0 +1,61 @@ +using Microsoft.Extensions.Logging; + +namespace TravelCompanyContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + + private static DependencyManager? _manager; + + private static readonly object _locjObject = new(); + + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + /// + /// Иницализация библиотек, в которых идут установки зависомстей + /// + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + + /// + /// Регистрация логгера + /// + /// + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/TravelCompany/TravelCompanyContracts/DI/IDependencyContainer.cs b/TravelCompany/TravelCompanyContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..65458cd --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/DI/IDependencyContainer.cs @@ -0,0 +1,35 @@ +using Microsoft.Extensions.Logging; + +namespace TravelCompanyContracts.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/TravelCompany/TravelCompanyContracts/DI/IImplementationExtension.cs b/TravelCompany/TravelCompanyContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..d9e9ace --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TravelCompanyContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/TravelCompany/TravelCompanyContracts/DI/ServiceDependencyContainer.cs b/TravelCompany/TravelCompanyContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..910ec3c --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,57 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace TravelCompanyContracts.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/TravelCompany/TravelCompanyContracts/DI/ServiceProviderLoader.cs b/TravelCompany/TravelCompanyContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..3394796 --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace TravelCompanyContracts.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/TravelCompany/TravelCompanyContracts/StoragesContracts/IBackUpInfo.cs b/TravelCompany/TravelCompanyContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..127a04c --- /dev/null +++ b/TravelCompany/TravelCompanyContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,9 @@ +namespace TravelCompanyContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/ClientViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/ClientViewModel.cs index 43324d1..d56ef4f 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/ClientViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/ClientViewModel.cs @@ -1,16 +1,19 @@ using TravelCompanyDataModels.Models; using System.ComponentModel; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class ClientViewModel : IClientModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО клиента")] + [Column(title: "ФИО клиента", width: 150)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] + [Column(title: "Логин (эл. почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 150)] public string Password { get; set; } = string.Empty; } } diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/ComponentViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/ComponentViewModel.cs index f865958..65f9a4c 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/ComponentViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/ComponentViewModel.cs @@ -5,15 +5,18 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class ComponentViewModel : IComponentModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название компонента")] + [Column(title: "Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 150)] public double Cost { get; set; } } } diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/ImplementerViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/ImplementerViewModel.cs index f4fa3a2..7987235 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/ImplementerViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/ImplementerViewModel.cs @@ -5,19 +5,22 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Стаж работы")] - public int WorkExperience { get; set; } = 0; - [DisplayName("Квалификация")] - public int Qualification { get; set; } = 0; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column(visible: false)] + public int Id { get; set; } + [Column(title: "ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; + [Column(title: "Стаж работы", width: 60)] + public int WorkExperience { get; set; } = 0; + [Column(title: "Квалификация", width: 60)] + public int Qualification { get; set; } = 0; + [Column(title: "Пароль", width: 100)] + public string Password { get; set; } = string.Empty; } } diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/MessageInfoViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/MessageInfoViewModel.cs index 9f211c5..f564c6d 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/MessageInfoViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/MessageInfoViewModel.cs @@ -1,24 +1,25 @@ using TravelCompanyDataModels.Models; using System.ComponentModel; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; - - public int? ClientId { get; set; } - - [DisplayName("Отправитель")] - public string SenderName { get; set; } = string.Empty; - - [DisplayName("Дата письма")] - public DateTime DateDelivery { get; set; } - - [DisplayName("Заголовок")] - public string Subject { get; set; } = string.Empty; - - [DisplayName("Текст")] - public string Body { get; set; } = string.Empty; + [Column(visible: false)] + public int Id { get; set; } + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public int? ClientId { get; set; } + [Column(title: "Отправитель", width: 150)] + public string SenderName { get; set; } = string.Empty; + [Column(title: "Дата письма", width: 120)] + public DateTime DateDelivery { get; set; } + [Column(title: "Заголовок", width: 120)] + public string Subject { get; set; } = string.Empty; + [Column(title: "Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Body { get; set; } = string.Empty; } } \ No newline at end of file diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/OrderViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/OrderViewModel.cs index 652ff88..4e63e8d 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/OrderViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/OrderViewModel.cs @@ -1,39 +1,36 @@ -using TravelCompanyDataModels; -using TravelCompanyDataModels.Enums; +using TravelCompanyDataModels.Enums; using TravelCompanyDataModels.Models; -using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using TravelCompanyDataModels.Enums; -using TravelCompanyDataModels.Models; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] + [Column(title: "Номер", width: 90)] public int Id { get; set; } + [Column(visible: false)] public int TravelId { get; set; } + [Column(visible: false)] public int ClientId { get; set; } + [Column(visible: false)] public int? ImplementerId { get; set; } = null; - [DisplayName("Клиент")] + [Column(title: "Клиент", width: 190)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Путёвка")] + [Column(title: "Путёвка", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string TravelName { get; set; } = string.Empty; - [DisplayName("Исполнитель")] + [Column(title: "Исполнитель", width: 150)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] + [Column(title: "Количество", width: 100)] public int Count { get; set; } - [DisplayName("Сумма")] + [Column(title: "Сумма", width: 120)] public double Sum { get; set; } - [DisplayName("Статус")] + [Column(title: "Статус", width: 70)] public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] + [Column(title: "Дата создания", width: 120)] public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] + [Column(title: "Дата выполнения", width: 120)] public DateTime? DateImplement { get; set; } } } diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/ReportOrdersViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/ReportOrdersViewModel.cs index 01d230a..b131b0d 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/ReportOrdersViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/ReportOrdersViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; + namespace TravelCompanyContracts.ViewModels { public class ReportOrdersViewModel diff --git a/TravelCompany/TravelCompanyContracts/ViewModels/TravelViewModel.cs b/TravelCompany/TravelCompanyContracts/ViewModels/TravelViewModel.cs index d8c1e55..f20fa26 100644 --- a/TravelCompany/TravelCompanyContracts/ViewModels/TravelViewModel.cs +++ b/TravelCompany/TravelCompanyContracts/ViewModels/TravelViewModel.cs @@ -5,16 +5,20 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using TravelCompanyContracts.Attributes; + namespace TravelCompanyContracts.ViewModels { public class TravelViewModel : ITravelModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название изделия")] + [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string TravelName { get; set; } - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Price { get; set; } + [Column(visible: false)] public Dictionary TravelComponents { get; set; } = new(); } diff --git a/TravelCompany/TravelCompanyDataModels/Models/IImplementerModel.cs b/TravelCompany/TravelCompanyDataModels/Models/IImplementerModel.cs index 28258f8..eed3b30 100644 --- a/TravelCompany/TravelCompanyDataModels/Models/IImplementerModel.cs +++ b/TravelCompany/TravelCompanyDataModels/Models/IImplementerModel.cs @@ -6,8 +6,8 @@ using System.Threading.Tasks; namespace TravelCompanyDataModels { - public interface IImplementerModel - { + public interface IImplementerModel : IId + { string ImplementerFIO { get; } string Password { get; } int WorkExperience { get; } diff --git a/TravelCompany/TravelCompanyDataModels/Models/IMessageInfoModel.cs b/TravelCompany/TravelCompanyDataModels/Models/IMessageInfoModel.cs index 329a26f..810775b 100644 --- a/TravelCompany/TravelCompanyDataModels/Models/IMessageInfoModel.cs +++ b/TravelCompany/TravelCompanyDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace TravelCompanyDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/TravelCompany/TravelCompanyDatabaseImplement/ImplementationExtension.cs b/TravelCompany/TravelCompanyDatabaseImplement/ImplementationExtension.cs new file mode 100644 index 0000000..06943c8 --- /dev/null +++ b/TravelCompany/TravelCompanyDatabaseImplement/ImplementationExtension.cs @@ -0,0 +1,22 @@ +using TravelCompanyContracts.DI; +using TravelCompanyContracts.StoragesContracts; +using TravelCompanyDatabaseImplement.Implements; + +namespace TravelCompanyDatabaseImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 3; + + 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/TravelCompany/TravelCompanyDatabaseImplement/Implements/BackUpInfo.cs b/TravelCompany/TravelCompanyDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..7304985 --- /dev/null +++ b/TravelCompany/TravelCompanyDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,27 @@ +using TravelCompanyContracts.StoragesContracts; + +namespace TravelCompanyDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new TravelCompanyDataBase(); + 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/TravelCompany/TravelCompanyDatabaseImplement/Models/Client.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/Client.cs index 81a719f..d0de4bb 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/Client.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/Client.cs @@ -5,21 +5,28 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Runtime.Serialization; + namespace TravelCompanyDatabaseImplement.Models { - public class Client : IClientModel - { - public int Id { get; private set; } + [DataContract] - [Required] + public class Client : IClientModel + { + [DataMember] + public int Id { get; private set; } + + [DataMember] + [Required] public string ClientFIO { get; set; } = string.Empty; - [Required] + + [DataMember] + [Required] public string Email { get; set; } = string.Empty; - [Required] + + [DataMember] + [Required] public string Password { get; set; } = string.Empty; [ForeignKey("ClientId")] diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/Component.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/Component.cs index 81fc7a6..275f3eb 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/Component.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/Component.cs @@ -8,16 +8,24 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace TravelCompanyDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + + [DataMember] [Required] public string ComponentName { get; private set; } = string.Empty; + + [DataMember] [Required] public double Cost { get; set; } + [ForeignKey("ComponentId")] public virtual List TravelComponents { get; set; } = new(); diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/Implementer.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/Implementer.cs index 246f216..3263a05 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/Implementer.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/Implementer.cs @@ -8,19 +8,30 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace TravelCompanyDatabaseImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; private set; } - [Required] + [DataMember] + public int Id { get; private set; } + + [DataMember] + [Required] public string ImplementerFIO { get; private set; } = string.Empty; - [Required] + + [DataMember] + [Required] public string Password { get; set; } = string.Empty; - [Required] + + [DataMember] + [Required] public int Qualification { get; set; } = 0; - [Required] + + [DataMember] + [Required] public int WorkExperience { get; set; } = 0; [ForeignKey("ImplementerId")] public virtual List Orders { get; set; } = diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/MessageInfo.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/MessageInfo.cs index 043b74b..e3c00cb 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/MessageInfo.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/MessageInfo.cs @@ -2,23 +2,39 @@ using TravelCompanyContracts.ViewModels; using TravelCompanyDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace TravelCompanyDatabaseImplement.Models { public class MessageInfo : IMessageInfoModel { - [Key] - public string MessageId { get; private set; } = string.Empty; + [NotMapped] + public int Id { get; private set; } - public int? ClientId { get; private set; } + [DataMember] + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public string MessageId { get; private set; } = string.Empty; - public string SenderName { get; private set; } = string.Empty; + [DataMember] + public int? ClientId { get; private set; } - public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] + [Required] + public string SenderName { get; private set; } = string.Empty; - public string Subject { get; private set; } = string.Empty; + [DataMember] + [Required] + public DateTime DateDelivery { get; private set; } = DateTime.Now; - public string Body { get; private set; } = string.Empty; + [DataMember] + [Required] + public string Subject { get; private set; } = string.Empty; + + [DataMember] + [Required] + public string Body { get; private set; } = string.Empty; public Client? Client { get; private set; } diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/Order.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/Order.cs index bc0085c..ab6593d 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/Order.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/Order.cs @@ -5,27 +5,46 @@ using TravelCompanyDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace TravelCompanyDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } + + [DataMember] [Required] public int Count { get; private set; } + + [DataMember] [Required] public double Sum { get; private set; } + + [DataMember] [Required] public OrderStatus Status { get; private set; } + + [DataMember] [Required] public DateTime DateCreate { get; private set; } + + [DataMember] public DateTime? DateImplement { get; private set; } + + [DataMember] [Required] public int TravelId { get; private set; } public virtual Travel Travel { get; private set; } + + [DataMember] [Required] public int ClientId { get; private set; } public virtual Client Client { get; private set; } + + [DataMember] public int? ImplementerId { get; private set; } = null; public virtual Implementer? Implementer { get; private set; } public static Order? Create(TravelCompanyDataBase context, OrderBindingModel model) diff --git a/TravelCompany/TravelCompanyDatabaseImplement/Models/Travel.cs b/TravelCompany/TravelCompanyDatabaseImplement/Models/Travel.cs index 88ffaa3..cfb229f 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/Models/Travel.cs +++ b/TravelCompany/TravelCompanyDatabaseImplement/Models/Travel.cs @@ -8,18 +8,28 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace TravelCompanyDatabaseImplement.Models { + [DataContract] public class Travel : ITravelModel { + + [DataMember] public int Id { get; set; } + + [DataMember] [Required] public string TravelName { get; set; } = string.Empty; + + [DataMember] [Required] public double Price { get; set; } - private Dictionary? _TravelComponents = - null; + + private Dictionary? _TravelComponents = null; + + [DataMember] [NotMapped] public Dictionary TravelComponents { diff --git a/TravelCompany/TravelCompanyDatabaseImplement/TravelCompanyDatabaseImplement.csproj b/TravelCompany/TravelCompanyDatabaseImplement/TravelCompanyDatabaseImplement.csproj index f023f35..196f97c 100644 --- a/TravelCompany/TravelCompanyDatabaseImplement/TravelCompanyDatabaseImplement.csproj +++ b/TravelCompany/TravelCompanyDatabaseImplement/TravelCompanyDatabaseImplement.csproj @@ -19,4 +19,8 @@ + + + + diff --git a/TravelCompany/TravelCompanyFileImplement/DataFileSingleton.cs b/TravelCompany/TravelCompanyFileImplement/DataFileSingleton.cs index d38f67d..eecd3a9 100644 --- a/TravelCompany/TravelCompanyFileImplement/DataFileSingleton.cs +++ b/TravelCompany/TravelCompanyFileImplement/DataFileSingleton.cs @@ -25,6 +25,7 @@ namespace TravelCompanyFileImplement public List Implementers { get; private set; } public List Messages { get; private set; } + public static DataFileSingleton GetInstance() { if (instance == null) @@ -53,7 +54,6 @@ namespace TravelCompanyFileImplement Implementer.Create(x)!)!; Messages = LoadData(MessageInfoFileName, "MessageInfo", x => MessageInfo.Create(x)!)!; - } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) { diff --git a/TravelCompany/TravelCompanyFileImplement/ImplementationExtension.cs b/TravelCompany/TravelCompanyFileImplement/ImplementationExtension.cs new file mode 100644 index 0000000..a9d45d9 --- /dev/null +++ b/TravelCompany/TravelCompanyFileImplement/ImplementationExtension.cs @@ -0,0 +1,22 @@ +using TravelCompanyContracts.DI; +using TravelCompanyContracts.StoragesContracts; +using TravelCompanyFileImplement.Implements; + +namespace TravelCompanyFileImplement +{ + public class ImplementationExtension : 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/TravelCompany/TravelCompanyFileImplement/Implements/BackUpInfo.cs b/TravelCompany/TravelCompanyFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..d9d396f --- /dev/null +++ b/TravelCompany/TravelCompanyFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,39 @@ +using TravelCompanyContracts.StoragesContracts; +using System.Reflection; + +namespace TravelCompanyFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + private readonly DataFileSingleton source; + private readonly PropertyInfo[] sourceProperties; + + public BackUpInfo() + { + source = DataFileSingleton.GetInstance(); + sourceProperties = source.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public); + } + + public List? GetList() where T : class, new() + { + var requredType = typeof(T); + return (List?)sourceProperties.FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == requredType) + ?.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/TravelCompany/TravelCompanyFileImplement/Models/Client.cs b/TravelCompany/TravelCompanyFileImplement/Models/Client.cs index 226b29d..1e93e22 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/Client.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/Client.cs @@ -9,14 +9,21 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace TravelCompanyFileImplement.Models { + [DataContract] + public class Client : IClientModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ClientFIO { get; private set; } = string.Empty; + [DataMember] public string Email { get; set; } = string.Empty; + [DataMember] public string Password { get; set; } = string.Empty; public static Client? Create(ClientBindingModel model) { diff --git a/TravelCompany/TravelCompanyFileImplement/Models/Component.cs b/TravelCompany/TravelCompanyFileImplement/Models/Component.cs index 0a39648..4d778b1 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/Component.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/Component.cs @@ -7,13 +7,18 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace TravelCompanyFileImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ComponentName { get; private set; } = string.Empty; + [DataMember] public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { diff --git a/TravelCompany/TravelCompanyFileImplement/Models/Implementer.cs b/TravelCompany/TravelCompanyFileImplement/Models/Implementer.cs index f08719d..5b70e68 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/Implementer.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/Implementer.cs @@ -7,17 +7,24 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace TravelCompanyFileImplement.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; set; } = string.Empty; - public int Qualification { get; set; } = 0; - public int WorkExperience { get; set; } = 0; - public static Implementer? Create(ImplementerBindingModel model) + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string Password { get; set; } = string.Empty; + [DataMember] + public int Qualification { get; set; } = 0; + [DataMember] + public int WorkExperience { get; set; } = 0; + public static Implementer? Create(ImplementerBindingModel model) { if (model == null) { diff --git a/TravelCompany/TravelCompanyFileImplement/Models/MessageInfo.cs b/TravelCompany/TravelCompanyFileImplement/Models/MessageInfo.cs index c0d8a62..9be812f 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/MessageInfo.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/MessageInfo.cs @@ -4,24 +4,35 @@ using TravelCompanyDataModels.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 TravelCompanyFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { + [DataMember] + public int Id { get; private set; } + + [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) diff --git a/TravelCompany/TravelCompanyFileImplement/Models/Order.cs b/TravelCompany/TravelCompanyFileImplement/Models/Order.cs index 1bfed3e..51ce9ed 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/Order.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/Order.cs @@ -8,23 +8,34 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace TravelCompanyFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int TravelId { get; private set; } + [DataMember] public int ClientId { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; + [DataMember] public int Count { get; private set; } + [DataMember] public double Sum { get; private set; } + [DataMember] - public OrderStatus Status { get; private set; } + public OrderStatus Status { get; private set; } + [DataMember] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] public int Id { get; private set; } diff --git a/TravelCompany/TravelCompanyFileImplement/Models/Travel.cs b/TravelCompany/TravelCompanyFileImplement/Models/Travel.cs index a493ee4..14d2ea8 100644 --- a/TravelCompany/TravelCompanyFileImplement/Models/Travel.cs +++ b/TravelCompany/TravelCompanyFileImplement/Models/Travel.cs @@ -7,13 +7,18 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace TravelCompanyFileImplement.Models { + [DataContract] public class Travel : ITravelModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string TravelName { get; private set; } = string.Empty; + [DataMember] public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _TravelComponents = null; diff --git a/TravelCompany/TravelCompanyFileImplement/TravelCompanyFileImplement.csproj b/TravelCompany/TravelCompanyFileImplement/TravelCompanyFileImplement.csproj index 2cf28e6..0953b62 100644 --- a/TravelCompany/TravelCompanyFileImplement/TravelCompanyFileImplement.csproj +++ b/TravelCompany/TravelCompanyFileImplement/TravelCompanyFileImplement.csproj @@ -11,4 +11,7 @@ + + + diff --git a/TravelCompany/TravelCompanyListImplement/DataListSingleton.cs b/TravelCompany/TravelCompanyListImplement/DataListSingleton.cs index e24c406..cebcc42 100644 --- a/TravelCompany/TravelCompanyListImplement/DataListSingleton.cs +++ b/TravelCompany/TravelCompanyListImplement/DataListSingleton.cs @@ -1,4 +1,9 @@ using TravelCompanyListImplement.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace TravelCompanyListImplement { @@ -21,6 +26,8 @@ namespace TravelCompanyListImplement Clients = new List(); Implementers = new List(); Messages = new List(); + + } public static DataListSingleton GetInstance() { diff --git a/TravelCompany/TravelCompanyListImplement/ImplementationExtension.cs b/TravelCompany/TravelCompanyListImplement/ImplementationExtension.cs new file mode 100644 index 0000000..95dcb49 --- /dev/null +++ b/TravelCompany/TravelCompanyListImplement/ImplementationExtension.cs @@ -0,0 +1,27 @@ +using TravelCompanyContracts.DI; +using TravelCompanyContracts.StoragesContracts; +using TravelCompanyListImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TravelCompanyListImplement +{ + internal class ImplementationExtension : 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/TravelCompany/TravelCompanyListImplement/Implements/BackUpInfo.cs b/TravelCompany/TravelCompanyListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..f7a7223 --- /dev/null +++ b/TravelCompany/TravelCompanyListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using TravelCompanyContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TravelCompanyListImplement.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/TravelCompany/TravelCompanyListImplement/Models/MessageInfo.cs b/TravelCompany/TravelCompanyListImplement/Models/MessageInfo.cs index 4ed93a1..13ba2f7 100644 --- a/TravelCompany/TravelCompanyListImplement/Models/MessageInfo.cs +++ b/TravelCompany/TravelCompanyListImplement/Models/MessageInfo.cs @@ -23,6 +23,8 @@ namespace TravelCompanyListImplement.Models public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); + public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) diff --git a/TravelCompany/TravelCompanyListImplement/TravelCompanyListImplement.csproj b/TravelCompany/TravelCompanyListImplement/TravelCompanyListImplement.csproj index 9ba85b1..fc03212 100644 --- a/TravelCompany/TravelCompanyListImplement/TravelCompanyListImplement.csproj +++ b/TravelCompany/TravelCompanyListImplement/TravelCompanyListImplement.csproj @@ -11,4 +11,7 @@ + + +