From 1e7f095791b7c16c83bd6e07a9151b210e206572 Mon Sep 17 00:00:00 2001 From: K Date: Thu, 16 May 2024 20:23:36 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PrecastConcretePlantContracts.dll | Bin 0 -> 32768 bytes .../PrecastConcretePlantDataModels.dll | Bin 0 -> 7168 bytes .../PrecastConcretePlantDatabaseImplement.dll | Bin 0 -> 76800 bytes .../PrecastConcretePlantFileImplement.dll | Bin 0 -> 41984 bytes .../PrecastConcretePlantListImplement.dll | Bin 0 -> 27648 bytes .../BusinessLogic/BackUpLogic.cs | 103 +++++ .../BusinessLogic/ClientLogic.cs | 2 +- .../BusinessLogic/ComponentLogic.cs | 2 +- .../BusinessLogic/ImplementerLogic.cs | 2 +- .../BusinessLogic/MessageInfoLogic.cs | 2 +- .../BusinessLogic/OrderLogic.cs | 2 +- .../BusinessLogic/ReinforcedLogic.cs | 2 +- .../BusinessLogic/ReportLogic.cs | 2 +- .../BusinessLogic/WorkModelling.cs | 2 +- .../Attributes/ColumnAttribute.cs | 31 ++ .../Attributes/GridViewAutoSize.cs | 27 ++ .../BindingModels/BackUpSaveBindingModel.cs | 13 + .../BindingModels/MessageInfoBindingModel.cs | 3 +- .../BusinessLogicsContracts/IBackUpLogic.cs | 14 + .../DI/DependencyManager.cs | 41 ++ .../DI/IDependencyContainer.cs | 20 + .../DI/IImplementationExtension.cs | 14 + .../DI/ServiceDependencyContainer.cs | 62 +++ .../DI/ServiceProviderLoader.cs | 51 +++ .../DI/UnityDependencyContainer.cs | 43 ++ .../PrecastConcretePlantContracts.csproj | 6 + .../StoragesContracts/IBackUpInfo.cs | 14 + .../ViewModels/ClientViewModel.cs | 8 +- .../ViewModels/ComponentViewModel.cs | 8 +- .../ViewModels/ImplementerViewModel.cs | 12 +- .../ViewModels/MessageInfoViewModel.cs | 28 +- .../ViewModels/OrderViewModel.cs | 29 +- .../ViewModels/ReinforcedViewModel.cs | 9 +- .../Models/IMessageInfoModel.cs | 2 +- .../DatabaseImplementationExtension.cs | 27 ++ .../Implements/BackUpInfo.cs | 32 ++ .../Models/Client.cs | 16 +- .../Models/Component.cs | 5 + .../Models/Implementer.cs | 19 +- .../Models/MessageInfo.cs | 33 +- .../Models/Order.cs | 18 +- .../Models/Reinforced.cs | 6 + ...ecastConcretePlantDatabaseImplement.csproj | 4 + .../FileImplementationExtension.cs | 27 ++ .../Implements/BackUpInfo.cs | 44 ++ .../Models/Client.cs | 6 + .../Models/Component.cs | 7 + .../Models/Implementer.cs | 19 +- .../Models/MessageInfo.cs | 25 +- .../Models/Order.cs | 18 +- .../Models/Reinforced.cs | 10 + .../PrecastConcretePlantFileImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 22 + .../ListImplementationExtension.cs | 27 ++ .../Models/MessageInfo.cs | 3 +- .../PrecastConcretePlantListImplement.csproj | 4 + .../PrecastConcretePlantRestApi/Program.cs | 2 +- .../DataGridViewExtension.cs | 52 +++ .../PrecastConcretePlantView/FormClients.cs | 8 +- .../FormComponentS.cs | 30 +- .../FormCreateOrder.cs | 2 +- .../FormImplementerS.cs | 37 +- .../PrecastConcretePlantView/FormMail.cs | 11 +- .../FormMain.Designer.cs | 381 +++++++++--------- .../PrecastConcretePlantView/FormMain.cs | 126 +++--- .../FormReinforced.cs | 59 ++- .../FormReinforcedS.cs | 33 +- .../PrecastConcretePlantView/Program.cs | 92 ++--- 68 files changed, 1261 insertions(+), 502 deletions(-) create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantFileImplement.dll create mode 100644 PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll create mode 100644 PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/BackUpLogic.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/BackUpSaveBindingModel.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/DependencyManager.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/IDependencyContainer.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/IImplementationExtension.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantFileImplement/FileImplementationExtension.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantFileImplement/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantListImplement/ListImplementationExtension.cs create mode 100644 PrecastConcretePlant/PrecastConcretePlantView/DataGridViewExtension.cs diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..22b510773df6e242e09a07525f3eecf6ab897c78 GIT binary patch literal 32768 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 Iudadr3wHtUp#T5? literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..f3156101ad9c0753b14d1b8be1247efd3badc945 GIT binary patch literal 7168 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 literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..7c4a3c22472576b9ea8ca2090b5714f1e04e5d7c GIT binary patch literal 76800 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 literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantFileImplement.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..368a7639be16bf8db9813ce964c5d1c00c9cbfe9 GIT binary patch literal 41984 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 L|2p|kj==u`iIjB; literal 0 HcmV?d00001 diff --git a/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll b/PrecastConcretePlant/ImplementationExtensions/PrecastConcretePlantListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..f0ddbe6f84d2f79cb90f5751b8591028a708e18d GIT binary patch literal 27648 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 logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + + public void CreateBackUp(BackUpSaveBindingModel 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); + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ClientLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ClientLogic.cs index 1d09834..9f7c369 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ClientLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ClientLogic.cs @@ -11,7 +11,7 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class ClientLogic : IClientLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ComponentLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ComponentLogic.cs index b21e709..8a89edb 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ComponentLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ComponentLogic.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class ComponentLogic : IComponentLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ImplementerLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ImplementerLogic.cs index eecc6fa..e4b50ca 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ImplementerLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ImplementerLogic.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace ComputersShopBusinessLogic.BusinessLogics +namespace ComputersShopBusinessLogic.BusinessLogic { public class ImplementerLogic : IImplementerLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/MessageInfoLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/MessageInfoLogic.cs index 47fa9ea..3c02d02 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/MessageInfoLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/MessageInfoLogic.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class MessageInfoLogic : IMessageInfoLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/OrderLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/OrderLogic.cs index 11fa0aa..198ab19 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/OrderLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/OrderLogic.cs @@ -12,7 +12,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class OrderLogic : IOrderLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReinforcedLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReinforcedLogic.cs index b333f37..4e81dd1 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReinforcedLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReinforcedLogic.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class ReinforcedLogic : IReinforcedLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReportLogic.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReportLogic.cs index 5628591..93c4135 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReportLogic.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/ReportLogic.cs @@ -11,7 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class ReportLogic : IReportLogic { diff --git a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/WorkModelling.cs b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/WorkModelling.cs index 2f24a9d..f1398a2 100644 --- a/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/WorkModelling.cs +++ b/PrecastConcretePlant/PrecastConcretePlantBusinessLogic/BusinessLogic/WorkModelling.cs @@ -10,7 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace PrecastConcretePlantBusinessLogic.BusinessLogics +namespace PrecastConcretePlantBusinessLogic.BusinessLogic { public class WorkModelling : IWorkProcess { diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..40ecc74 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.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; + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..21c6b09 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/BackUpSaveBindingModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/BackUpSaveBindingModel.cs new file mode 100644 index 0000000..f425c2a --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/BackUpSaveBindingModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.BindingModels +{ + public class BackUpSaveBindingModel + { + public string FolderName { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs index 0bb3690..f06d468 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/BindingModels/MessageInfoBindingModel.cs @@ -9,7 +9,8 @@ namespace PrecastConcretePlantContracts.BindingModels { public class MessageInfoBindingModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; + public int Id => throw new NotImplementedException(); + public string MessageId { get; set; } = string.Empty; public int? ClientId { get; set; } diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..1d4aa1b --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using PrecastConcretePlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBindingModel model); + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/DependencyManager.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..f5c1394 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/DependencyManager.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.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(); + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IDependencyContainer.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..1fa2102 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.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(); + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IImplementationExtension.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..e16f819 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + public void RegisterServices(); + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..9265356 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/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 PrecastConcretePlantContracts.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()!; + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..285d3d4 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.DI +{ + public class ServiceProviderLoader + { + 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"; + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..d04ef86 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,43 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Unity; +using Unity.Microsoft.Logging; + +namespace PrecastConcretePlantContracts.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); + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj b/PrecastConcretePlant/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj index dae7eac..68673a4 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/PrecastConcretePlantContracts.csproj @@ -6,6 +6,12 @@ enable + + + + + + diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..c42b350 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs index 85d2654..677c5a8 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ClientViewModel.cs @@ -1,4 +1,5 @@ using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace PrecastConcretePlantContracts.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/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs index 037d8c7..061212f 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace PrecastConcretePlantContracts.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/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs index d6ea6ca..b375af2 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,19 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("ФИО исполнителя")] + [Column(title: "ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 70)] public string Password { get; set; } = string.Empty; - [DisplayName("Опыт исполнителя")] + [Column(title: "Стаж работы", width: 100)] public int WorkExperience { get; set; } - [DisplayName("Квалификация исполнителя")] + [Column(title: "Квалификация исполнителя", width: 120)] public int Qualification { get; set; } } } diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs index d8f2dcd..55ab352 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/MessageInfoViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,20 +11,25 @@ namespace PrecastConcretePlantContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public int Id { get; set; } - public int? ClientId { get; set; } + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; - [DisplayName("Отправитель")] - public string SenderName { get; set; } = string.Empty; + [Column(visible: false)] + public int? ClientId { get; set; } - [DisplayName("Дата письма")] - public DateTime DateDelivery { get; set; } + [Column(title: "Отправитель", width: 150)] + public string SenderName { get; set; } = string.Empty; - [DisplayName("Заголовок")] - public string Subject { get; set; } = string.Empty; + [Column(title: "Дата письма", width: 120)] + public DateTime DateDelivery { get; set; } - [DisplayName("Текст")] - public string Body { get; set; } = string.Empty; + [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; } } diff --git a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs index 6b40e6c..e151ba1 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Enums; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Enums; using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; @@ -11,34 +12,40 @@ namespace PrecastConcretePlantContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] + [Column(title: "Номер", width: 90)] public int Id { get; set; } + [Column(visible: false)] public int ClientId { get; set; } - [DisplayName("Клиент")] + + [Column(title: "ФИО клиента", width: 190)] public string ClientFIO { get; set; } = string.Empty; - public int? ImplementerId { get; set; } + [Column(visible: false)] + public int? ImplementerId { get; set; } + [DisplayName("ФИО исполнителя")] public string? ImplementerFIO { get; set; } = string.Empty; - public int ReinforcedId { get; set; } - [DisplayName("Изделие")] + [Column(visible: false)] + public int ReinforcedId { get; set; } + + [Column(title: "Изделие", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ReinforcedName { get; set; } = string.Empty; - [DisplayName("Количество")] + [Column(title: "Количество", width: 100)] public int Count { get; set; } - [DisplayName("Сумма")] + [Column(title: "Сумма", width: 100)] public double Sum { get; set; } - [DisplayName("Статус")] + [Column(title: "Статус", width: 90)] 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/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs index 5903fac..df9a517 100644 --- a/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantContracts/ViewModels/ReinforcedViewModel.cs @@ -1,4 +1,5 @@ -using PrecastConcretePlantDataModels.Models; +using PrecastConcretePlantContracts.Attributes; +using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,14 +11,16 @@ namespace PrecastConcretePlantContracts.ViewModels { public class ReinforcedViewModel : IReinforcedModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название изделия")] + [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string ReinforcedName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Price { get; set; } + [Column(visible: false)] public Dictionary ReinforcedComponents { get; set; } = new(); } } diff --git a/PrecastConcretePlant/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs b/PrecastConcretePlant/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs index 19ff002..d8e5ed6 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace PrecastConcretePlantDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/DatabaseImplementationExtension.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..6139359 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantDatabaseImplement.Implements; + +namespace PrecastConcretePlantDatabaseImplement +{ + 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/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Implements/BackUpInfo.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..d5a5a09 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new PrecastConcretePlantDatabase(); + 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; + } + } +} \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Client.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Client.cs index 1363a9b..9c5efc9 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Client.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Client.cs @@ -8,20 +8,26 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace PrecastConcretePlantDatabaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } - [Required] + [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/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Component.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Component.cs index bf70c0e..82d0331 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Component.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Component.cs @@ -8,16 +8,21 @@ using System.Threading.Tasks; using PrecastConcretePlantDataModels.Models; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.ViewModels; +using System.Runtime.Serialization; namespace PrecastConcretePlantDatabaseImplement.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; } diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Implementer.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Implementer.cs index 9167e0b..06b8a45 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Implementer.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Implementer.cs @@ -8,23 +8,30 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace PrecastConcretePlantDatabaseImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } - [Required] + [DataMember] + [Required] public string ImplementerFIO { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public string Password { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public int WorkExperience { get; private set; } - [Required] + [DataMember] + [Required] public int Qualification { get; private set; } [ForeignKey("ImplementerId")] diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/MessageInfo.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/MessageInfo.cs index e28b5bf..1f6f73e 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/MessageInfo.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/MessageInfo.cs @@ -4,26 +4,43 @@ using PrecastConcretePlantDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace PrecastConcretePlantDatabaseImplement.Models { - public class MessageInfo : IMessageInfoModel + [DataContract] + 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/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Order.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Order.cs index e1649f0..8f6d3a7 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Order.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Order.cs @@ -6,21 +6,35 @@ 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 PrecastConcretePlantDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } + + [DataMember] [Required] public int ClientId { get; set; } + + [DataMember] + [Required] public int Count { get; private set; } + + [DataMember] [Required] public double Sum { get; private set; } - public int? ImplementerId { get; set; } - [Required] + + [DataMember] + public int? ImplementerId { get; set; } + + [DataMember] + [Required] public OrderStatus Status { get; private set; } [Required] public DateTime DateCreate { get; private set; } diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Reinforced.cs b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Reinforced.cs index 5a11ca1..f6fbaaa 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Reinforced.cs +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/Models/Reinforced.cs @@ -9,21 +9,27 @@ using System.Text; using System.Threading.Tasks; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.ViewModels; +using System.Runtime.Serialization; namespace PrecastConcretePlantDatabaseImplement.Models { + [DataContract] public class Reinforced : IReinforcedModel { + [DataMember] public int Id { get; set; } + [DataMember] [Required] public string ReinforcedName { get; set; } = string.Empty; + [DataMember] [Required] public double Price { get; set; } private Dictionary? _ReinforcedComponents = null; + [DataMember] [NotMapped]//заполняется при обращеии к гетвьюмодел public Dictionary ReinforcedComponents { diff --git a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/PrecastConcretePlantDatabaseImplement.csproj b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/PrecastConcretePlantDatabaseImplement.csproj index 672de1f..fd9ea97 100644 --- a/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/PrecastConcretePlantDatabaseImplement.csproj +++ b/PrecastConcretePlant/PrecastConcretePlantDatabaseImplement/PrecastConcretePlantDatabaseImplement.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/PrecastConcretePlant/PrecastConcretePlantFileImplement/FileImplementationExtension.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/FileImplementationExtension.cs new file mode 100644 index 0000000..3ad4493 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/FileImplementationExtension.cs @@ -0,0 +1,27 @@ +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantFileImplement +{ + 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/PrecastConcretePlant/PrecastConcretePlantFileImplement/Implements/BackUpInfo.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..f8c57f0 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,44 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantFileImplement.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/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Client.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Client.cs index 4723a89..e5c2a1f 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Client.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Client.cs @@ -4,20 +4,26 @@ using PrecastConcretePlantDataModels.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 PrecastConcretePlantFileImplement.Models { + [DataContract] public class Client : IClientModel { + [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; + [DataMember] public int Id { get; private set; } public static Client? Create(ClientBindingModel model) diff --git a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Component.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Component.cs index 4f95010..aad5e2e 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Component.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Component.cs @@ -1,14 +1,21 @@ using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.ViewModels; using PrecastConcretePlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.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/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Implementer.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Implementer.cs index ca21d99..5b277fe 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Implementer.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Implementer.cs @@ -4,23 +4,30 @@ using PrecastConcretePlantDataModels.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 PrecastConcretePlantFileImplement.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; - public int WorkExperience { get; private set; } + [DataMember] + public int WorkExperience { get; private set; } - public int Qualification { get; private set; } + [DataMember] + public int Qualification { get; private set; } - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } public static Implementer? Create(XElement element) { diff --git a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/MessageInfo.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/MessageInfo.cs index 3fa1c00..e5f170d 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/MessageInfo.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/MessageInfo.cs @@ -4,25 +4,36 @@ using PrecastConcretePlantDataModels.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 PrecastConcretePlantFileImplement.Models { - public class MessageInfo : IMessageInfoModel + [DataContract] + public class MessageInfo : IMessageInfoModel { - public string MessageId { get; private set; } = string.Empty; + [DataMember] + public int Id { get; private set; } - public int? ClientId { get; private set; } + [DataMember] + 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] + public string SenderName { get; private set; } = string.Empty; - public string Subject { get; private set; } = string.Empty; + [DataMember] + public DateTime DateDelivery { get; private set; } = DateTime.Now; - public string Body { get; private set; } = string.Empty; + [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/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Order.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Order.cs index 0772da8..d4b2c26 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Order.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Order.cs @@ -5,27 +5,41 @@ using PrecastConcretePlantDataModels.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 PrecastConcretePlantFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } + + [DataMember] public int ClientId { get; set; } + [DataMember] public int ReinforcedId { get; private set; } + [DataMember] public int Count { get; private set; } + [DataMember] public double Sum { get; private set; } - public int? ImplementerId { get; set; } - public OrderStatus Status { get; private set; } + [DataMember] + public int? ImplementerId { get; set; } + + [DataMember] + public OrderStatus Status { get; private set; } + + [DataMember] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } public static Order? Create(OrderBindingModel? model) diff --git a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Reinforced.cs b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Reinforced.cs index e27f221..9378b13 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Reinforced.cs +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/Models/Reinforced.cs @@ -1,18 +1,28 @@ using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.ViewModels; using PrecastConcretePlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace PrecastConcretePlantFileImplement.Models { + [DataContract] public class Reinforced : IReinforcedModel { + [DataMember] public int Id { get; private set; } + + [DataMember] public string ReinforcedName { get; private set; } = string.Empty; + + [DataMember] public double Price { get; private set; } + public Dictionary Components { get; private set; } = new(); private Dictionary? _reinforcedComponents = null; + + [DataMember] public Dictionary ReinforcedComponents { get diff --git a/PrecastConcretePlant/PrecastConcretePlantFileImplement/PrecastConcretePlantFileImplement.csproj b/PrecastConcretePlant/PrecastConcretePlantFileImplement/PrecastConcretePlantFileImplement.csproj index 3142574..03859ae 100644 --- a/PrecastConcretePlant/PrecastConcretePlantFileImplement/PrecastConcretePlantFileImplement.csproj +++ b/PrecastConcretePlant/PrecastConcretePlantFileImplement/PrecastConcretePlantFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/PrecastConcretePlant/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs b/PrecastConcretePlant/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..a9e2b09 --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using PrecastConcretePlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace PrecastConcretePlantListImplement.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/PrecastConcretePlant/PrecastConcretePlantListImplement/ListImplementationExtension.cs b/PrecastConcretePlant/PrecastConcretePlantListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..8a279bd --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantListImplement/ListImplementationExtension.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PrecastConcretePlantContracts.DI; +using PrecastConcretePlantContracts.StoragesContracts; +using PrecastConcretePlantListImplement.Implements; + +namespace PrecastConcretePlantListImplement +{ + 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/PrecastConcretePlant/PrecastConcretePlantListImplement/Models/MessageInfo.cs b/PrecastConcretePlant/PrecastConcretePlantListImplement/Models/MessageInfo.cs index 435be5a..210d0bb 100644 --- a/PrecastConcretePlant/PrecastConcretePlantListImplement/Models/MessageInfo.cs +++ b/PrecastConcretePlant/PrecastConcretePlantListImplement/Models/MessageInfo.cs @@ -11,7 +11,8 @@ namespace PrecastConcretePlantListImplement.Models { public class MessageInfo : IMessageInfoModel { - public string MessageId { get; private set; } = string.Empty; + public int Id { get; private set; } + public string MessageId { get; private set; } = string.Empty; public int? ClientId { get; private set; } diff --git a/PrecastConcretePlant/PrecastConcretePlantListImplement/PrecastConcretePlantListImplement.csproj b/PrecastConcretePlant/PrecastConcretePlantListImplement/PrecastConcretePlantListImplement.csproj index d3bab3e..524aa83 100644 --- a/PrecastConcretePlant/PrecastConcretePlantListImplement/PrecastConcretePlantListImplement.csproj +++ b/PrecastConcretePlant/PrecastConcretePlantListImplement/PrecastConcretePlantListImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/PrecastConcretePlant/PrecastConcretePlantRestApi/Program.cs b/PrecastConcretePlant/PrecastConcretePlantRestApi/Program.cs index 57984bf..b3a313e 100644 --- a/PrecastConcretePlant/PrecastConcretePlantRestApi/Program.cs +++ b/PrecastConcretePlant/PrecastConcretePlantRestApi/Program.cs @@ -1,7 +1,7 @@ using PrecastConcretePlantContracts.BusinessLogicsContracts; using PrecastConcretePlantContracts.StoragesContracts; using PrecastConcretePlantDatabaseImplement.Implements; -using PrecastConcretePlantBusinessLogic.BusinessLogics; +using PrecastConcretePlantBusinessLogic.BusinessLogic; using Microsoft.OpenApi.Models; using PrecastConcretePlantBusinessLogic.MailWorker; using PrecastConcretePlantContracts.BindingModels; diff --git a/PrecastConcretePlant/PrecastConcretePlantView/DataGridViewExtension.cs b/PrecastConcretePlant/PrecastConcretePlantView/DataGridViewExtension.cs new file mode 100644 index 0000000..27e34eb --- /dev/null +++ b/PrecastConcretePlant/PrecastConcretePlantView/DataGridViewExtension.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using PrecastConcretePlantContracts.Attributes; + + +namespace PrecastConcretePlantView +{ + 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/PrecastConcretePlant/PrecastConcretePlantView/FormClients.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormClients.cs index 196caef..eb463b6 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormClients.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormClients.cs @@ -35,13 +35,7 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormComponentS.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormComponentS.cs index 29ed646..d3006cc 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormComponentS.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormComponentS.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -34,14 +35,7 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) @@ -52,29 +46,21 @@ namespace PrecastConcretePlantView } 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(); } } private void ButtonUpd_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(); - } } } } diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormCreateOrder.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormCreateOrder.cs index 378a9b3..55a32a8 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormCreateOrder.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormCreateOrder.cs @@ -1,5 +1,5 @@ using Microsoft.Extensions.Logging; -using PrecastConcretePlantBusinessLogic.BusinessLogics; +using PrecastConcretePlantBusinessLogic.BusinessLogic; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; using PrecastConcretePlantContracts.SearchModels; diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormImplementerS.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormImplementerS.cs index 4b84d84..d327e02 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormImplementerS.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormImplementerS.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -32,14 +33,8 @@ namespace PrecastConcretePlantView { 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) { @@ -50,27 +45,21 @@ namespace PrecastConcretePlantView } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } private void ButtonUpd_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) + 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/PrecastConcretePlant/PrecastConcretePlantView/FormMail.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormMail.cs index 3d7c1bd..7f332b2 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormMail.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormMail.cs @@ -28,15 +28,8 @@ namespace PrecastConcretePlantView { 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/PrecastConcretePlant/PrecastConcretePlantView/FormMain.Designer.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormMain.Designer.cs index 2c0d0eb..b1736fa 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormMain.Designer.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormMain.Designer.cs @@ -20,194 +20,202 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - ///

