From 37a01ddf3552006ce7b4ab61d7e3210beac5e949 Mon Sep 17 00:00:00 2001 From: GokaPek Date: Tue, 21 May 2024 20:59:55 +0400 Subject: [PATCH 1/3] =?UTF-8?q?=D0=9D=D0=B0=D1=87=D0=B0=D0=BB=D0=BE=20:(?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BusinessLogic/BackUpLogic.cs | 100 ++++++++++++++++++ .../AbstractLawFirmContracts.csproj | 6 +- .../Attributes/ColumnAttribute.cs | 26 +++++ .../Attributes/GridViewAutoSize.cs | 20 ++++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 +++ .../BusinessLogicsContracts/IBackUpLogic.cs | 14 +++ .../StoragesContracts/IBackUpInfo.cs | 14 +++ 7 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 LawFirm/AbstractLawFirmBusinessLogic/BusinessLogic/BackUpLogic.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/ColumnAttribute.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/GridViewAutoSize.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/StoragesContracts/IBackUpInfo.cs diff --git a/LawFirm/AbstractLawFirmBusinessLogic/BusinessLogic/BackUpLogic.cs b/LawFirm/AbstractLawFirmBusinessLogic/BusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..177cccd --- /dev/null +++ b/LawFirm/AbstractLawFirmBusinessLogic/BusinessLogic/BackUpLogic.cs @@ -0,0 +1,100 @@ +using AbstractLawFirmContracts.BindingModels; +using AbstractLawFirmContracts.BusinessLogicsContracts; +using AbstractLawFirmContracts.StoragesContracts; +using AbstractLawFirmDataModels; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization.Json; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmBusinessLogic.BusinessLogic +{ + public class BackUpLogic : IBackUpLogic + { + private readonly ILogger _logger; + private readonly IBackUpInfo _backUpInfo; + public BackUpLogic(ILogger logger, IBackUpInfo backUpInfo) + { + _logger = logger; + _backUpInfo = backUpInfo; + } + public void CreateBackUp(BackUpSaveBinidngModel model) + { + if (_backUpInfo == null) + { + return; + } + try + { + _logger.LogDebug("Clear folder"); + // зачистка папки и удаление старого архива + var dirInfo = new DirectoryInfo(model.FolderName); + if (dirInfo.Exists) + { + foreach (var file in dirInfo.GetFiles()) + { + file.Delete(); + } + } + _logger.LogDebug("Delete archive"); + string fileName = $"{model.FolderName}.zip"; + if (File.Exists(fileName)) + { + File.Delete(fileName); + } + // берем метод для сохранения + _logger.LogDebug("Get assembly"); + var typeIId = typeof(IId); + var assembly = typeIId.Assembly; + if (assembly == null) + { + throw new ArgumentNullException("Сборка не найдена", nameof(assembly)); + } + var types = assembly.GetTypes(); + var method = GetType().GetMethod("SaveToFile", BindingFlags.NonPublic | BindingFlags.Instance); + _logger.LogDebug("Find {count} types", types.Length); + foreach (var type in types) + { + if (type.IsInterface && type.GetInterface(typeIId.Name) != null) + { + var modelType = _backUpInfo.GetTypeByModelInterface(type.Name); + if (modelType == null) + { + throw new InvalidOperationException($"Не найденкласс - модель для {type.Name}"); + } + _logger.LogDebug("Call SaveToFile method for {name} type", type.Name); + // вызываем метод на выполнение + method?.MakeGenericMethod(modelType).Invoke(this, new + object[] { model.FolderName }); + } + } + _logger.LogDebug("Create zip and remove folder"); + // архивируем + ZipFile.CreateFromDirectory(model.FolderName, fileName); + // удаляем папку + dirInfo.Delete(true); + } + catch (Exception) + { + throw; + } + } + private void SaveToFile(string folderName) where T : class, new() + { + var records = _backUpInfo.GetList(); + if (records == null) + { + _logger.LogWarning("{type} type get null list", typeof(T).Name); + return; + } + var jsonFormatter = new DataContractJsonSerializer(typeof(List)); + using var fs = new FileStream(string.Format("{0}/{1}.json", folderName, typeof(T).Name), FileMode.OpenOrCreate); + jsonFormatter.WriteObject(fs, records); + } + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/AbstractLawFirmContracts.csproj b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/AbstractLawFirmContracts.csproj index 74a87d8..3bfd8da 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/AbstractLawFirmContracts.csproj +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/AbstractLawFirmContracts.csproj @@ -5,7 +5,11 @@ enable enable - + + + + + diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/ColumnAttribute.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..4966e75 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + public string Title { get; private set; } + public bool Visible { get; private set; } + public int Width { get; private set; } + public GridViewAutoSize GridViewAutoSize { get; private set; } + public bool IsUseAutoSize { get; private set; } + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/GridViewAutoSize.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..73663bf --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/BackUpSaveBinidngModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..0a4fecb --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BusinessLogicsContracts/IBackUpLogic.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..9bc3e91 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using AbstractLawFirmContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/StoragesContracts/IBackUpInfo.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..72cb4e3 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} -- 2.25.1 From e1bce48929392cfe728a737cdf7c376dcd289b72 Mon Sep 17 00:00:00 2001 From: GokaPek Date: Wed, 22 May 2024 00:37:34 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A7=D1=82=D0=BE-=D1=82=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BindingModels/MessageInfoBindingModel.cs | 3 +- .../DI/DependencyManager.cs | 65 ++++++++++ .../DI/IDependencyContainer.cs | 40 ++++++ .../DI/IImplementationExtension.cs | 17 +++ .../DI/ServiceDependencyContainer.cs | 62 +++++++++ .../DI/ServiceProviderLoader.cs | 51 ++++++++ .../DI/UnityDependencyContainer.cs | 44 +++++++ .../ViewModels/ClientViewModel.cs | 18 +-- .../ViewModels/ComponentViewModel.cs | 14 +- .../ViewModels/DocumentViewModel.cs | 19 +-- .../ViewModels/ImplementerViewModel.cs | 22 ++-- .../ViewModels/MessageInfoViewModel.cs | 30 +++-- .../ViewModels/OrderViewModel.cs | 51 ++++---- .../Models/IMessageInfoModel.cs | 2 +- .../AbstractLawFirmDataBaseImplement.csproj | 3 + .../DatabaseImplementationExtension.cs | 28 ++++ .../Implements/BackUpInfo.cs | 32 +++++ .../Models/Client.cs | 14 +- .../Models/Component.cs | 9 +- .../Models/Document.cs | 14 +- .../Models/Implementer.cs | 19 +-- .../Models/MessageInfo.cs | 24 +++- .../Models/Order.cs | 30 +++-- .../FileImplementationExtension.cs | 26 ++++ .../Implements/BackUpInfo.cs | 34 +++++ .../Implements/OrderStorage.cs | 35 ++--- .../Models/Component.cs | 9 +- .../Models/Document.cs | 11 +- .../Models/Implementer.cs | 21 +-- .../Models/MessageInfo.cs | 14 +- .../Models/Order.cs | 27 ++-- .../AbstractLawFirmListImplement.csproj | 4 + .../Implements/BackUpInfo.cs | 22 ++++ .../Implements/OrderStorage.cs | 13 +- .../ListImplementationExtension.cs | 26 ++++ .../Models/MessageInfo.cs | 1 + .../Models/Order.cs | 8 +- .../AbstractLawFirmContracts.dll | Bin 0 -> 32256 bytes .../AbstractLawFirmDataBaseImplement.dll | Bin 0 -> 88576 bytes .../AbstractLawFirmDataModels.dll | Bin 0 -> 7168 bytes .../AbstractLawFirmFileImplement.dll | Bin 0 -> 36352 bytes .../AbstractLawFirmListImplement.dll | Bin 0 -> 24064 bytes LawFirm/LawFirmView/DataGridViewExtension.cs | 50 ++++++++ LawFirm/LawFirmView/FormClients.cs | 10 +- LawFirm/LawFirmView/FormComponents.cs | 31 ++--- LawFirm/LawFirmView/FormDocument.cs | 51 ++++---- LawFirm/LawFirmView/FormDocuments.cs | 31 ++--- LawFirm/LawFirmView/FormImplementers.cs | 28 ++-- LawFirm/LawFirmView/FormMail.cs | 9 +- LawFirm/LawFirmView/FormMain.cs | 120 +++++++++--------- LawFirm/LawFirmView/Program.cs | 88 +++++++------ 51 files changed, 908 insertions(+), 372 deletions(-) create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/DependencyManager.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IDependencyContainer.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IImplementationExtension.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceDependencyContainer.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceProviderLoader.cs create mode 100644 LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/UnityDependencyContainer.cs create mode 100644 LawFirm/AbstractLawFirmDatabaseImplement/DatabaseImplementationExtension.cs create mode 100644 LawFirm/AbstractLawFirmDatabaseImplement/Implements/BackUpInfo.cs create mode 100644 LawFirm/AbstractLawFirmFileImpliment/FileImplementationExtension.cs create mode 100644 LawFirm/AbstractLawFirmFileImpliment/Implements/BackUpInfo.cs create mode 100644 LawFirm/AbstractLawFirmListImplement/Implements/BackUpInfo.cs create mode 100644 LawFirm/AbstractLawFirmListImplement/ListImplementationExtension.cs create mode 100644 LawFirm/ImplementationExtensions/AbstractLawFirmContracts.dll create mode 100644 LawFirm/ImplementationExtensions/AbstractLawFirmDataBaseImplement.dll create mode 100644 LawFirm/ImplementationExtensions/AbstractLawFirmDataModels.dll create mode 100644 LawFirm/ImplementationExtensions/AbstractLawFirmFileImplement.dll create mode 100644 LawFirm/ImplementationExtensions/AbstractLawFirmListImplement.dll create mode 100644 LawFirm/LawFirmView/DataGridViewExtension.cs diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/MessageInfoBindingModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/MessageInfoBindingModel.cs index 87ec94c..4f4f750 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/MessageInfoBindingModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/BindingModels/MessageInfoBindingModel.cs @@ -9,7 +9,8 @@ namespace AbstractLawFirmContracts.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/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/DependencyManager.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..6d4aec8 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/DependencyManager.cs @@ -0,0 +1,65 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + + private static DependencyManager? _manager; + + private static readonly object _locjObject = new(); + + private DependencyManager() + { + _dependencyManager = new UnityDependencyContainer(); + } + + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + /// + /// Иницализация библиотек, в которых идут установки зависомстей + /// + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + + /// + /// Регистрация логгера + /// + /// + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Добавление зависимости + /// + /// + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IDependencyContainer.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..0f7ff51 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IDependencyContainer.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.DI +{ + public interface IDependencyContainer + { + /// + /// Регистрация логгера + /// + /// + void AddLogging(Action configure); + + /// + /// Добавление зависимости + /// + /// + /// + /// + void RegisterType(bool isSingle) where U : class, T where T : class; + + /// + /// Добавление зависимости + /// + /// + /// + void RegisterType(bool isSingle) where T : class; + + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + T Resolve(); + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IImplementationExtension.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..03b9350 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceDependencyContainer.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..8b83c1a --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/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 AbstractLawFirmContracts.DI +{ + public class ServiceDependencyContainer : IDependencyContainer + { + private ServiceProvider? _serviceProvider; + + private readonly ServiceCollection _serviceCollection; + + public ServiceDependencyContainer() + { + _serviceCollection = new ServiceCollection(); + } + + public void AddLogging(Action configure) + { + _serviceCollection.AddLogging(configure); + } + + public void RegisterType(bool isSingle) where U : class, T where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + _serviceProvider = null; + } + + public void RegisterType(bool isSingle) where T : class + { + if (isSingle) + { + _serviceCollection.AddSingleton(); + } + else + { + _serviceCollection.AddTransient(); + } + _serviceProvider = null; + } + + public T Resolve() + { + if (_serviceProvider == null) + { + _serviceProvider = _serviceCollection.BuildServiceProvider(); + } + return _serviceProvider.GetService()!; + } + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceProviderLoader.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..0cd6514 --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/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 AbstractLawFirmContracts.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"; + } + } +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/UnityDependencyContainer.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/UnityDependencyContainer.cs new file mode 100644 index 0000000..65e9a7e --- /dev/null +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/DI/UnityDependencyContainer.cs @@ -0,0 +1,44 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Unity.Microsoft.Logging; +using Unity; + +namespace AbstractLawFirmContracts.DI +{ + public class UnityDependencyContainer : IDependencyContainer + { + private readonly IUnityContainer _container; + + public UnityDependencyContainer() + { + _container = new UnityContainer(); + } + + public void AddLogging(Action configure) + { + var factory = LoggerFactory.Create(configure); + _container.AddExtension(new LoggingExtension(factory)); + } + + public void RegisterType(bool isSingle) where T : class + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + + } + + public T Resolve() + { + return _container.Resolve(); + } + + void IDependencyContainer.RegisterType(bool isSingle) + { + _container.RegisterType(isSingle ? TypeLifetime.Singleton : TypeLifetime.Transient); + } + } + +} diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ClientViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ClientViewModel.cs index 3a8dc1c..7022edd 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ClientViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ClientViewModel.cs @@ -5,17 +5,19 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using AbstractLawFirmContracts.Attributes; namespace AbstractLawFirmContracts.ViewModels { public class ClientViewModel : IClientModel { - public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] - public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; - } + [Column(visible: false)] + public int Id { get; set; } + [Column(title: "ФИО клиента", width: 150)] + public string ClientFIO { get; set; } = string.Empty; + [Column(title: "Логин (Эл.почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Email { get; set; } = string.Empty; + [Column(title: "Пароль", width: 150)] + public string Password { get; set; } = string.Empty; + } } diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ComponentViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ComponentViewModel.cs index 0843b72..b75962d 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ComponentViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ using AbstractLawFirmDataModels.Models; +using AbstractLawFirmContracts.Attributes; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,10 +11,11 @@ namespace AbstractLawFirmContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Cost { get; set; } - } + [Column(visible: false)] + public int Id { get; set; } + [Column("Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; + [Column("Цена", width: 100)] + public double Cost { get; set; } + } } diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/DocumentViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/DocumentViewModel.cs index 74d0e5f..27286fe 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/DocumentViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/DocumentViewModel.cs @@ -1,4 +1,5 @@ -using AbstractLawFirmDataModels.Models; +using AbstractLawFirmContracts.Attributes; +using AbstractLawFirmDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,13 +11,15 @@ namespace AbstractLawFirmContracts.ViewModels { public class DocumentViewModel : IDocumentModel { - public int Id { get; set; } - [DisplayName("Название пакета документов")] - public string DocumentName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary DocumentComponents - { + [Column(visible: false)] + public int Id { get; set; } + [Column("Название пакета документов", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string DocumentName { get; set; } = string.Empty; + [Column("Цена", width: 100)] + public double Price { get; set; } + [Column(visible: false)] + public Dictionary DocumentComponents + { get; set; } = new(); diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ImplementerViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ImplementerViewModel.cs index fea571d..48f66b7 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ImplementerViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using AbstractLawFirmDataModels.Models; +using AbstractLawFirmContracts.Attributes; +using AbstractLawFirmDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,19 @@ namespace AbstractLawFirmContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО")] - public string ImplementerFIO { get; set; } = string.Empty; + [Column("ФИО", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column("Пароль", width: 110)] + public string Password { get; set; } = string.Empty; - [DisplayName("Трудовой стаж")] - public int WorkExperience { get; set; } + [Column("Трудовой стаж", width: 110)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } + [Column("Квалификация", width: 110)] + public int Qualification { get; set; } } } diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/MessageInfoViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/MessageInfoViewModel.cs index f891e6e..0d8209d 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/MessageInfoViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/MessageInfoViewModel.cs @@ -1,4 +1,5 @@ -using AbstractLawFirmDataModels.Models; +using AbstractLawFirmContracts.Attributes; +using AbstractLawFirmDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,16 +11,19 @@ namespace AbstractLawFirmContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { - public string MessageId { get; set; } = string.Empty; - - public int? ClientId { get; set; } - [DisplayName("Отправитель")] - public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] - public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] - public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] - public string Body { get; set; } = string.Empty; - } + [Column(visible: false)] + public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] + public int? ClientId { get; set; } + [Column("Отправитель", gridViewAutoSize: GridViewAutoSize.DisplayedCells, isUseAutoSize: true)] + public string SenderName { get; set; } = string.Empty; + [Column("Дата письма", width: 100)] + public DateTime DateDelivery { get; set; } + [Column("Заголовок", width: 150)] + public string Subject { get; set; } = string.Empty; + [Column("Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Body { get; set; } = string.Empty; + [Column(visible: false)] + public int Id => throw new NotImplementedException(); + } } diff --git a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/OrderViewModel.cs b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/OrderViewModel.cs index 0f3d20e..1d40958 100644 --- a/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/OrderViewModel.cs +++ b/LawFirm/AbstractLawFirmContracts/AbstractLawFirmContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using AbstractLawFirmDataModels.Enums; +using AbstractLawFirmContracts.Attributes; +using AbstractLawFirmDataModels.Enums; using AbstractLawFirmDataModels.Models; using System; using System.Collections.Generic; @@ -11,26 +12,30 @@ namespace AbstractLawFirmContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } - public int DocumentId { get; set; } - public int ClientId { get; set; } - [DisplayName("Пакет документов")] - public string DocumentName { get; set; } = string.Empty; - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - public int? ImplementerId { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } - [DisplayName("Сумма")] - public double Sum { get; set; } - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } - } + [Column("Номер", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Id { get; set; } + [Column(visible: false)] + public int DocumentId { get; set; } + [Column("Пакет документов", width: 110)] + public string DocumentName { get; set; } = string.Empty; + [Column(visible: false)] + public int ClientId { get; set; } + + [Column("ФИО клиента", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int? ImplementerId { get; set; } + [Column("ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; + [Column("Количество", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public int Count { get; set; } + [Column("Сумма", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public double Sum { get; set; } + [Column("Статус", gridViewAutoSize: GridViewAutoSize.AllCells, isUseAutoSize: true)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + [Column("Дата создания", width: 100)] + public DateTime DateCreate { get; set; } = DateTime.Now; + [Column("Дата выполнения", width: 100)] + public DateTime? DateImplement { get; set; } + } } diff --git a/LawFirm/AbstractLawFirmDataModels/AbstractLawFirmDataModels/Models/IMessageInfoModel.cs b/LawFirm/AbstractLawFirmDataModels/AbstractLawFirmDataModels/Models/IMessageInfoModel.cs index 729b46b..b160dbd 100644 --- a/LawFirm/AbstractLawFirmDataModels/AbstractLawFirmDataModels/Models/IMessageInfoModel.cs +++ b/LawFirm/AbstractLawFirmDataModels/AbstractLawFirmDataModels/Models/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace AbstractLawFirmDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel: IId { string MessageId { get; } int? ClientId { get; } diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/AbstractLawFirmDataBaseImplement.csproj b/LawFirm/AbstractLawFirmDatabaseImplement/AbstractLawFirmDataBaseImplement.csproj index f14ba72..aba3df7 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/AbstractLawFirmDataBaseImplement.csproj +++ b/LawFirm/AbstractLawFirmDatabaseImplement/AbstractLawFirmDataBaseImplement.csproj @@ -26,4 +26,7 @@ + + + diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/DatabaseImplementationExtension.cs b/LawFirm/AbstractLawFirmDatabaseImplement/DatabaseImplementationExtension.cs new file mode 100644 index 0000000..2d68ea8 --- /dev/null +++ b/LawFirm/AbstractLawFirmDatabaseImplement/DatabaseImplementationExtension.cs @@ -0,0 +1,28 @@ +using AbstractLawFirmContracts.DI; +using AbstractLawFirmContracts.StoragesContracts; +using AbstractLawFirmDatabaseImplement.Implements; +using AbstractLawFirmDataBaseImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmDataBaseImplement +{ + 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/LawFirm/AbstractLawFirmDatabaseImplement/Implements/BackUpInfo.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..b93a78d --- /dev/null +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using AbstractLawFirmContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmDataBaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new AbstractLawFirmDatabase(); + return context.Set().ToList(); + } + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && + type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Client.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Client.cs index 171d7ec..d3f5cf0 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Client.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Client.cs @@ -9,21 +9,27 @@ using System.Threading.Tasks; using AbstractLawFirmDatabaseImplement.Models; using AbstractLawFirmContracts.BindingModels; using AbstractLawFirmContracts.ViewModels; +using System.Runtime.Serialization; namespace AbstractLawFirmDataBaseImplement.Models { - public class Client : IClientModel + [DataContract] + public class Client : IClientModel { + [DataMember] public int Id { get; private set; } [Required] - public string ClientFIO { get; private set; } = string.Empty; + [DataMember] + public string ClientFIO { get; private set; } = string.Empty; [Required] - public string Email { get; private set; } = string.Empty; + [DataMember] + public string Email { get; private set; } = string.Empty; [Required] - public string Password { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Component.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Component.cs index 8069012..2d14894 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Component.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Component.cs @@ -10,16 +10,21 @@ using System.Text; using System.Threading.Tasks; using AbstractLawFirmDataBaseImplement.Models; using AbstractLawFirmDatabaseImplement.Models; +using System.Runtime.Serialization; namespace AbstractLawFirmDataBaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } [Required] - public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public string ComponentName { get; private set; } = string.Empty; [Required] - public double Cost { get; set; } + [DataMember] + public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List DocumentComponents { get; set; } = new(); public static Component? Create(ComponentBindingModel model) diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Document.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Document.cs index d105418..59ed9b3 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Document.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Document.cs @@ -10,19 +10,25 @@ using System.Text; using System.Threading.Tasks; using AbstractLawFirmDataBaseImplement.Models; using AbstractLawFirmDataBaseImplement; +using System.Runtime.Serialization; namespace AbstractLawFirmDatabaseImplement.Models { + [DataContract] public class Document : IDocumentModel { - public int Id { get; set; } + [DataMember] + public int Id { get; set; } [Required] - public string DocumentName { get; set; } = string.Empty; + [DataMember] + public string DocumentName { get; set; } = string.Empty; [Required] - public double Price { get; set; } + [DataMember] + public double Price { get; set; } private Dictionary? _documentComponents = null; [NotMapped] - public Dictionary DocumentComponents + [DataMember] + public Dictionary DocumentComponents { get { diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Implementer.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Implementer.cs index 21696b1..b10fb9d 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Implementer.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Implementer.cs @@ -6,22 +6,25 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace AbstractLawFirmDataBaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } - - public string ImplementerFIO { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; - - public int WorkExperience { get; private set; } - - public int Qualification { get; private set; } + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; + [DataMember] + public int WorkExperience { get; private set; } + [DataMember] + public int Qualification { get; private set; } [ForeignKey("ImplementerId")] public virtual List Orders { get; private set; } = new(); diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/MessageInfo.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/MessageInfo.cs index 5b751b3..358e8bf 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/MessageInfo.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/MessageInfo.cs @@ -5,24 +5,32 @@ 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 AbstractLawFirmDataBaseImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { [Key] - public string MessageId { get; private set; } = string.Empty; - public int? ClientId { get; private set; } + [DataMember] + public string MessageId { get; private set; } = string.Empty; + [DataMember] + public int? ClientId { get; private set; } [Required] - public string SenderName { get; private set; } = string.Empty; + [DataMember] + public string SenderName { get; private set; } = string.Empty; [Required] - public DateTime DateDelivery { get; private set; } + [DataMember] + public DateTime DateDelivery { get; private set; } [Required] - public string Subject { get; private set; } = string.Empty; + [DataMember] + public string Subject { get; private set; } = string.Empty; [Required] - public string Body { get; private set; } = string.Empty; + [DataMember] + public string Body { get; private set; } = string.Empty; public virtual Client? Client { get; private set; } public static MessageInfo? Create(MessageInfoBindingModel model) { @@ -50,5 +58,7 @@ namespace AbstractLawFirmDataBaseImplement.Models DateDelivery = DateDelivery, Subject = Subject, }; - } + + public int Id => throw new NotImplementedException(); + } } diff --git a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Order.cs b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Order.cs index 2c82507..5954dcc 100644 --- a/LawFirm/AbstractLawFirmDatabaseImplement/Models/Order.cs +++ b/LawFirm/AbstractLawFirmDatabaseImplement/Models/Order.cs @@ -7,29 +7,39 @@ 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 AbstractLawFirmDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { - public int Id { get; private set; } + [DataMember] + public int Id { get; private set; } [Required] - public int DocumentId { get; private set; } + [DataMember] + public int DocumentId { get; private set; } [Required] - public int ClientId { get; private set; } - public int? ImplementerId { get; private set; } + [DataMember] + public int ClientId { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } [Required] - public int Count { get; private set; } + [DataMember] + public int Count { get; private set; } [Required] - public double Sum { get; private set; } + [DataMember] + public double Sum { get; private set; } [Required] - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; [Required] - public DateTime DateCreate { get; private set; } = DateTime.Now; - - public DateTime? DateImplement { get; private set; } + [DataMember] + public DateTime DateCreate { get; private set; } = DateTime.Now; + [DataMember] + public DateTime? DateImplement { get; private set; } public virtual Document Document { get; set; } public virtual Client Client { get; set; } public Implementer? Implementer { get; private set; } diff --git a/LawFirm/AbstractLawFirmFileImpliment/FileImplementationExtension.cs b/LawFirm/AbstractLawFirmFileImpliment/FileImplementationExtension.cs new file mode 100644 index 0000000..43aa9bd --- /dev/null +++ b/LawFirm/AbstractLawFirmFileImpliment/FileImplementationExtension.cs @@ -0,0 +1,26 @@ +using AbstractLawFirmContracts.DI; +using AbstractLawFirmContracts.StoragesContracts; +using AbstractLawFirmFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmFileImplement +{ + 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(); + } + } +} diff --git a/LawFirm/AbstractLawFirmFileImpliment/Implements/BackUpInfo.cs b/LawFirm/AbstractLawFirmFileImpliment/Implements/BackUpInfo.cs new file mode 100644 index 0000000..b378fcf --- /dev/null +++ b/LawFirm/AbstractLawFirmFileImpliment/Implements/BackUpInfo.cs @@ -0,0 +1,34 @@ +using AbstractLawFirmContracts.StoragesContracts; +using AbstractLawFirmFileImpliment; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmFileImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + var source = DataFileSingleton.GetInstance(); + return (List?)source.GetType().GetProperties() + .FirstOrDefault(x => x.PropertyType.IsGenericType && x.PropertyType.GetGenericArguments()[0] == typeof(T)) + ?.GetValue(source); + } + public Type? GetTypeByModelInterface(string modelInterfaceName) + { + var assembly = typeof(BackUpInfo).Assembly; + var types = assembly.GetTypes(); + foreach (var type in types) + { + if (type.IsClass && type.GetInterface(modelInterfaceName) != null) + { + return type; + } + } + return null; + } + } +} diff --git a/LawFirm/AbstractLawFirmFileImpliment/Implements/OrderStorage.cs b/LawFirm/AbstractLawFirmFileImpliment/Implements/OrderStorage.cs index 936b857..dc3828a 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Implements/OrderStorage.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Implements/OrderStorage.cs @@ -27,30 +27,21 @@ namespace AbstractLawFirmFileImplement.Implements { return null; } - return source.Orders.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; - } + if (model.ImplementerId.HasValue && model.Status != null) + return source.Orders.FirstOrDefault(x => x.ImplementerId == model.ImplementerId && model.Status.Equals(x.Status))?.GetViewModel; + return source.Orders.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel; + } public List GetFilteredList(OrderSearchModel model) { - if (model.ClientId.HasValue) - { - return source.Orders - .Where(x => x.ClientId == model.ClientId) - .Select(x => x.GetViewModel) - .ToList(); - } - if (model.Status != null) - { - return source.Orders - .Where(x => model.Status.Equals(x.Status)) - .Select(x => x.GetViewModel) - .ToList(); - } - return source.Orders - .Where(x => x.Id == model.Id || model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo) - .Select(x => x.GetViewModel) - .ToList(); - } + return source.Orders + .Where(x => x.Id == model.Id || + model.DateFrom <= x.DateCreate && x.DateCreate <= model.DateTo || + x.ClientId == model.ClientId || + model.Status.Equals(x.Status)) + .Select(x => x.GetViewModel) + .ToList(); + } public List GetFullList() { @@ -101,7 +92,7 @@ namespace AbstractLawFirmFileImplement.Implements { viewModel.DocumentName = document.DocumentName; } - return viewModel; + return viewModel; } } } \ No newline at end of file diff --git a/LawFirm/AbstractLawFirmFileImpliment/Models/Component.cs b/LawFirm/AbstractLawFirmFileImpliment/Models/Component.cs index 2ff458b..03a0e43 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Models/Component.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Models/Component.cs @@ -4,17 +4,22 @@ using AbstractLawFirmDataModels.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 AbstractLawFirmFileImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } - public string ComponentName { get; private set; } = string.Empty; - public double Cost { get; set; } + [DataMember] + public string ComponentName { get; private set; } = string.Empty; + [DataMember] + public double Cost { get; set; } public static Component? Create(ComponentBindingModel model) { if (model == null) diff --git a/LawFirm/AbstractLawFirmFileImpliment/Models/Document.cs b/LawFirm/AbstractLawFirmFileImpliment/Models/Document.cs index 3aacd44..a031b82 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Models/Document.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Models/Document.cs @@ -5,17 +5,22 @@ using AbstractLawFirmFileImpliment; 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 AbstractLawFirmFileImplement.Models { + [DataContract] public class Document : IDocumentModel { - public int Id { get; private set; } - public string DocumentName { get; private set; } = string.Empty; - public double Price { get; private set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public string DocumentName { get; private set; } = string.Empty; + [DataMember] + public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _documentComponents = null; public Dictionary DocumentComponents diff --git a/LawFirm/AbstractLawFirmFileImpliment/Models/Implementer.cs b/LawFirm/AbstractLawFirmFileImpliment/Models/Implementer.cs index d93da70..114b1ea 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Models/Implementer.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Models/Implementer.cs @@ -4,23 +4,26 @@ using AbstractLawFirmDataModels.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 AbstractLawFirmFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { - public int Id { get; private set; } - - public string ImplementerFIO { get; private set; } = string.Empty; - - public string Password { get; private set; } = string.Empty; - - public int WorkExperience { get; private set; } - - public int Qualification { get; private set; } + [DataMember] + public int Id { get; private set; } + [DataMember] + public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] + public string Password { get; private set; } = string.Empty; + [DataMember] + public int WorkExperience { get; private set; } + [DataMember] + public int Qualification { get; private set; } public static Implementer? Create(XElement element) { diff --git a/LawFirm/AbstractLawFirmFileImpliment/Models/MessageInfo.cs b/LawFirm/AbstractLawFirmFileImpliment/Models/MessageInfo.cs index bf01ab2..f96c381 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Models/MessageInfo.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Models/MessageInfo.cs @@ -4,24 +4,28 @@ using AbstractLawFirmDataModels.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 AbstractLawFirmFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { + public int Id => throw new NotImplementedException(); + [DataMember] public string MessageId { get; set; } = string.Empty; - + [DataMember] public int? ClientId { get; set; } - + [DataMember] public string SenderName { get; set; } = string.Empty; - + [DataMember] public DateTime DateDelivery { get; set; } - + [DataMember] public string Subject { get; set; } = string.Empty; - + [DataMember] public string Body { get; set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel? model) diff --git a/LawFirm/AbstractLawFirmFileImpliment/Models/Order.cs b/LawFirm/AbstractLawFirmFileImpliment/Models/Order.cs index 4e8fbbe..c23cd68 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/Models/Order.cs +++ b/LawFirm/AbstractLawFirmFileImpliment/Models/Order.cs @@ -7,23 +7,34 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; namespace AbstractLawFirmFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } - public int DocumentId { get; private set; } - public int ClientId { get; private set; } - public int? ImplementerId { get; set; } - public int Count { get; private set; } - public double Sum { get; private set; } - public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - public DateTime DateCreate { get; private set; } - public DateTime? DateImplement { get; private set; } + [DataMember] + public int DocumentId { get; private set; } + [DataMember] + public int ClientId { get; private set; } + [DataMember] + public int? ImplementerId { get; set; } + [DataMember] + public int Count { get; private set; } + [DataMember] + public double Sum { get; private set; } + [DataMember] + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + [DataMember] + public DateTime DateCreate { get; private set; } + [DataMember] + public DateTime? DateImplement { get; private set; } public static Order? Create(OrderBindingModel? model) { if (model == null) diff --git a/LawFirm/AbstractLawFirmListImplement/AbstractLawFirmListImplement.csproj b/LawFirm/AbstractLawFirmListImplement/AbstractLawFirmListImplement.csproj index 1451b06..431c379 100644 --- a/LawFirm/AbstractLawFirmListImplement/AbstractLawFirmListImplement.csproj +++ b/LawFirm/AbstractLawFirmListImplement/AbstractLawFirmListImplement.csproj @@ -17,4 +17,8 @@ + + + + diff --git a/LawFirm/AbstractLawFirmListImplement/Implements/BackUpInfo.cs b/LawFirm/AbstractLawFirmListImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..9919e01 --- /dev/null +++ b/LawFirm/AbstractLawFirmListImplement/Implements/BackUpInfo.cs @@ -0,0 +1,22 @@ +using AbstractLawFirmContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmListImplement.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/LawFirm/AbstractLawFirmListImplement/Implements/OrderStorage.cs b/LawFirm/AbstractLawFirmListImplement/Implements/OrderStorage.cs index 661f622..46b2503 100644 --- a/LawFirm/AbstractLawFirmListImplement/Implements/OrderStorage.cs +++ b/LawFirm/AbstractLawFirmListImplement/Implements/OrderStorage.cs @@ -85,8 +85,17 @@ namespace AbstractLawFirmListImplement.Implements { return order.GetViewModel; } - } - return null; + else if (model.ImplementerId.HasValue && model.Status != null && order.ImplementerId == model.ImplementerId && model.Status.Equals(order.Status)) + { + return GetViewModel(order); + } + else if (model.ImplementerId.HasValue && model.ImplementerId == order.ImplementerId) + { + return order.GetViewModel; + } + } + + return null; } public OrderViewModel? Insert(OrderBindingModel model) { diff --git a/LawFirm/AbstractLawFirmListImplement/ListImplementationExtension.cs b/LawFirm/AbstractLawFirmListImplement/ListImplementationExtension.cs new file mode 100644 index 0000000..cd3c1f4 --- /dev/null +++ b/LawFirm/AbstractLawFirmListImplement/ListImplementationExtension.cs @@ -0,0 +1,26 @@ +using AbstractLawFirmContracts.DI; +using AbstractLawFirmContracts.StoragesContracts; +using AbstractLawFirmListImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AbstractLawFirmListImplement +{ + 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(); + } + } +} diff --git a/LawFirm/AbstractLawFirmListImplement/Models/MessageInfo.cs b/LawFirm/AbstractLawFirmListImplement/Models/MessageInfo.cs index f2003a8..041991a 100644 --- a/LawFirm/AbstractLawFirmListImplement/Models/MessageInfo.cs +++ b/LawFirm/AbstractLawFirmListImplement/Models/MessageInfo.cs @@ -11,6 +11,7 @@ namespace AbstractLawFirmListImplement.Models { public class MessageInfo : IMessageInfoModel { + public int Id => throw new NotImplementedException(); public string MessageId { get; set; } = string.Empty; public int? ClientId { get; set; } diff --git a/LawFirm/AbstractLawFirmListImplement/Models/Order.cs b/LawFirm/AbstractLawFirmListImplement/Models/Order.cs index 9d5fc89..749cc13 100644 --- a/LawFirm/AbstractLawFirmListImplement/Models/Order.cs +++ b/LawFirm/AbstractLawFirmListImplement/Models/Order.cs @@ -18,10 +18,10 @@ namespace AbstractLawFirmListImplement.Models public int? ImplementerId { get; private set; } public int Count { get; private set; } public double Sum { get; private set; } - public OrderStatus Status { get; private set; } - public DateTime DateCreate { get; private set; } - public DateTime? DateImplement { get; private set; } - public static Order? Create(OrderBindingModel? model) + public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; + public DateTime DateCreate { get; private set; } = DateTime.Now; + public DateTime? DateImplement { get; private set; } + public static Order? Create(OrderBindingModel? model) { if (model == null) { diff --git a/LawFirm/ImplementationExtensions/AbstractLawFirmContracts.dll b/LawFirm/ImplementationExtensions/AbstractLawFirmContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..8db224a70b06a1106583c7bcaeb1930b42c12ea5 GIT binary patch literal 32256 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 Z|Nr?PSpzp2|7P?D)Bi`7{(pR-{|o<4LMH$K literal 0 HcmV?d00001 diff --git a/LawFirm/ImplementationExtensions/AbstractLawFirmDataBaseImplement.dll b/LawFirm/ImplementationExtensions/AbstractLawFirmDataBaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..c205a6253d5d9a3a2c66d204d8c7f60855a707f3 GIT binary patch literal 88576 zcmeEv31C#!)&F^KCT}MDHY8*LGf5@{f)OyNC`v+D6$J%%kqjhiG-O~B6pUaZXvMv5 zb)lL7F1S>2U#JFIs;$*jt#y|atHoMd{cNq)(*N(Aci+5unMq95eqX=uZ*(nR(XvSiV=2^VKd>2Jr7i}--8BygbTN{?Qf?jhJ{Dn-~s{FRpz^jsOHWwIN_v`mr6{4M>@hBC z!8iQKbS(ocNYahU(~Qw|<-=K3YB2e|Z|3AILGAnv_L>rRe*D%NXqIF7s6+@6BO6 zgwjdt1G#3vle4tIQV;7fu=E&LdP8*yLQ0k%Scy**le@2kEm`8yoxZ5E@qS&H5kp~U!Pv>Edc`Zx(TxsQ)B(3fT(b0I@4 zn|(Z{+>A3@G1?fKeLPh4F`G5o7)l>U_vI0&hyRMUTy*1gj=tnd;`F6hkL^n_E`7;4 z;-O1m6VnFztPOpZ7wI#$I+#A=Y6jD1T<_QQS)?!agEIFCrcn7F%infiuo!*8QuKug zBYlw|eUTj77hK3_W9aM)wqi(4&c0x?MjONa`{GXwh>a*EX2GiZD&JyCrh%HO;e=rn~VEBr+!P_~H#VUtJ@w#W&>7WK4*m26Q@Ggh)iJ7?3_~@{A5%VA_}mhsjbW&k z`9sSQ8rb2M83IGtLORy%r{Ep`6}@r83-38{RT>wYs~prgxhjo{%~ffW29_e@efBMfqd`1Yu|bgUS?c>p^?ek7KM)y) ztd3#G+8Bnc%)^kCc^Hba%-5G9{}N@q<)BX9*Q_!|FIOXtjTmhV&H1`c4KucCh$rTJ zJwuH#uEuC%XpXTlYK(EUMjJzOj15&|jNLHW7|Ixn-UqGVfq}oGm;PLJoMUW=JF#Pf zeTp+S#F^N!A-=?p4RJ-r#wgUy`=&SXog{hvq)tl;B6-bT3?{GHt-<6q`#G4rX2%DU z*W8k?&FjcUY&Ntxx#pU*yGp2y!WMUsq*A<4KDl8g&+l5rtUGA_h(y%gfP zeG_7tEV-6z=Gq}Qf@7Gow7HXJi$)tmGvk)4jN>W{anH=SI+bx;r_sjH%(xjUEHGOJseXkOp(D#Cw7>u3Ds9Y-#Tqp`Wj-p0vA zaWgg-#mm@S6enZnY4$WE^YkdrPdDb>6v@x?T(qPxlAr9^VDgh)9ZY_*?}N!tZp>iv zlUw(-`5C~x%kBNzdDl$jV!ixWXw#^L3ej^fpD)*@u5~N13viD*%o4a_Xk2W&c?e*i z=N?sz>wZDNz}2?N5CjbLx5*F$d67LPfzHHtD*A!+He8IkeS5VeWAxFa>%2-Dt4;jl@WbyGLW=T2vxMC%nRo0U$$iu!OmrPFt0RvfN zG6Z427Q(MI_|=jHn@NVg5&>~j3%b(?xI!nQ4&JU91Ol!l@g7A8xFu;O1e{1R_8Qsj z7Ro1;>u{(Xm%|ky%!3ArKVi~M8|7jH1luS_sv0!v!!mW

iWi=;d(qmat`m0~ZDcX$!u}$P;SC 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/LawFirm/ImplementationExtensions/AbstractLawFirmFileImplement.dll b/LawFirm/ImplementationExtensions/AbstractLawFirmFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..e52c51d3fcc5e93f43280ef8f8a1332ee2c86f09 GIT binary patch literal 36352 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 literal 0 HcmV?d00001 diff --git a/LawFirm/ImplementationExtensions/AbstractLawFirmListImplement.dll b/LawFirm/ImplementationExtensions/AbstractLawFirmListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..234577c7cbee4630c399e7bdaae7232e907e4159 GIT binary patch literal 24064 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 DataGridView grid, List? data) + { + if (data == null) + { + return; + } + grid.DataSource = data; + var type = typeof(T); + var properties = type.GetProperties(); + foreach (DataGridViewColumn column in grid.Columns) + { + var property = properties.FirstOrDefault(x => x.Name == column.Name); + if (property == null) + { + throw new InvalidOperationException($"В типе {type.Name} не найдено свойство с именем {column.Name}"); + } + var attribute = property.GetCustomAttributes(typeof(ColumnAttribute), true)?.SingleOrDefault(); + if (attribute == null) + { + throw new InvalidOperationException($"Не найден атрибут типа ColumnAttribute для свойства {property.Name}"); + } + // ищем нужный нам атрибут + if (attribute is ColumnAttribute columnAttr) + { + column.HeaderText = columnAttr.Title; + column.Visible = columnAttr.Visible; + if (columnAttr.IsUseAutoSize) + { + column.AutoSizeMode = (DataGridViewAutoSizeColumnMode)Enum.Parse(typeof(DataGridViewAutoSizeColumnMode), columnAttr.GridViewAutoSize.ToString()); + } + else + { + column.Width = columnAttr.Width; + } + } + } + } + } +} diff --git a/LawFirm/LawFirmView/FormClients.cs b/LawFirm/LawFirmView/FormClients.cs index 7e59375..0217c18 100644 --- a/LawFirm/LawFirmView/FormClients.cs +++ b/LawFirm/LawFirmView/FormClients.cs @@ -32,14 +32,8 @@ namespace LawFirmView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/LawFirm/LawFirmView/FormComponents.cs b/LawFirm/LawFirmView/FormComponents.cs index b5111e9..19c8389 100644 --- a/LawFirm/LawFirmView/FormComponents.cs +++ b/LawFirm/LawFirmView/FormComponents.cs @@ -1,5 +1,6 @@ using AbstractLawFirmContracts.BindingModels.BindingModels; using AbstractLawFirmContracts.BusinessLogicsContracts; +using AbstractLawFirmContracts.DI; using Microsoft.Extensions.Logging; using Microsoft.VisualBasic.Logging; using System; @@ -33,16 +34,9 @@ namespace LawFirmView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ComponentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка компонентов"); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки компонентов"); @@ -53,31 +47,26 @@ namespace LawFirmView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - if (form.ShowDialog() == DialogResult.OK) + 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(FormComponent)); - if (service is FormComponent form) - { - form.Id = + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); if (form.ShowDialog() == DialogResult.OK) { LoadData(); } - } + } } diff --git a/LawFirm/LawFirmView/FormDocument.cs b/LawFirm/LawFirmView/FormDocument.cs index f73ea35..3e9440c 100644 --- a/LawFirm/LawFirmView/FormDocument.cs +++ b/LawFirm/LawFirmView/FormDocument.cs @@ -12,6 +12,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using AbstractLawFirmContracts.DI; namespace LawFirmView { @@ -86,30 +87,27 @@ pc.Value.Item1.ComponentName, pc.Value.Item2 }); private void buttonAdd_Click(object sender, EventArgs e) { - var service = - Program.ServiceProvider?.GetService(typeof(FormDocumentComponent)); - if (service is FormDocumentComponent 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 (_documentComponents.ContainsKey(form.Id)) - { - _documentComponents[form.Id] = (form.ComponentModel, - form.Count); - } - else - { - _documentComponents.Add(form.Id, (form.ComponentModel, - form.Count)); - } - LoadData(); - } - } + + return; + } + _logger.LogInformation("Добавление нового компонента:{ ComponentName}- { Count}", form.ComponentModel.ComponentName, form.Count); + if (_documentComponents.ContainsKey(form.Id)) + { + _documentComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _documentComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } } @@ -117,11 +115,8 @@ pc.Value.Item1.ComponentName, pc.Value.Item2 }); { if (dataGridView.SelectedRows.Count == 1) { - var service = - Program.ServiceProvider?.GetService(typeof(FormDocumentComponent)); - if (service is FormDocumentComponent form) - { - int id = + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); form.Id = id; form.Count = _documentComponents[id].Item2; @@ -136,7 +131,7 @@ pc.Value.Item1.ComponentName, pc.Value.Item2 }); LoadData(); } } - } + } diff --git a/LawFirm/LawFirmView/FormDocuments.cs b/LawFirm/LawFirmView/FormDocuments.cs index cbbdda6..5d87c73 100644 --- a/LawFirm/LawFirmView/FormDocuments.cs +++ b/LawFirm/LawFirmView/FormDocuments.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using AbstractLawFirmContracts.DI; namespace LawFirmView { @@ -33,17 +34,9 @@ namespace LawFirmView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["DocumentName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView.Columns["DocumentComponents"].Visible = false; - } - _logger.LogInformation("Загрузка пакетов документов"); - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка пакетов документов"); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки пакетов документов"); @@ -54,29 +47,25 @@ namespace LawFirmView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormDocument)); - if (service is FormDocument form) - { - if (form.ShowDialog() == DialogResult.OK) + 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(FormDocument)); - if (service is FormDocument form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); if (form.ShowDialog() == DialogResult.OK) { LoadData(); } - } + } } diff --git a/LawFirm/LawFirmView/FormImplementers.cs b/LawFirm/LawFirmView/FormImplementers.cs index 8580c6d..4287216 100644 --- a/LawFirm/LawFirmView/FormImplementers.cs +++ b/LawFirm/LawFirmView/FormImplementers.cs @@ -1,5 +1,6 @@ using AbstractLawFirmContracts.BindingModels; using AbstractLawFirmContracts.BusinessLogicsContracts; +using AbstractLawFirmContracts.DI; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -32,15 +33,9 @@ namespace LawFirmView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка исполнителей"); - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка исполнителей"); + } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки исполнителей"); @@ -51,30 +46,25 @@ namespace LawFirmView private void buttonCreate_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) - { - if (form.ShowDialog() == DialogResult.OK) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { LoadData(); } - } } private void buttonUpdate_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); if (form.ShowDialog() == DialogResult.OK) { LoadData(); } } - } + } private void buttonDelete_Click(object sender, EventArgs e) diff --git a/LawFirm/LawFirmView/FormMail.cs b/LawFirm/LawFirmView/FormMail.cs index d3ad954..9a468ef 100644 --- a/LawFirm/LawFirmView/FormMail.cs +++ b/LawFirm/LawFirmView/FormMail.cs @@ -31,14 +31,7 @@ namespace LawFirmView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Loading materials"); } catch (Exception ex) diff --git a/LawFirm/LawFirmView/FormMain.cs b/LawFirm/LawFirmView/FormMain.cs index 1a207b6..6ea4978 100644 --- a/LawFirm/LawFirmView/FormMain.cs +++ b/LawFirm/LawFirmView/FormMain.cs @@ -4,6 +4,7 @@ using AbstractLawFirmContracts.BusinessLogicsContracts; using AbstractLawFirmDataModels.Enums; using Microsoft.Extensions.Logging; using AbstractLawFirmBusinessLogic.BusinessLogic; +using AbstractLawFirmContracts.DI; namespace LawFirmView { @@ -13,14 +14,16 @@ namespace LawFirmView 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) { @@ -31,17 +34,8 @@ namespace LawFirmView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["DocumentId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - - } - _logger.LogInformation("Загрузка заказов"); - } + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); + _logger.LogInformation("Загрузка заказов");} catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки заказов"); @@ -51,31 +45,24 @@ namespace LawFirmView 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(FormDocuments)); - if (service is FormDocuments 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(); } @@ -192,51 +179,60 @@ namespace LawFirmView private void компонентыПоПакетамДокументовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportDocumentComponents)); - if (service is FormReportDocumentComponents 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) { - var service = Program.ServiceProvider?.GetService(typeof(Исполнители)); - if (service is Исполнители form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve<Исполнители>(); + form.ShowDialog(); + } private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); - }private void почтаToolStripMenuItem_Click(object sender, EventArgs e) - { - var service = Program.ServiceProvider?.GetService(typeof(FormMail)); - if (service is FormMail form) - { - form.ShowDialog(); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } + private void почтаToolStripMenuItem_Click(object sender, EventArgs e) + { + 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 BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Backup created", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } diff --git a/LawFirm/LawFirmView/Program.cs b/LawFirm/LawFirmView/Program.cs index e6c0f66..4ede973 100644 --- a/LawFirm/LawFirmView/Program.cs +++ b/LawFirm/LawFirmView/Program.cs @@ -11,6 +11,8 @@ using NLog.Extensions.Logging; using System; using AbstractLawFirmDataBaseImplement.Implements; using AbstractLawFirmBusinessLogic.MailWorker; +using AbstractLawFirmContracts.DI; +using DocumentFormat.OpenXml.Spreadsheet; using AbstractLawFirmContracts.BindingModels; namespace LawFirmView @@ -28,13 +30,10 @@ namespace LawFirmView // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + InitDependency(); try { - var mailSender = - _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = @@ -62,47 +61,46 @@ namespace LawFirmView logger?.LogError(ex, "Error"); } - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void ConfigureServices(ServiceCollection services) - { - services.AddLogging(option => - { - option.SetMinimumLevel(LogLevel.Information); - option.AddNLog("nlog.config"); - }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient<Исполнители>(); - services.AddTransient(); - services.AddTransient(); + private static void InitDependency() + { + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType<Исполнители>(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); + + } } \ No newline at end of file -- 2.25.1 From 810ef89776efb2a732aa7a1b69de1a2e9102e8c4 Mon Sep 17 00:00:00 2001 From: GokaPek Date: Wed, 22 May 2024 10:02:25 +0400 Subject: [PATCH 3/3] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D1=82=D0=B8=20=D0=B3?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B2=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++ .../AbstractLawFirmFileImplement.csproj | 4 ++ LawFirm/LawFirmView/FormMain.cs | 1 - LawFirm/LawFirmView/FormMain.designer.cs | 11 +++- LawFirm/LawFirmView/Program.cs | 50 +++++++------------ 5 files changed, 35 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index ca1c7a3..d62d4cb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# dll files +*.dll + # Mono auto generated files mono_crash.* diff --git a/LawFirm/AbstractLawFirmFileImpliment/AbstractLawFirmFileImplement.csproj b/LawFirm/AbstractLawFirmFileImpliment/AbstractLawFirmFileImplement.csproj index f54052f..56a4927 100644 --- a/LawFirm/AbstractLawFirmFileImpliment/AbstractLawFirmFileImplement.csproj +++ b/LawFirm/AbstractLawFirmFileImpliment/AbstractLawFirmFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/LawFirm/LawFirmView/FormMain.cs b/LawFirm/LawFirmView/FormMain.cs index 6ea4978..3b5aa85 100644 --- a/LawFirm/LawFirmView/FormMain.cs +++ b/LawFirm/LawFirmView/FormMain.cs @@ -52,7 +52,6 @@ namespace LawFirmView private void пакетыДокументовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormDocuments)); var form = DependencyManager.Instance.Resolve(); form.ShowDialog(); diff --git a/LawFirm/LawFirmView/FormMain.designer.cs b/LawFirm/LawFirmView/FormMain.designer.cs index d545a86..a8daaf0 100644 --- a/LawFirm/LawFirmView/FormMain.designer.cs +++ b/LawFirm/LawFirmView/FormMain.designer.cs @@ -46,6 +46,7 @@ buttonOrderReady = new Button(); buttonIssuedOrder = new Button(); buttonRef = new Button(); + создатьБекапToolStripMenuItem = new ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); SuspendLayout(); @@ -53,7 +54,7 @@ // menuStrip1 // menuStrip1.ImageScalingSize = new Size(20, 20); - menuStrip1.Items.AddRange(new ToolStripItem[] { toolStripMenuItemCatalogs, отчётыToolStripMenuItem, ЗапускРаботToolStripMenuItem, почтаToolStripMenuItem }); + menuStrip1.Items.AddRange(new ToolStripItem[] { toolStripMenuItemCatalogs, отчётыToolStripMenuItem, ЗапускРаботToolStripMenuItem, почтаToolStripMenuItem, создатьБекапToolStripMenuItem }); menuStrip1.Location = new Point(0, 0); menuStrip1.Name = "menuStrip1"; menuStrip1.Padding = new Padding(7, 3, 0, 3); @@ -205,6 +206,13 @@ buttonRef.UseVisualStyleBackColor = true; buttonRef.Click += buttonRef_Click; // + // создатьБекапToolStripMenuItem + // + создатьБекапToolStripMenuItem.Name = "создатьБекапToolStripMenuItem"; + создатьБекапToolStripMenuItem.Size = new Size(123, 24); + создатьБекапToolStripMenuItem.Text = "Создать бекап"; + создатьБекапToolStripMenuItem.Click += создатьБэкапToolStripMenuItem_Click; + // // FormMain // AutoScaleDimensions = new SizeF(8F, 20F); @@ -249,5 +257,6 @@ private ToolStripMenuItem ЗапускРаботToolStripMenuItem; private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem почтаToolStripMenuItem; + private ToolStripMenuItem создатьБекапToolStripMenuItem; } } \ No newline at end of file diff --git a/LawFirm/LawFirmView/Program.cs b/LawFirm/LawFirmView/Program.cs index 4ede973..f6f6c9b 100644 --- a/LawFirm/LawFirmView/Program.cs +++ b/LawFirm/LawFirmView/Program.cs @@ -17,50 +17,36 @@ using AbstractLawFirmContracts.BindingModels; namespace LawFirmView { - internal static class Program - { - private static ServiceProvider? _serviceProvider; - public static ServiceProvider? ServiceProvider => _serviceProvider; - ///

- /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); + internal static class Program + { + [STAThread] + static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); InitDependency(); + try { var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { - MailLogin = - System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? - string.Empty, - MailPassword = - System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? - string.Empty, - SmtpClientHost = - System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? - string.Empty, - SmtpClientPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), - PopHost = - System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, - PopPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) + MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, + MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, + SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty, + SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), + PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, + PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) }); - var timer = new System.Threading.Timer(new - TimerCallback(MailCheck!), null, 0, 100000); + + var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } catch (Exception ex) { - var logger = _serviceProvider.GetService(); + var logger = DependencyManager.Instance.Resolve(); logger?.LogError(ex, "Error"); } - Application.Run(DependencyManager.Instance.Resolve()); } private static void InitDependency() -- 2.25.1