- /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - menuStrip1 = new MenuStrip(); - справочникToolStripMenuItem = new ToolStripMenuItem(); - компонентыToolStripMenuItem = new ToolStripMenuItem(); - изделияToolStripMenuItem = new ToolStripMenuItem(); - клиентыToolStripMenuItem = new ToolStripMenuItem(); - исполнителиToolStripMenuItem = new ToolStripMenuItem(); - отчетыToolStripMenuItem = new ToolStripMenuItem(); - списокЖБИToolStripMenuItem = new ToolStripMenuItem(); - жБИПоКомпонентамToolStripMenuItem = new ToolStripMenuItem(); - списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); - запускРаботToolStripMenuItem = new ToolStripMenuItem(); - почтаToolStripMenuItem = new ToolStripMenuItem(); - выводПисемToolStripMenuItem = new ToolStripMenuItem(); - buttonRef = new Button(); - buttonIssuedOrder = new Button(); - buttonCreateOrder = new Button(); - dataGridView = new DataGridView(); - menuStrip1.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); - SuspendLayout(); - // - // menuStrip1 - // - menuStrip1.ImageScalingSize = new Size(20, 20); - menuStrip1.Items.AddRange(new ToolStripItem[] { справочникToolStripMenuItem, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem }); - menuStrip1.Location = new Point(0, 0); - menuStrip1.Name = "menuStrip1"; - menuStrip1.Padding = new Padding(6, 3, 0, 3); - menuStrip1.Size = new Size(1100, 30); - menuStrip1.TabIndex = 0; - menuStrip1.Text = "menuStrip1"; - // - // справочникToolStripMenuItem - // - справочникToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, изделияToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); - справочникToolStripMenuItem.Name = "справочникToolStripMenuItem"; - справочникToolStripMenuItem.Size = new Size(117, 24); - справочникToolStripMenuItem.Text = "Справочники"; - // - // компонентыToolStripMenuItem - // - компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; - компонентыToolStripMenuItem.Size = new Size(185, 26); - компонентыToolStripMenuItem.Text = "Компоненты"; - компонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; - // - // изделияToolStripMenuItem - // - изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; - изделияToolStripMenuItem.Size = new Size(185, 26); - изделияToolStripMenuItem.Text = "Изделия"; - изделияToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; - // - // клиентыToolStripMenuItem - // - клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(185, 26); - клиентыToolStripMenuItem.Text = "Клиенты"; - клиентыToolStripMenuItem.Click += списокКлиентовToolStripMenuItem_Click; - // - // исполнителиToolStripMenuItem - // - исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(185, 26); - исполнителиToolStripMenuItem.Text = "Исполнители"; - исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; - // - // отчетыToolStripMenuItem - // - отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЖБИToolStripMenuItem, жБИПоКомпонентамToolStripMenuItem, списокЗаказовToolStripMenuItem }); - отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; - отчетыToolStripMenuItem.Size = new Size(73, 24); - отчетыToolStripMenuItem.Text = "Отчеты"; - // - // списокЖБИToolStripMenuItem - // - списокЖБИToolStripMenuItem.Name = "списокЖБИToolStripMenuItem"; - списокЖБИToolStripMenuItem.Size = new Size(247, 26); - списокЖБИToolStripMenuItem.Text = "Список ЖБИ"; - списокЖБИToolStripMenuItem.Click += списокИзделийToolStripMenuItem_Click; - // - // жБИПоКомпонентамToolStripMenuItem - // - жБИПоКомпонентамToolStripMenuItem.Name = "жБИПоКомпонентамToolStripMenuItem"; - жБИПоКомпонентамToolStripMenuItem.Size = new Size(247, 26); - жБИПоКомпонентамToolStripMenuItem.Text = "ЖБИ по компонентам"; - жБИПоКомпонентамToolStripMenuItem.Click += изделияПоКомпонентамToolStripMenuItem_Click; - // - // списокЗаказовToolStripMenuItem - // - списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; - списокЗаказовToolStripMenuItem.Size = new Size(247, 26); - списокЗаказовToolStripMenuItem.Text = "Список заказов"; - списокЗаказовToolStripMenuItem.Click += списокЗаказовToolStripMenuItem_Click; - // - // запускРаботToolStripMenuItem - // - запускРаботToolStripMenuItem.Name = "запускРаботToolStripMenuItem"; - запускРаботToolStripMenuItem.Size = new Size(114, 24); - запускРаботToolStripMenuItem.Text = "Запуск работ"; - запускРаботToolStripMenuItem.Click += запускРаботToolStripMenuItem_Click; - // - // почтаToolStripMenuItem - // - почтаToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { выводПисемToolStripMenuItem }); - почтаToolStripMenuItem.Name = "почтаToolStripMenuItem"; - почтаToolStripMenuItem.Size = new Size(65, 24); - почтаToolStripMenuItem.Text = "Почта"; - // - // выводПисемToolStripMenuItem - // - выводПисемToolStripMenuItem.Name = "выводПисемToolStripMenuItem"; - выводПисемToolStripMenuItem.Size = new Size(224, 26); - выводПисемToolStripMenuItem.Text = "Вывод писем"; - выводПисемToolStripMenuItem.Click += письмаToolStripMenuItem_Click; - // - // buttonRef - // - buttonRef.Location = new Point(931, 153); - buttonRef.Name = "buttonRef"; - buttonRef.Size = new Size(157, 54); - buttonRef.TabIndex = 23; - buttonRef.Text = "Обновить список"; - buttonRef.UseVisualStyleBackColor = true; - buttonRef.Click += ButtonRef_Click; - // - // buttonIssuedOrder - // - buttonIssuedOrder.Location = new Point(931, 93); - buttonIssuedOrder.Name = "buttonIssuedOrder"; - buttonIssuedOrder.Size = new Size(157, 54); - buttonIssuedOrder.TabIndex = 22; - buttonIssuedOrder.Text = "Заказ выдан"; - buttonIssuedOrder.UseVisualStyleBackColor = true; - buttonIssuedOrder.Click += ButtonIssuedOrder_Click; - // - // buttonCreateOrder - // - buttonCreateOrder.Location = new Point(931, 33); - buttonCreateOrder.Name = "buttonCreateOrder"; - buttonCreateOrder.Size = new Size(157, 54); - buttonCreateOrder.TabIndex = 19; - buttonCreateOrder.Text = "Создать заказ"; - buttonCreateOrder.UseVisualStyleBackColor = true; - buttonCreateOrder.Click += ButtonCreateOrder_Click; - // - // dataGridView - // - dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Dock = DockStyle.Left; - dataGridView.Location = new Point(0, 30); - dataGridView.Name = "dataGridView"; - dataGridView.RowHeadersWidth = 51; - dataGridView.Size = new Size(925, 374); - dataGridView.TabIndex = 18; - // - // FormMain - // - AutoScaleDimensions = new SizeF(8F, 20F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(1100, 404); - Controls.Add(buttonRef); - Controls.Add(buttonIssuedOrder); - Controls.Add(buttonCreateOrder); - Controls.Add(dataGridView); - Controls.Add(menuStrip1); - MainMenuStrip = menuStrip1; - Name = "FormMain"; - Text = "Завод ЖБИ"; - Load += FormMain_Load; - menuStrip1.ResumeLayout(false); - menuStrip1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + menuStrip1 = new MenuStrip(); + справочникToolStripMenuItem = new ToolStripMenuItem(); + компонентыToolStripMenuItem = new ToolStripMenuItem(); + изделияToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + исполнителиToolStripMenuItem = new ToolStripMenuItem(); + отчетыToolStripMenuItem = new ToolStripMenuItem(); + списокЖБИToolStripMenuItem = new ToolStripMenuItem(); + жБИПоКомпонентамToolStripMenuItem = new ToolStripMenuItem(); + списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); + запускРаботToolStripMenuItem = new ToolStripMenuItem(); + почтаToolStripMenuItem = new ToolStripMenuItem(); + выводПисемToolStripMenuItem = new ToolStripMenuItem(); + создатьБэкапToolStripMenuItem = new ToolStripMenuItem(); + buttonRef = new Button(); + buttonIssuedOrder = new Button(); + buttonCreateOrder = new Button(); + dataGridView = new DataGridView(); + menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникToolStripMenuItem, отчетыToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem, создатьБэкапToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Padding = new Padding(6, 3, 0, 3); + menuStrip1.Size = new Size(1100, 30); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // справочникToolStripMenuItem + // + справочникToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, изделияToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); + справочникToolStripMenuItem.Name = "справочникToolStripMenuItem"; + справочникToolStripMenuItem.Size = new Size(117, 24); + справочникToolStripMenuItem.Text = "Справочники"; + // + // компонентыToolStripMenuItem + // + компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; + компонентыToolStripMenuItem.Size = new Size(185, 26); + компонентыToolStripMenuItem.Text = "Компоненты"; + компонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; + // + // изделияToolStripMenuItem + // + изделияToolStripMenuItem.Name = "изделияToolStripMenuItem"; + изделияToolStripMenuItem.Size = new Size(185, 26); + изделияToolStripMenuItem.Text = "Изделия"; + изделияToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; + // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(185, 26); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += списокКлиентовToolStripMenuItem_Click; + // + // исполнителиToolStripMenuItem + // + исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; + исполнителиToolStripMenuItem.Size = new Size(185, 26); + исполнителиToolStripMenuItem.Text = "Исполнители"; + исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; + // + // отчетыToolStripMenuItem + // + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЖБИToolStripMenuItem, жБИПоКомпонентамToolStripMenuItem, списокЗаказовToolStripMenuItem }); + отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; + отчетыToolStripMenuItem.Size = new Size(73, 24); + отчетыToolStripMenuItem.Text = "Отчеты"; + // + // списокЖБИToolStripMenuItem + // + списокЖБИToolStripMenuItem.Name = "списокЖБИToolStripMenuItem"; + списокЖБИToolStripMenuItem.Size = new Size(247, 26); + списокЖБИToolStripMenuItem.Text = "Список ЖБИ"; + списокЖБИToolStripMenuItem.Click += списокИзделийToolStripMenuItem_Click; + // + // жБИПоКомпонентамToolStripMenuItem + // + жБИПоКомпонентамToolStripMenuItem.Name = "жБИПоКомпонентамToolStripMenuItem"; + жБИПоКомпонентамToolStripMenuItem.Size = new Size(247, 26); + жБИПоКомпонентамToolStripMenuItem.Text = "ЖБИ по компонентам"; + жБИПоКомпонентамToolStripMenuItem.Click += изделияПоКомпонентамToolStripMenuItem_Click; + // + // списокЗаказовToolStripMenuItem + // + списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; + списокЗаказовToolStripMenuItem.Size = new Size(247, 26); + списокЗаказовToolStripMenuItem.Text = "Список заказов"; + списокЗаказовToolStripMenuItem.Click += списокЗаказовToolStripMenuItem_Click; + // + // запускРаботToolStripMenuItem + // + запускРаботToolStripMenuItem.Name = "запускРаботToolStripMenuItem"; + запускРаботToolStripMenuItem.Size = new Size(114, 24); + запускРаботToolStripMenuItem.Text = "Запуск работ"; + запускРаботToolStripMenuItem.Click += запускРаботToolStripMenuItem_Click; + // + // почтаToolStripMenuItem + // + почтаToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { выводПисемToolStripMenuItem }); + почтаToolStripMenuItem.Name = "почтаToolStripMenuItem"; + почтаToolStripMenuItem.Size = new Size(65, 24); + почтаToolStripMenuItem.Text = "Почта"; + // + // выводПисемToolStripMenuItem + // + выводПисемToolStripMenuItem.Name = "выводПисемToolStripMenuItem"; + выводПисемToolStripMenuItem.Size = new Size(185, 26); + выводПисемToolStripMenuItem.Text = "Вывод писем"; + выводПисемToolStripMenuItem.Click += письмаToolStripMenuItem_Click; + // + // создатьБэкапToolStripMenuItem + // + создатьБэкапToolStripMenuItem.Name = "создатьБэкапToolStripMenuItem"; + создатьБэкапToolStripMenuItem.Size = new Size(123, 24); + создатьБэкапToolStripMenuItem.Text = "Создать бекап"; + создатьБэкапToolStripMenuItem.Click += СоздатьБекапToolStripMenuItem_Click; + // + // buttonRef + // + buttonRef.Location = new Point(931, 153); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(157, 54); + buttonRef.TabIndex = 23; + buttonRef.Text = "Обновить список"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // buttonIssuedOrder + // + buttonIssuedOrder.Location = new Point(931, 93); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(157, 54); + buttonIssuedOrder.TabIndex = 22; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += ButtonIssuedOrder_Click; + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(931, 33); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(157, 54); + buttonCreateOrder.TabIndex = 19; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += ButtonCreateOrder_Click; + // + // dataGridView + // + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Left; + dataGridView.Location = new Point(0, 30); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.Size = new Size(925, 374); + dataGridView.TabIndex = 18; + // + // FormMain + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1100, 404); + Controls.Add(buttonRef); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "FormMain"; + Text = "Завод ЖБИ"; + Load += FormMain_Load; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private MenuStrip menuStrip1; + private MenuStrip menuStrip1; private ToolStripMenuItem справочникToolStripMenuItem; private ToolStripMenuItem компонентыToolStripMenuItem; private ToolStripMenuItem изделияToolStripMenuItem; @@ -224,5 +232,6 @@ private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem почтаToolStripMenuItem; private ToolStripMenuItem выводПисемToolStripMenuItem; - } + private ToolStripMenuItem создатьБэкапToolStripMenuItem; + } } \ No newline at end of file diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormMain.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormMain.cs index 583054a..4387c44 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormMain.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormMain.cs @@ -1,7 +1,8 @@ using Microsoft.Extensions.Logging; -using PrecastConcretePlantBusinessLogic.BusinessLogics; +using PrecastConcretePlantBusinessLogic.BusinessLogic; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -20,14 +21,16 @@ namespace PrecastConcretePlantView 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) { LoadData(); @@ -36,15 +39,8 @@ namespace PrecastConcretePlantView { try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ReinforcedId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } - _logger.LogInformation(" "); + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); + _logger.LogInformation(" "); } catch (Exception ex) { @@ -54,29 +50,20 @@ namespace PrecastConcretePlantView } 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(FormReinforcedS)); - if (service is FormReinforcedS 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 ButtonIssuedOrder_Click(object sender, EventArgs e) { @@ -120,55 +107,64 @@ namespace PrecastConcretePlantView private void ToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportReinforcedComponents)); - if (service is FormReportReinforcedComponents 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(" ", "", + _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(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(FormMail)); - if (service is FormMail form) - { - form.ShowDialog(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + private void ToolStripMenuItem_Click(object sender, EventArgs +e) + { + try + { + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBindingModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show(" ", "", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } } diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormReinforced.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormReinforced.cs index 79b707c..aff0cb5 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormReinforced.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormReinforced.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using PrecastConcretePlantContracts.SearchModels; using PrecastConcretePlantDataModels.Models; using System; @@ -81,50 +82,44 @@ namespace PrecastConcretePlantView } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforcedComponent)); - if (service is FormReinforcedComponent 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 (_ReinforcedComponents.ContainsKey(form.Id)) - { - _ReinforcedComponents[form.Id] = (form.ComponentModel, - form.Count); - } - else - { - _ReinforcedComponents.Add(form.Id, (form.ComponentModel, - form.Count)); - } - LoadData(); + return; } + _logger.LogInformation("Добавление нового компонента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + if (_ReinforcedComponents.ContainsKey(form.Id)) + { + _ReinforcedComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _ReinforcedComponents.Add(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(FormReinforcedComponent)); - if (service is FormReinforcedComponent form) + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _ReinforcedComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _ReinforcedComponents[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); - _ReinforcedComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); + return; } + _logger.LogInformation("Изменение компонента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + _ReinforcedComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); } } } diff --git a/PrecastConcretePlant/PrecastConcretePlantView/FormReinforcedS.cs b/PrecastConcretePlant/PrecastConcretePlantView/FormReinforcedS.cs index bfb69db..8d813be 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/FormReinforcedS.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/FormReinforcedS.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using PrecastConcretePlantContracts.BindingModels; using PrecastConcretePlantContracts.BusinessLogicsContracts; +using PrecastConcretePlantContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -31,15 +32,7 @@ namespace PrecastConcretePlantView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ReinforcedComponents"].Visible = false; - dataGridView.Columns["ReinforcedName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка изделий"); } catch (Exception ex) @@ -50,27 +43,21 @@ namespace PrecastConcretePlantView } private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforced)); - if (service is FormReinforced form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); } } private void ButtonUpd_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormReinforced)); - if (service is FormReinforced 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/PrecastConcretePlant/PrecastConcretePlantView/Program.cs b/PrecastConcretePlant/PrecastConcretePlantView/Program.cs index cc7a4d5..07e39e2 100644 --- a/PrecastConcretePlant/PrecastConcretePlantView/Program.cs +++ b/PrecastConcretePlant/PrecastConcretePlantView/Program.cs @@ -1,23 +1,22 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using NLog.Extensions.Logging; -using PrecastConcretePlantBusinessLogic.BusinessLogics; +using PrecastConcretePlantBusinessLogic.BusinessLogic; using PrecastConcretePlantBusinessLogic.OfficePackage.Implements; using PrecastConcretePlantBusinessLogic.OfficePackage; using PrecastConcretePlantContracts.BusinessLogicsContracts; using PrecastConcretePlantContracts.StoragesContracts; using PrecastConcretePlantDatabaseImplement.Implements; using System; -using ComputersShopBusinessLogic.BusinessLogics; +using ComputersShopBusinessLogic.BusinessLogic; using PrecastConcretePlantBusinessLogic.MailWorker; using PrecastConcretePlantContracts.BindingModels; +using PrecastConcretePlantContracts.DI; namespace PrecastConcretePlantView { internal static class Program { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; /// /// The main entry point for the application. /// @@ -27,13 +26,11 @@ namespace PrecastConcretePlantView // 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(); - try + InitDependency(); + try { - var mailSender = _serviceProvider.GetService(); - mailSender?.MailConfig(new MailConfigBindingModel + var mailSender = DependencyManager.Instance.Resolve(); + mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, @@ -47,54 +44,51 @@ namespace PrecastConcretePlantView } catch (Exception ex) { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, "<22><> <20><> <20> <20><>"); + var logger = DependencyManager.Instance.Resolve(); + logger?.LogError(ex, "<22><> <20><> <20> <20><>"); } - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - 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(); - } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); - } + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); + } } \ No newline at end of file