From 05dc6a67116f3accf02ec22ba4b37d8a9a0de42d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=AF=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D1=87=D1=83=D0=BA?= Date: Thu, 20 Jun 2024 23:14:06 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=D0=B8=D0=B7=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MotorPlantContracts.dll | Bin 0 -> 30720 bytes .../MotorPlantDataModels.dll | Bin 0 -> 6656 bytes .../MotorPlantDatabaseImplement.dll | Bin 0 -> 75776 bytes .../MotorPlantFileImplement.dll | Bin 0 -> 40448 bytes .../MotorPlantListImplement.dll | Bin 0 -> 26112 bytes .../MotorPlantBusinessLogic/BackUpLogic.cs | 98 ++++++ .../Attributes/ColumnAttribute.cs | 26 ++ .../Attributes/GridViewAutoSize.cs | 20 ++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 + .../BusinessLogicsContracts/IBackUpLogic.cs | 14 + .../DI/DependencyManager.cs | 58 ++++ .../DI/IDependencyContainer.cs | 37 +++ .../DI/IImplementationExtension.cs | 17 + .../DI/ServiceDependencyContainer.cs | 56 ++++ .../DI/ServiceProviderLoader.cs | 54 ++++ .../StoragesContracts/IBackUpInfo.cs | 14 + .../MotorPlantDatabaseImplement/BackUpInfo.cs | 31 ++ .../ImplementationExtension.cs | 21 ++ .../20240620185256_InitialCreate.Designer.cs | 296 ++++++++++++++++++ .../20240620185256_InitialCreate.cs | 214 +++++++++++++ .../MotorPlantFileImplement/BackUpInfo.cs | 41 +++ .../ImplementationExtension.cs | 21 ++ .../MotorPlantListImplement/BackUpInfo.cs | 21 ++ .../ImplementationExtension.cs | 21 ++ .../MotorPlantView/DataGridViewExtension.cs | 51 +++ 25 files changed, 1124 insertions(+) create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantContracts.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDataModels.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll create mode 100644 MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/DependencyManager.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs create mode 100644 MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs create mode 100644 MotorPlant/MotorPlantFileImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantListImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantListImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantView/DataGridViewExtension.cs diff --git a/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll b/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..cc410945cc6f458d9dee6cb43796edce155d8099 GIT binary patch literal 30720 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 ls}?O8!l>`wtEo7+Z@ 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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..71b079881741e6513b5cb215e650e8ad0767301a GIT binary patch literal 75776 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 P>xX}TP5gspgFW#7AhOuB literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..887b88304e69c4aec1a8b6cfb5ae45b7837a610a GIT binary patch literal 40448 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 S{y!t$Uf|*V5BmR21pXf_mkCG! literal 0 HcmV?d00001 diff --git a/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..ec4e73f --- /dev/null +++ b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Logging; +using MotorPlantContracts.BindingModels; +using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDataModels; +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 MotorPlantBusinessLogic.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/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..e9b2332 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + public bool Visible { get; private set; } + public int Width { get; private set; } + public GridViewAutoSize GridViewAutoSize { get; private set; } + public bool IsUseAutoSize { get; private set; } + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} diff --git a/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..992e7eb --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..742f6c6 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..1101056 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using MotorPlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..3ee20ed --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs @@ -0,0 +1,58 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + private static DependencyManager? _manager; + private static readonly object _locjObject = new(); + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + /// + /// Иницализация библиотек, в которых идут установки зависомстей + /// + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + /// + /// Регистрация логгера + /// + /// + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..1021b53 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..24e7a7b --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..8a13157 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,56 @@ +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 MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..c045c9f --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public class ServiceProviderLoader + { + /// + /// Загрузка всех классов-реализаций IImplementationExtension + /// + /// + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + return source; + } + private static string TryGetImplementationExtensionsFolder() + { + var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); + while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } +} diff --git a/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..1911d22 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs new file mode 100644 index 0000000..424b9e9 --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs @@ -0,0 +1,31 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new MotorPlantDataBase(); + 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/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs new file mode 100644 index 0000000..2e711fe --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDatabaseImplement.Implements; + +namespace MotorPlantDatabaseImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 3; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs new file mode 100644 index 0000000..af1ec98 --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs @@ -0,0 +1,296 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MotorPlantDatabaseImplement; + +#nullable disable + +namespace MotorPlantDatabaseImplement.Migrations +{ + [DbContext(typeof(MotorPlantDataBase))] + [Migration("20240620185256_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Cost") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Engine", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("EngineName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Price") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Engines"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("EngineId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("EngineId"); + + b.ToTable("EngineComponents"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Qualification") + .HasColumnType("int"); + + b.Property("WorkExperience") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.MessageInfo", b => + { + b.Property("MessageId") + .HasColumnType("nvarchar(450)"); + + b.Property("Body") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("DateDelivery") + .HasColumnType("datetime2"); + + b.Property("SenderName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Subject") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("MessageId"); + + b.HasIndex("ClientId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); + + b.Property("ClientId") + .HasColumnType("int"); + + b.Property("Count") + .HasColumnType("int"); + + b.Property("DateCreate") + .HasColumnType("datetime2"); + + b.Property("DateImplement") + .HasColumnType("datetime2"); + + b.Property("EngineId") + .HasColumnType("int"); + + b.Property("ImplementerId") + .HasColumnType("int"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("Sum") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.HasIndex("ClientId"); + + b.HasIndex("EngineId"); + + b.HasIndex("ImplementerId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b => + { + b.HasOne("MotorPlantDatabaseImplement.Models.Component", "Component") + .WithMany("EngineComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine") + .WithMany("Components") + .HasForeignKey("EngineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Engine"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.MessageInfo", b => + { + b.HasOne("MotorPlantDatabaseImplement.Models.Client", "Client") + .WithMany() + .HasForeignKey("ClientId"); + + b.Navigation("Client"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b => + { + b.HasOne("MotorPlantDatabaseImplement.Models.Client", "Client") + .WithMany("Orders") + .HasForeignKey("ClientId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine") + .WithMany("Orders") + .HasForeignKey("EngineId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("MotorPlantDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Orders") + .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("Engine"); + + b.Navigation("Implementer"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Client", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b => + { + b.Navigation("EngineComponents"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Engine", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); + + modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs new file mode 100644 index 0000000..7dae505 --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs @@ -0,0 +1,214 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace MotorPlantDatabaseImplement.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Clients", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ClientFIO = table.Column(type: "nvarchar(max)", nullable: false), + Email = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Clients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Components", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ComponentName = table.Column(type: "nvarchar(max)", nullable: false), + Cost = table.Column(type: "float", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Components", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Engines", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + EngineName = table.Column(type: "nvarchar(max)", nullable: false), + Price = table.Column(type: "float", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Engines", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Implementers", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + ImplementerFIO = table.Column(type: "nvarchar(max)", nullable: false), + Password = table.Column(type: "nvarchar(max)", nullable: false), + Qualification = table.Column(type: "int", nullable: false), + WorkExperience = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Messages", + columns: table => new + { + MessageId = table.Column(type: "nvarchar(450)", nullable: false), + ClientId = table.Column(type: "int", nullable: true), + SenderName = table.Column(type: "nvarchar(max)", nullable: false), + DateDelivery = table.Column(type: "datetime2", nullable: false), + Subject = table.Column(type: "nvarchar(max)", nullable: false), + Body = table.Column(type: "nvarchar(max)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Messages", x => x.MessageId); + table.ForeignKey( + name: "FK_Messages_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "EngineComponents", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + EngineId = table.Column(type: "int", nullable: false), + ComponentId = table.Column(type: "int", nullable: false), + Count = table.Column(type: "int", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_EngineComponents", x => x.Id); + table.ForeignKey( + name: "FK_EngineComponents_Components_ComponentId", + column: x => x.ComponentId, + principalTable: "Components", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_EngineComponents_Engines_EngineId", + column: x => x.EngineId, + principalTable: "Engines", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + Count = table.Column(type: "int", nullable: false), + Sum = table.Column(type: "float", nullable: false), + Status = table.Column(type: "int", nullable: false), + DateCreate = table.Column(type: "datetime2", nullable: false), + DateImplement = table.Column(type: "datetime2", nullable: true), + EngineId = table.Column(type: "int", nullable: false), + ClientId = table.Column(type: "int", nullable: false), + ImplementerId = table.Column(type: "int", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Clients_ClientId", + column: x => x.ClientId, + principalTable: "Clients", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Engines_EngineId", + column: x => x.EngineId, + principalTable: "Engines", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerId", + column: x => x.ImplementerId, + principalTable: "Implementers", + principalColumn: "Id"); + }); + + migrationBuilder.CreateIndex( + name: "IX_EngineComponents_ComponentId", + table: "EngineComponents", + column: "ComponentId"); + + migrationBuilder.CreateIndex( + name: "IX_EngineComponents_EngineId", + table: "EngineComponents", + column: "EngineId"); + + migrationBuilder.CreateIndex( + name: "IX_Messages_ClientId", + table: "Messages", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ClientId", + table: "Orders", + column: "ClientId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_EngineId", + table: "Orders", + column: "EngineId"); + + migrationBuilder.CreateIndex( + name: "IX_Orders_ImplementerId", + table: "Orders", + column: "ImplementerId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "EngineComponents"); + + migrationBuilder.DropTable( + name: "Messages"); + + migrationBuilder.DropTable( + name: "Orders"); + + migrationBuilder.DropTable( + name: "Components"); + + migrationBuilder.DropTable( + name: "Clients"); + + migrationBuilder.DropTable( + name: "Engines"); + + migrationBuilder.DropTable( + name: "Implementers"); + } + } +} diff --git a/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs new file mode 100644 index 0000000..53ecfd7 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs @@ -0,0 +1,41 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantFileImplement.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/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs new file mode 100644 index 0000000..a028733 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantFileImplement.Implements; + +namespace MotorPlantFileImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 1; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantListImplement/BackUpInfo.cs b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs new file mode 100644 index 0000000..3a224b1 --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantListImplement.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/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs new file mode 100644 index 0000000..670794e --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantListImplement.Implements; + +namespace MotorPlantListImplement +{ + internal class ImplementationExtension : IImplementationExtension + { + public int Priority => 0; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantView/DataGridViewExtension.cs b/MotorPlant/MotorPlantView/DataGridViewExtension.cs new file mode 100644 index 0000000..20a88f3 --- /dev/null +++ b/MotorPlant/MotorPlantView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MotorPlantContracts.Attributes; + +namespace MotorPlantView.Forms +{ + internal 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; + } + } + } + } + } +} -- 2.25.1 From aedcec516197a23e8832d8231dd3a1e5897408a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=AF=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D1=87=D1=83=D0=BA?= Date: Thu, 20 Jun 2024 23:14:44 +0400 Subject: [PATCH 2/4] =?UTF-8?q?=D0=B8=D0=B7=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MotorPlantContracts.dll | Bin 30720 -> 0 bytes .../MotorPlantDataModels.dll | Bin 6656 -> 0 bytes .../MotorPlantDatabaseImplement.dll | Bin 75776 -> 0 bytes .../MotorPlantFileImplement.dll | Bin 40448 -> 0 bytes .../MotorPlantListImplement.dll | Bin 26112 -> 0 bytes .../MotorPlantBusinessLogic/BackUpLogic.cs | 98 ------ .../Attributes/ColumnAttribute.cs | 26 -- .../Attributes/GridViewAutoSize.cs | 20 -- .../BindingModels/BackUpSaveBinidngModel.cs | 13 - .../BusinessLogicsContracts/IBackUpLogic.cs | 14 - .../DI/DependencyManager.cs | 58 ---- .../DI/IDependencyContainer.cs | 37 --- .../DI/IImplementationExtension.cs | 17 - .../DI/ServiceDependencyContainer.cs | 56 ---- .../DI/ServiceProviderLoader.cs | 54 ---- .../StoragesContracts/IBackUpInfo.cs | 14 - .../MotorPlantDatabaseImplement/BackUpInfo.cs | 31 -- .../ImplementationExtension.cs | 21 -- .../20240620185256_InitialCreate.Designer.cs | 296 ------------------ .../20240620185256_InitialCreate.cs | 214 ------------- .../MotorPlantFileImplement/BackUpInfo.cs | 41 --- .../ImplementationExtension.cs | 21 -- .../MotorPlantListImplement/BackUpInfo.cs | 21 -- .../ImplementationExtension.cs | 21 -- .../MotorPlantView/DataGridViewExtension.cs | 51 --- 25 files changed, 1124 deletions(-) delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantContracts.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDataModels.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll delete mode 100644 MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs delete mode 100644 MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs delete mode 100644 MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs delete mode 100644 MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs delete mode 100644 MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs delete mode 100644 MotorPlant/MotorPlantContracts/DI/DependencyManager.cs delete mode 100644 MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs delete mode 100644 MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs delete mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs delete mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs delete mode 100644 MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs delete mode 100644 MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs delete mode 100644 MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs delete mode 100644 MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs delete mode 100644 MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs delete mode 100644 MotorPlant/MotorPlantFileImplement/BackUpInfo.cs delete mode 100644 MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs delete mode 100644 MotorPlant/MotorPlantListImplement/BackUpInfo.cs delete mode 100644 MotorPlant/MotorPlantListImplement/ImplementationExtension.cs delete mode 100644 MotorPlant/MotorPlantView/DataGridViewExtension.cs diff --git a/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll b/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll deleted file mode 100644 index cc410945cc6f458d9dee6cb43796edce155d8099..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30720 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 ls}?O8!l>`wtEo7+Z@ zJ?-u#aa$mmk5WntO=+8=0;PpYs6`2gs3{Qg2NXdi)N@-Z(W)wKr3wkuhDudMRgwPQ z?B3m85(wqLs*F9qoA)tq-h1yq{zuQqWJICOVE!ZhZnj91cR*&dZyvE zWyhs$uPqzhqdT#pZRKsX5X-8jX}PhC7PCucOgCf69qCxX%4zZD=EfDi>ES`5ZIVoP zx83v8%4%=YC9x){lc)`xh{t_@4L)P&edt7U#W>{o%?$Qmw1YtKxydwfC#&**?b9cj zh4uvO?%+Wm(OaB|Gus5wZ15h46OEoJ`!G626b;CupsxwgaaTLwf>zi!$V9BZ-=IW` z5lzHx$IgNhzV%_ifnI+EE z>*Ag9?#}MD8`z^T8Nej!V)-pZNAY=O7~`~S>t^0zjdz;7G%eqirc)SmikENMl}fUZ z4Pu?;n+z+%G#W_hx~1Qf8kqQ()J^lf_~Exu=Y3p?&N<<7M1b&u=wkF)=!^Z%a@a!K zB76CZP;cldIYN&LyhVCgo2!nd128k_8`o zFjnYMWXz#us5BXIGSwn`6xM*DZz{b?KV*$U7L&u!Z1AbeeX3c={v7gTa|CtDr`iM+ z@--L2$2aATz?VY(6p0K|lEw~(!drj~1g;SHj>4RO0*7N9(_IS>itw%EZVkvDRf6+=Sx4QA_<}Zr)OYGuIH?3>c{vxDcaL&M zfLbL5SASCZa#a?=!4*YsKyO5ELZ2<@!+2g=iT866u#qkU&ZV^iHwf$(m=ZW5@CJb@ zFhWzncGAT-ih5lk*0~J0kmA54)D4W$dPpwBGqw`P?N&&d=oR2RngK4RQ^4i)9&j}! zq&Vh`06#MTLnK29H7raZvb(`X;4_p3QksVvXrHVBu(&d7yR1=|90?SlI|4z z#|6Gfm(bgiEHN$@I3O@9@Ck{%4WkMo6hZ_M>m;M zkkEWl;kEY4Z0AAcSzuh^Sx+e^;ddBkMF_r!fwS<(ku(4s5Jd>lGy|Jx4sbTAAOw0I zu!Y)zb7%o@F6tr#*H zz$K`u5axFSFD5?imQsS0gE#=;ZLRTX$0vQIEvCgnp`JGaEz!1@3`5Nr+QeEKQ;m`~ zS}KC*qNJX6b<0%kDG*lcppQWiOKWb8-GFq{6cWGL zQ1fT(R@{#WuT_-tb{{3I8I-D&8^ZTFJ8Tq#KMqu!&+#g*LR2cnqq!so3#x9=kmXwT zu%VhRN<C!RA5-z`x*=~96PO#n|DDXE4&sb@vzs?KYZ{?kJ7EDTooNnOpGmgDMK zr^52nf(Ohiy0m8R!vo;>C55=z35O~P=NvgSq-Sl*u_j&2%W3_lYD_sg*yr-z3*wxz zb28%`Th+h7gHP4X^eWa73Gg`>__Z%~zH4VM{yyNrm^{>D2_cibJKmP2hcTa46Od%yE zNl`gQQW%5QRwi4-a6|Oy)w^$PeZBDt)C5KPpFBmxRT! z%?843;G!_BvgH=^=9U<>w+)7(?X9U$+luHckgY>fREbgR2*VOw+L+TiB6na`2WE9( zR!99TkYZK`&jKuodYsmgsDv*%ZWr_W_h@MTb+%gEZkdAzvRaW3jnO@}wcnATH%s`r zQKE(M?SrEOmaX*{i=Xx%z>WKQpQbOiHw>^DRU3LGH`6O+BRHM&!>j{LF7#m-VpdZ zSY$z@?85oq{v%04!@RHjR`C|@-*1U~ybue`c^F=bK8-u+R^7CA;<4Mig>srO}@(*UdH1qZHQ{|(} z#>?L?KQdm+?zxAxb8Fnn+yp!LW*Rp&7n>89P}7PRa~Vos)8Ez8OTKgN&AxL;fZ8M7 z^f~#*zdbT@#T#FnL6DX9HjiT!s{XTbq4&7EQA$a}7*chU3QiVvrHLcepL2R8%$%93 zdV8Nx|3?{+L^0rJql5K9dru}#jI;Qx$G;t2-$!&WKg52!S6+wF7^P`9aFBLll)^7< z+d-#*o4sG%=!EjO_r168%Cql%UhUiABc9KIU`v9KU{xg>c69t6q`{_1lVl0C6~wbf zAyvV3AXmwSo(0NlN0oPARDw?~v~=+E=dkpO(CMVg-#W@*Omr=791`w+78R%{)|f&> zDkx2uAA-b1w`o|cZGuV)A5>yl4tfUs;}Sx{nVGHS zbv67}sS7=UOlR=BLnl`60hJNF1pG;$Ue^P=s299-7$tx`;C6xEg*$2w_&tzzUX&22k-NF8Wi{^(eo>w$Id6>|H%ye2Ur+q3IG5A diff --git a/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll deleted file mode 100644 index 71b079881741e6513b5cb215e650e8ad0767301a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75776 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 P>xX}TP5gspgFW#7AhOuB diff --git a/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll deleted file mode 100644 index 887b88304e69c4aec1a8b6cfb5ae45b7837a610a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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 S{y!t$Uf|*V5BmR21pXf_mkCG! diff --git a/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs deleted file mode 100644 index ec4e73f..0000000 --- a/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs +++ /dev/null @@ -1,98 +0,0 @@ -using Microsoft.Extensions.Logging; -using MotorPlantContracts.BindingModels; -using MotorPlantContracts.BusinessLogicsContracts; -using MotorPlantContracts.StoragesContracts; -using MotorPlantDataModels; -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 MotorPlantBusinessLogic.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/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs deleted file mode 100644 index e9b2332..0000000 --- a/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.Attributes -{ - [AttributeUsage(AttributeTargets.Property)] - public class ColumnAttribute : Attribute - { - public string Title { get; private set; } - public bool Visible { get; private set; } - public int Width { get; private set; } - public GridViewAutoSize GridViewAutoSize { get; private set; } - public bool IsUseAutoSize { get; private set; } - public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) - { - Title = title; - Visible = visible; - Width = width; - GridViewAutoSize = gridViewAutoSize; - IsUseAutoSize = isUseAutoSize; - } - } -} diff --git a/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs deleted file mode 100644 index 992e7eb..0000000 --- a/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.Attributes -{ - public enum GridViewAutoSize - { - NotSet = 0, - None = 1, - ColumnHeader = 2, - AllCellsExceptHeader = 4, - AllCells = 6, - DisplayedCellsExceptHeader = 8, - DisplayedCells = 10, - Fill = 16 - } -} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs deleted file mode 100644 index 742f6c6..0000000 --- a/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.BindingModels -{ - public class BackUpSaveBinidngModel - { - public string FolderName { get; set; } = string.Empty; - } -} diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs deleted file mode 100644 index 1101056..0000000 --- a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs +++ /dev/null @@ -1,14 +0,0 @@ -using MotorPlantContracts.BindingModels; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.BusinessLogicsContracts -{ - public interface IBackUpLogic - { - void CreateBackUp(BackUpSaveBinidngModel model); - } -} diff --git a/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs deleted file mode 100644 index 3ee20ed..0000000 --- a/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.DI -{ - public class DependencyManager - { - private readonly IDependencyContainer _dependencyManager; - private static DependencyManager? _manager; - private static readonly object _locjObject = new(); - private DependencyManager() - { - _dependencyManager = new ServiceDependencyContainer(); - } - public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } - - /// - /// Иницализация библиотек, в которых идут установки зависомстей - /// - public static void InitDependency() - { - var ext = ServiceProviderLoader.GetImplementationExtensions(); - if (ext == null) - { - throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); - } - // регистрируем зависимости - ext.RegisterServices(); - } - /// - /// Регистрация логгера - /// - /// - public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); - /// - /// Добавление зависимости - /// - /// - /// - public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); - /// - /// Добавление зависимости - /// - /// - /// - public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); - /// - /// Получение класса со всеми зависмостями - /// - /// - /// - public T Resolve() => _dependencyManager.Resolve(); - } -} diff --git a/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs deleted file mode 100644 index 1021b53..0000000 --- a/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs deleted file mode 100644 index 24e7a7b..0000000 --- a/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.DI -{ - public interface IImplementationExtension - { - public int Priority { get; } - /// - /// Регистрация сервисов - /// - public void RegisterServices(); - } -} diff --git a/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs deleted file mode 100644 index 8a13157..0000000 --- a/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs +++ /dev/null @@ -1,56 +0,0 @@ -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 MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs deleted file mode 100644 index c045c9f..0000000 --- a/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.DI -{ - public class ServiceProviderLoader - { - /// - /// Загрузка всех классов-реализаций IImplementationExtension - /// - /// - public static IImplementationExtension? GetImplementationExtensions() - { - IImplementationExtension? source = null; - var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); - foreach (var file in files.Distinct()) - { - Assembly asm = Assembly.LoadFrom(file); - foreach (var t in asm.GetExportedTypes()) - { - if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) - { - if (source == null) - { - source = (IImplementationExtension)Activator.CreateInstance(t)!; - } - else - { - var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; - if (newSource.Priority > source.Priority) - { - source = newSource; - } - } - } - } - } - return source; - } - private static string TryGetImplementationExtensionsFolder() - { - var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); - while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) - { - directory = directory.Parent; - } - return $"{directory?.FullName}\\ImplementationExtensions"; - } - } -} diff --git a/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs deleted file mode 100644 index 1911d22..0000000 --- a/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantContracts.StoragesContracts -{ - public interface IBackUpInfo - { - List? GetList() where T : class, new(); - Type? GetTypeByModelInterface(string modelInterfaceName); - } -} diff --git a/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs deleted file mode 100644 index 424b9e9..0000000 --- a/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -using MotorPlantContracts.StoragesContracts; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantDatabaseImplement.Implements -{ - public class BackUpInfo : IBackUpInfo - { - public List? GetList() where T : class, new() - { - using var context = new MotorPlantDataBase(); - 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/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs deleted file mode 100644 index 2e711fe..0000000 --- a/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MotorPlantContracts.DI; -using MotorPlantContracts.StoragesContracts; -using MotorPlantDatabaseImplement.Implements; - -namespace MotorPlantDatabaseImplement -{ - public class ImplementationExtension : IImplementationExtension - { - public int Priority => 3; - public void RegisterServices() - { - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - } - } -} diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs deleted file mode 100644 index af1ec98..0000000 --- a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.Designer.cs +++ /dev/null @@ -1,296 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using MotorPlantDatabaseImplement; - -#nullable disable - -namespace MotorPlantDatabaseImplement.Migrations -{ - [DbContext(typeof(MotorPlantDataBase))] - [Migration("20240620185256_InitialCreate")] - partial class InitialCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.3") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Client", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClientFIO") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("Id"); - - b.ToTable("Clients"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ComponentName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Cost") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.ToTable("Components"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Engine", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("EngineName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Price") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.ToTable("Engines"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ComponentId") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("EngineId") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.HasIndex("ComponentId"); - - b.HasIndex("EngineId"); - - b.ToTable("EngineComponents"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Implementer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ImplementerFIO") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Password") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Qualification") - .HasColumnType("int"); - - b.Property("WorkExperience") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("Implementers"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.MessageInfo", b => - { - b.Property("MessageId") - .HasColumnType("nvarchar(450)"); - - b.Property("Body") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ClientId") - .HasColumnType("int"); - - b.Property("DateDelivery") - .HasColumnType("datetime2"); - - b.Property("SenderName") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Subject") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.HasKey("MessageId"); - - b.HasIndex("ClientId"); - - b.ToTable("Messages"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClientId") - .HasColumnType("int"); - - b.Property("Count") - .HasColumnType("int"); - - b.Property("DateCreate") - .HasColumnType("datetime2"); - - b.Property("DateImplement") - .HasColumnType("datetime2"); - - b.Property("EngineId") - .HasColumnType("int"); - - b.Property("ImplementerId") - .HasColumnType("int"); - - b.Property("Status") - .HasColumnType("int"); - - b.Property("Sum") - .HasColumnType("float"); - - b.HasKey("Id"); - - b.HasIndex("ClientId"); - - b.HasIndex("EngineId"); - - b.HasIndex("ImplementerId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b => - { - b.HasOne("MotorPlantDatabaseImplement.Models.Component", "Component") - .WithMany("EngineComponents") - .HasForeignKey("ComponentId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine") - .WithMany("Components") - .HasForeignKey("EngineId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Component"); - - b.Navigation("Engine"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.MessageInfo", b => - { - b.HasOne("MotorPlantDatabaseImplement.Models.Client", "Client") - .WithMany() - .HasForeignKey("ClientId"); - - b.Navigation("Client"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b => - { - b.HasOne("MotorPlantDatabaseImplement.Models.Client", "Client") - .WithMany("Orders") - .HasForeignKey("ClientId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine") - .WithMany("Orders") - .HasForeignKey("EngineId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("MotorPlantDatabaseImplement.Models.Implementer", "Implementer") - .WithMany("Orders") - .HasForeignKey("ImplementerId"); - - b.Navigation("Client"); - - b.Navigation("Engine"); - - b.Navigation("Implementer"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Client", b => - { - b.Navigation("Orders"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b => - { - b.Navigation("EngineComponents"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Engine", b => - { - b.Navigation("Components"); - - b.Navigation("Orders"); - }); - - modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Implementer", b => - { - b.Navigation("Orders"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs deleted file mode 100644 index 7dae505..0000000 --- a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240620185256_InitialCreate.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace MotorPlantDatabaseImplement.Migrations -{ - /// - public partial class InitialCreate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Clients", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ClientFIO = table.Column(type: "nvarchar(max)", nullable: false), - Email = table.Column(type: "nvarchar(max)", nullable: false), - Password = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Clients", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Components", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ComponentName = table.Column(type: "nvarchar(max)", nullable: false), - Cost = table.Column(type: "float", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Components", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Engines", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - EngineName = table.Column(type: "nvarchar(max)", nullable: false), - Price = table.Column(type: "float", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Engines", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Implementers", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - ImplementerFIO = table.Column(type: "nvarchar(max)", nullable: false), - Password = table.Column(type: "nvarchar(max)", nullable: false), - Qualification = table.Column(type: "int", nullable: false), - WorkExperience = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Implementers", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Messages", - columns: table => new - { - MessageId = table.Column(type: "nvarchar(450)", nullable: false), - ClientId = table.Column(type: "int", nullable: true), - SenderName = table.Column(type: "nvarchar(max)", nullable: false), - DateDelivery = table.Column(type: "datetime2", nullable: false), - Subject = table.Column(type: "nvarchar(max)", nullable: false), - Body = table.Column(type: "nvarchar(max)", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Messages", x => x.MessageId); - table.ForeignKey( - name: "FK_Messages_Clients_ClientId", - column: x => x.ClientId, - principalTable: "Clients", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "EngineComponents", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - EngineId = table.Column(type: "int", nullable: false), - ComponentId = table.Column(type: "int", nullable: false), - Count = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_EngineComponents", x => x.Id); - table.ForeignKey( - name: "FK_EngineComponents_Components_ComponentId", - column: x => x.ComponentId, - principalTable: "Components", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_EngineComponents_Engines_EngineId", - column: x => x.EngineId, - principalTable: "Engines", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Orders", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - Count = table.Column(type: "int", nullable: false), - Sum = table.Column(type: "float", nullable: false), - Status = table.Column(type: "int", nullable: false), - DateCreate = table.Column(type: "datetime2", nullable: false), - DateImplement = table.Column(type: "datetime2", nullable: true), - EngineId = table.Column(type: "int", nullable: false), - ClientId = table.Column(type: "int", nullable: false), - ImplementerId = table.Column(type: "int", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Orders", x => x.Id); - table.ForeignKey( - name: "FK_Orders_Clients_ClientId", - column: x => x.ClientId, - principalTable: "Clients", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Orders_Engines_EngineId", - column: x => x.EngineId, - principalTable: "Engines", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Orders_Implementers_ImplementerId", - column: x => x.ImplementerId, - principalTable: "Implementers", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_EngineComponents_ComponentId", - table: "EngineComponents", - column: "ComponentId"); - - migrationBuilder.CreateIndex( - name: "IX_EngineComponents_EngineId", - table: "EngineComponents", - column: "EngineId"); - - migrationBuilder.CreateIndex( - name: "IX_Messages_ClientId", - table: "Messages", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_ClientId", - table: "Orders", - column: "ClientId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_EngineId", - table: "Orders", - column: "EngineId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_ImplementerId", - table: "Orders", - column: "ImplementerId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "EngineComponents"); - - migrationBuilder.DropTable( - name: "Messages"); - - migrationBuilder.DropTable( - name: "Orders"); - - migrationBuilder.DropTable( - name: "Components"); - - migrationBuilder.DropTable( - name: "Clients"); - - migrationBuilder.DropTable( - name: "Engines"); - - migrationBuilder.DropTable( - name: "Implementers"); - } - } -} diff --git a/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs deleted file mode 100644 index 53ecfd7..0000000 --- a/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs +++ /dev/null @@ -1,41 +0,0 @@ -using MotorPlantContracts.StoragesContracts; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantFileImplement.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/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs deleted file mode 100644 index a028733..0000000 --- a/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MotorPlantContracts.DI; -using MotorPlantContracts.StoragesContracts; -using MotorPlantFileImplement.Implements; - -namespace MotorPlantFileImplement -{ - public class ImplementationExtension : IImplementationExtension - { - public int Priority => 1; - public void RegisterServices() - { - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - } - } -} diff --git a/MotorPlant/MotorPlantListImplement/BackUpInfo.cs b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs deleted file mode 100644 index 3a224b1..0000000 --- a/MotorPlant/MotorPlantListImplement/BackUpInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MotorPlantContracts.StoragesContracts; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MotorPlantListImplement.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/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs deleted file mode 100644 index 670794e..0000000 --- a/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs +++ /dev/null @@ -1,21 +0,0 @@ -using MotorPlantContracts.DI; -using MotorPlantContracts.StoragesContracts; -using MotorPlantListImplement.Implements; - -namespace MotorPlantListImplement -{ - internal class ImplementationExtension : IImplementationExtension - { - public int Priority => 0; - public void RegisterServices() - { - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - DependencyManager.Instance.RegisterType(); - } - } -} diff --git a/MotorPlant/MotorPlantView/DataGridViewExtension.cs b/MotorPlant/MotorPlantView/DataGridViewExtension.cs deleted file mode 100644 index 20a88f3..0000000 --- a/MotorPlant/MotorPlantView/DataGridViewExtension.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MotorPlantContracts.Attributes; - -namespace MotorPlantView.Forms -{ - internal 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; - } - } - } - } - } -} -- 2.25.1 From 46724ecdc340fc74e8f577a62beb2106355026c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=AF=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D1=87=D1=83=D0=BA?= Date: Fri, 21 Jun 2024 08:58:15 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B3=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 --- .../MotorPlantContracts.dll | Bin 0 -> 30720 bytes .../MotorPlantDataModels.dll | Bin 0 -> 6656 bytes .../MotorPlantDatabaseImplement.dll | Bin 0 -> 82944 bytes .../MotorPlantFileImplement.dll | Bin 0 -> 40448 bytes .../MotorPlantListImplement.dll | Bin 0 -> 26112 bytes .../MotorPlantBusinessLogic/BackUpLogic.cs | 98 +++++++++++++++ .../Attributes/ColumnAttribute.cs | 26 ++++ .../Attributes/GridViewAutoSize.cs | 20 +++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 ++ .../BindingModels/MessageInfoBindingModel.cs | 1 + .../BusinessLogicsContracts/IBackUpLogic.cs | 14 +++ .../DI/DependencyManager.cs | 58 +++++++++ .../DI/IDependencyContainer.cs | 37 ++++++ .../DI/IImplementationExtension.cs | 17 +++ .../DI/ServiceDependencyContainer.cs | 56 +++++++++ .../DI/ServiceProviderLoader.cs | 54 ++++++++ .../StoragesContracts/IBackUpInfo.cs | 14 +++ .../ViewModels/ClientViewModel.cs | 8 +- .../ViewModels/ComponentViewModel.cs | 6 +- .../ViewModels/EngineViewModel.cs | 7 +- .../ViewModels/ImplementerViewModel.cs | 10 +- .../ViewModels/MessageInfoViewModel.cs | 13 +- .../ViewModels/OrderViewModel.cs | 22 ++-- .../MotorPlantDataModels/IImplementerModel.cs | 2 +- .../MotorPlantDataModels/IMessageInfoModel.cs | 2 +- .../MotorPlantDatabaseImplement/BackUpInfo.cs | 31 +++++ .../MotorPlantDatabaseImplement/Client.cs | 24 ++-- .../MotorPlantDatabaseImplement/Component.cs | 5 + .../MotorPlantDatabaseImplement/Engine.cs | 9 +- .../ImplementationExtension.cs | 21 ++++ .../Implementer.cs | 7 ++ .../MessageInfo.cs | 15 +++ .../MotorPlantDatabaseImplement.csproj | 4 + .../MotorPlantDatabaseImplement/Order.cs | 11 ++ .../MotorPlantFileImplement/BackUpInfo.cs | 41 ++++++ MotorPlant/MotorPlantFileImplement/Client.cs | 6 + .../MotorPlantFileImplement/Component.cs | 5 + MotorPlant/MotorPlantFileImplement/Engine.cs | 5 + .../ImplementationExtension.cs | 21 ++++ .../MotorPlantFileImplement/Implementer.cs | 7 ++ .../MotorPlantFileImplement/MessageInfo.cs | 10 ++ .../MotorPlantFileImplement.csproj | 4 + MotorPlant/MotorPlantFileImplement/Order.cs | 11 ++ .../MotorPlantListImplement/BackUpInfo.cs | 21 ++++ .../ImplementationExtension.cs | 21 ++++ .../MotorPlantListImplement/MessageInfo.cs | 1 + .../MotorPlantListImplement.csproj | 4 + .../MotorPlantView/DataGridViewExtension.cs | 51 ++++++++ MotorPlant/MotorPlantView/FormClients.cs | 15 +-- MotorPlant/MotorPlantView/FormComponents.cs | 22 ++-- MotorPlant/MotorPlantView/FormEngine.cs | 81 ++++++------ MotorPlant/MotorPlantView/FormEngines.cs | 30 ++--- .../MotorPlantView/FormMain.Designer.cs | 19 ++- MotorPlant/MotorPlantView/FormMain.cs | 118 ++++++++---------- .../MotorPlantView/FormViewMail.Designer.cs | 6 +- MotorPlant/MotorPlantView/FormViewMail.cs | 9 +- MotorPlant/MotorPlantView/ImplementersForm.cs | 17 +-- MotorPlant/MotorPlantView/Program.cs | 105 +++++++--------- 58 files changed, 950 insertions(+), 285 deletions(-) create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantContracts.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDataModels.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll create mode 100644 MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll create mode 100644 MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs create mode 100644 MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs create mode 100644 MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/DependencyManager.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs create mode 100644 MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs create mode 100644 MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantFileImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantListImplement/BackUpInfo.cs create mode 100644 MotorPlant/MotorPlantListImplement/ImplementationExtension.cs create mode 100644 MotorPlant/MotorPlantView/DataGridViewExtension.cs diff --git a/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll b/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..8257f45d9b099e8334691faef8d77bf3e94d00f2 GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..3c3ed4481375225c19dcf2707c044a347981c746 GIT binary patch literal 82944 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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..c22c3c1c414ce8574f0b2d55c8b012165c8ed65f GIT binary patch literal 40448 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≠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 literal 0 HcmV?d00001 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..a60b21835d5ff0b8baf4289d4b3d0e5837827b83 GIT binary patch literal 26112 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 O7I=97gZ_V$f&T}v76=>w literal 0 HcmV?d00001 diff --git a/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs new file mode 100644 index 0000000..ec4e73f --- /dev/null +++ b/MotorPlant/MotorPlantBusinessLogic/BackUpLogic.cs @@ -0,0 +1,98 @@ +using Microsoft.Extensions.Logging; +using MotorPlantContracts.BindingModels; +using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDataModels; +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 MotorPlantBusinessLogic.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/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..e9b2332 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + public bool Visible { get; private set; } + public int Width { get; private set; } + public GridViewAutoSize GridViewAutoSize { get; private set; } + public bool IsUseAutoSize { get; private set; } + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} diff --git a/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..992e7eb --- /dev/null +++ b/MotorPlant/MotorPlantContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + None = 1, + ColumnHeader = 2, + AllCellsExceptHeader = 4, + AllCells = 6, + DisplayedCellsExceptHeader = 8, + DisplayedCells = 10, + Fill = 16 + } +} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..742f6c6 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs index a940c2a..c9a7897 100644 --- a/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs +++ b/MotorPlant/MotorPlantContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,6 @@ namespace MotorPlantContracts.BindingModels public string Subject { get; set; } = string.Empty; public string Body { get; set; } = string.Empty; public DateTime DateDelivery { get; set; } + public int Id => throw new NotImplementedException(); } } diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..1101056 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using MotorPlantContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..3ee20ed --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/DependencyManager.cs @@ -0,0 +1,58 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public class DependencyManager + { + private readonly IDependencyContainer _dependencyManager; + private static DependencyManager? _manager; + private static readonly object _locjObject = new(); + private DependencyManager() + { + _dependencyManager = new ServiceDependencyContainer(); + } + public static DependencyManager Instance { get { if (_manager == null) { lock (_locjObject) { _manager = new DependencyManager(); } } return _manager; } } + + /// + /// Иницализация библиотек, в которых идут установки зависомстей + /// + public static void InitDependency() + { + var ext = ServiceProviderLoader.GetImplementationExtensions(); + if (ext == null) + { + throw new ArgumentNullException("Отсутствуют компоненты для загрузки зависимостей по модулям"); + } + // регистрируем зависимости + ext.RegisterServices(); + } + /// + /// Регистрация логгера + /// + /// + public void AddLogging(Action configure) => _dependencyManager.AddLogging(configure); + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where U : class, T where T : class => _dependencyManager.RegisterType(isSingle); + /// + /// Добавление зависимости + /// + /// + /// + public void RegisterType(bool isSingle = false) where T : class => _dependencyManager.RegisterType(isSingle); + /// + /// Получение класса со всеми зависмостями + /// + /// + /// + public T Resolve() => _dependencyManager.Resolve(); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..1021b53 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IDependencyContainer.cs @@ -0,0 +1,37 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..24e7a7b --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..8a13157 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,56 @@ +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 MotorPlantContracts.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/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..c045c9f --- /dev/null +++ b/MotorPlant/MotorPlantContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.DI +{ + public class ServiceProviderLoader + { + /// + /// Загрузка всех классов-реализаций IImplementationExtension + /// + /// + public static IImplementationExtension? GetImplementationExtensions() + { + IImplementationExtension? source = null; + var files = Directory.GetFiles(TryGetImplementationExtensionsFolder(), "*.dll", SearchOption.AllDirectories); + foreach (var file in files.Distinct()) + { + Assembly asm = Assembly.LoadFrom(file); + foreach (var t in asm.GetExportedTypes()) + { + if (t.IsClass && typeof(IImplementationExtension).IsAssignableFrom(t)) + { + if (source == null) + { + source = (IImplementationExtension)Activator.CreateInstance(t)!; + } + else + { + var newSource = (IImplementationExtension)Activator.CreateInstance(t)!; + if (newSource.Priority > source.Priority) + { + source = newSource; + } + } + } + } + } + return source; + } + private static string TryGetImplementationExtensionsFolder() + { + var directory = new DirectoryInfo(Directory.GetCurrentDirectory()); + while (directory != null && !directory.GetDirectories("ImplementationExtensions", SearchOption.AllDirectories).Any(x => x.Name == "ImplementationExtensions")) + { + directory = directory.Parent; + } + return $"{directory?.FullName}\\ImplementationExtensions"; + } + } +} diff --git a/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..1911d22 --- /dev/null +++ b/MotorPlant/MotorPlantContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs index 23522b8..256d063 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ClientViewModel.cs @@ -1,16 +1,18 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs index acac773..06d4e46 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ComponentViewModel.cs @@ -1,14 +1,16 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.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/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs index 35c6a94..10c1e01 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/EngineViewModel.cs @@ -1,15 +1,18 @@ using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class EngineViewModel : IEngineModel { + [Column(visible: false)] public int Id { get; set; } - [DisplayName("Название изделия")] + [Column(title: "Название изделия", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string EngineName { get; set; } = string.Empty; - [DisplayName("Цена")] + [Column(title: "Цена", width: 70)] public double Price { get; set; } + [Column(visible: false)] public Dictionary EngineComponents { get; diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs index ea49efc..4774970 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/ImplementerViewModel.cs @@ -5,19 +5,21 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.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: 60)] public int WorkExperience { get; set; } = 0; - [DisplayName("Квалификация")] + [Column(title: "Квалификация", width: 60)] public int Qualification { get; set; } = 0; - [DisplayName("Пароль")] + [Column(title: "Пароль", width: 100)] public string Password { get; set; } = string.Empty; } } diff --git a/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs index 8d81661..a66a392 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/MessageInfoViewModel.cs @@ -5,20 +5,25 @@ using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class MessageInfoViewModel : IMessageInfoModel { + [Column(visible: false)] + public int Id { get; set; } + [Column(visible: false)] public string MessageId { get; set; } = string.Empty; + [Column(visible: false)] public int? ClientId { get; set; } - [DisplayName("Отправитель")] + [Column(title: "Отправитель", width: 150)] public string SenderName { get; set; } = string.Empty; - [DisplayName("Дата письма")] + [Column(title: "Дата письма", width: 120)] public DateTime DateDelivery { get; set; } - [DisplayName("Заголовок")] + [Column(title: "Заголовок", width: 120)] public string Subject { get; set; } = string.Empty; - [DisplayName("Текст")] + [Column(title: "Текст", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string Body { get; set; } = string.Empty; } } diff --git a/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs index 0ff8575..e0988e8 100644 --- a/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs +++ b/MotorPlant/MotorPlantContracts/ViewModels/OrderViewModel.cs @@ -1,31 +1,35 @@ using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; using System.ComponentModel; +using MotorPlantContracts.Attributes; namespace MotorPlantContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] + [Column(title: "Номер", width: 90)] public int Id { get; set; } + [Column(visible: false)] public int EngineId { get; set; } + [Column(visible: false)] public int ClientId { get; set; } + [Column(visible: false)] public int? ImplementerId { get; set; } = null; - [DisplayName("Клиент")] + [Column(title: "Клиент", width: 190)] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Двигатель")] + [Column(title: "Двигатель", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] public string EngineName { get; set; } = string.Empty; - [DisplayName("Исполнитель")] + [Column(title: "Исполнитель", width: 150)] public string ImplementerFIO { get; set; } = string.Empty; - [DisplayName("Количество")] + [Column(title: "Количество", width: 100)] public int Count { get; set; } - [DisplayName("Сумма")] + [Column(title: "Сумма", width: 120)] public double Sum { get; set; } - [DisplayName("Статус")] + [Column(title: "Статус", width: 70)] public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - [DisplayName("Дата создания")] + [Column(title: "Дата создания", width: 120)] public DateTime DateCreate { get; set; } = DateTime.Now; - [DisplayName("Дата выполнения")] + [Column(title: "Дата выполнения", width: 120)] public DateTime? DateImplement { get; set; } } diff --git a/MotorPlant/MotorPlantDataModels/IImplementerModel.cs b/MotorPlant/MotorPlantDataModels/IImplementerModel.cs index 6e6064c..6963379 100644 --- a/MotorPlant/MotorPlantDataModels/IImplementerModel.cs +++ b/MotorPlant/MotorPlantDataModels/IImplementerModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MotorPlantDataModels { - public interface IImplementerModel + public interface IImplementerModel : IId { string ImplementerFIO { get; } string Password { get; } diff --git a/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs b/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs index 464672c..84a5a77 100644 --- a/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs +++ b/MotorPlant/MotorPlantDataModels/IMessageInfoModel.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace MotorPlantDataModels.Models { - public interface IMessageInfoModel + public interface IMessageInfoModel : IId { string MessageId { get; } int? ClientId { get; } diff --git a/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs new file mode 100644 index 0000000..424b9e9 --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/BackUpInfo.cs @@ -0,0 +1,31 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new MotorPlantDataBase(); + 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/MotorPlant/MotorPlantDatabaseImplement/Client.cs b/MotorPlant/MotorPlantDatabaseImplement/Client.cs index 715dec8..5af4118 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Client.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Client.cs @@ -6,20 +6,26 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace MotorPlantDatabaseImplement.Models { - public class Client : IClientModel - { - public int Id { get; private set; } - [Required] - public string ClientFIO { get; set; } = string.Empty; - [Required] - public string Email { get; set; } = string.Empty; - [Required] - public string Password { get; set; } = string.Empty; + [DataContract] + public class Client : IClientModel + { + [DataMember] + public int Id { get; private set; } + [DataMember] + [Required] + public string ClientFIO { get; set; } = string.Empty; + [DataMember] + [Required] + public string Email { get; set; } = string.Empty; + [DataMember] + [Required] + public string Password { get; set; } = string.Empty; [ForeignKey("ClientId")] public virtual List Orders { get; set; } = new(); public static Client? Create(ClientBindingModel model) diff --git a/MotorPlant/MotorPlantDatabaseImplement/Component.cs b/MotorPlant/MotorPlantDatabaseImplement/Component.cs index 2382ad7..461284a 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Component.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Component.cs @@ -3,14 +3,19 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public string ComponentName { get; private set; } = string.Empty; + [DataMember] [Required] public double Cost { get; set; } [ForeignKey("ComponentId")] diff --git a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs index 8a51aae..9a7b9f7 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs @@ -3,18 +3,23 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Engine : IEngineModel { + [DataMember] public int Id { get; set; } + [DataMember] [Required] public string EngineName { get; set; } = string.Empty; + [DataMember] [Required] public double Price { get; set; } - private Dictionary? _EngineComponents = - null; + private Dictionary? _EngineComponents = null; + [DataMember] [NotMapped] public Dictionary EngineComponents { diff --git a/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs new file mode 100644 index 0000000..2e711fe --- /dev/null +++ b/MotorPlant/MotorPlantDatabaseImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantDatabaseImplement.Implements; + +namespace MotorPlantDatabaseImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 3; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs b/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs index cac72c1..fac030c 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Implementer.cs @@ -8,18 +8,25 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] [Required] public string Password { get; set; } = string.Empty; + [DataMember] [Required] public int Qualification { get; set; } = 0; + [DataMember] [Required] public int WorkExperience { get; set; } = 0; [ForeignKey("ImplementerId")] diff --git a/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs b/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs index 0a9bc4b..ae2e364 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/MessageInfo.cs @@ -4,7 +4,9 @@ using MotorPlantDataModels.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; @@ -12,12 +14,25 @@ namespace MotorPlantDatabaseImplement.Models { public class MessageInfo : IMessageInfoModel { + [NotMapped] + public int Id { get; private set; } + [DataMember] [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] + [Required] public string SenderName { get; private set; } = string.Empty; + [DataMember] + [Required] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [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; } public static MessageInfo? Create(MotorPlantDataBase context, MessageInfoBindingModel model) diff --git a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj index 9416c52..c8f460d 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj +++ b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/MotorPlant/MotorPlantDatabaseImplement/Order.cs b/MotorPlant/MotorPlantDatabaseImplement/Order.cs index d6416ea..93c61eb 100644 --- a/MotorPlant/MotorPlantDatabaseImplement/Order.cs +++ b/MotorPlant/MotorPlantDatabaseImplement/Order.cs @@ -3,27 +3,38 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; using System.ComponentModel.DataAnnotations; +using System.Runtime.Serialization; namespace MotorPlantDatabaseImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int Id { get; private set; } + [DataMember] [Required] public int Count { get; private set; } + [DataMember] [Required] public double Sum { get; private set; } + [DataMember] [Required] public OrderStatus Status { get; private set; } + [DataMember] [Required] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] [Required] public int EngineId { get; private set; } public virtual Engine Engine { get; private set; } + [DataMember] [Required] public int ClientId { get; private set; } public virtual Client Client { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; public virtual Implementer? Implementer { get; private set; } public static Order? Create(MotorPlantDataBase context, OrderBindingModel model) diff --git a/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs new file mode 100644 index 0000000..53ecfd7 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/BackUpInfo.cs @@ -0,0 +1,41 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantFileImplement.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/MotorPlant/MotorPlantFileImplement/Client.cs b/MotorPlant/MotorPlantFileImplement/Client.cs index 660f75d..bd61cb6 100644 --- a/MotorPlant/MotorPlantFileImplement/Client.cs +++ b/MotorPlant/MotorPlantFileImplement/Client.cs @@ -9,14 +9,20 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; +using System.Runtime.Serialization; namespace MotorPlantFileImplement.Models { + [DataContract] public class Client : IClientModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ClientFIO { get; private set; } = string.Empty; + [DataMember] public string Email { get; set; } = string.Empty; + [DataMember] public string Password { get; set; } = string.Empty; public static Client? Create(ClientBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/Component.cs b/MotorPlant/MotorPlantFileImplement/Component.cs index 5f29da5..0a39581 100644 --- a/MotorPlant/MotorPlantFileImplement/Component.cs +++ b/MotorPlant/MotorPlantFileImplement/Component.cs @@ -1,14 +1,19 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.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/MotorPlant/MotorPlantFileImplement/Engine.cs b/MotorPlant/MotorPlantFileImplement/Engine.cs index 5f283a5..9088e6b 100644 --- a/MotorPlant/MotorPlantFileImplement/Engine.cs +++ b/MotorPlant/MotorPlantFileImplement/Engine.cs @@ -1,14 +1,19 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Engine : IEngineModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string EngineName { get; private set; } = string.Empty; + [DataMember] public double Price { get; private set; } public Dictionary Components { get; private set; } = new(); private Dictionary? _EngineComponents = null; diff --git a/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs new file mode 100644 index 0000000..a028733 --- /dev/null +++ b/MotorPlant/MotorPlantFileImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantFileImplement.Implements; + +namespace MotorPlantFileImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 1; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantFileImplement/Implementer.cs b/MotorPlant/MotorPlantFileImplement/Implementer.cs index 86567e0..990694c 100644 --- a/MotorPlant/MotorPlantFileImplement/Implementer.cs +++ b/MotorPlant/MotorPlantFileImplement/Implementer.cs @@ -4,18 +4,25 @@ using MotorPlantDataModels; 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 MotorPlantFileImplement.Models { + [DataContract] public class Implementer : IImplementerModel { + [DataMember] public int Id { get; private set; } + [DataMember] public string ImplementerFIO { get; private set; } = string.Empty; + [DataMember] public string Password { get; set; } = string.Empty; + [DataMember] public int Qualification { get; set; } = 0; + [DataMember] public int WorkExperience { get; set; } = 0; public static Implementer? Create(ImplementerBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/MessageInfo.cs b/MotorPlant/MotorPlantFileImplement/MessageInfo.cs index fcb68a9..6bfd6bf 100644 --- a/MotorPlant/MotorPlantFileImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantFileImplement/MessageInfo.cs @@ -4,19 +4,29 @@ using MotorPlantDataModels.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 MotorPlantFileImplement.Models { + [DataContract] public class MessageInfo : IMessageInfoModel { + [DataMember] + public int Id { get; private set; } + [DataMember] public string MessageId { get; private set; } = string.Empty; + [DataMember] public int? ClientId { get; private set; } + [DataMember] public string SenderName { get; private set; } = string.Empty; + [DataMember] public DateTime DateDelivery { get; private set; } = DateTime.Now; + [DataMember] public string Subject { get; private set; } = string.Empty; + [DataMember] public string Body { get; private set; } = string.Empty; public static MessageInfo? Create(MessageInfoBindingModel model) { diff --git a/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj b/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj index 4da00b3..e955e36 100644 --- a/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj +++ b/MotorPlant/MotorPlantFileImplement/MotorPlantFileImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/MotorPlant/MotorPlantFileImplement/Order.cs b/MotorPlant/MotorPlantFileImplement/Order.cs index 961251f..23b1a3f 100644 --- a/MotorPlant/MotorPlantFileImplement/Order.cs +++ b/MotorPlant/MotorPlantFileImplement/Order.cs @@ -2,20 +2,31 @@ using MotorPlantContracts.ViewModels; using MotorPlantDataModels.Enums; using MotorPlantDataModels.Models; +using System.Runtime.Serialization; using System.Xml.Linq; namespace MotorPlantFileImplement.Models { + [DataContract] public class Order : IOrderModel { + [DataMember] public int EngineId { get; private set; } + [DataMember] public int ClientId { get; private set; } + [DataMember] public int? ImplementerId { get; private set; } = null; + [DataMember] public int Count { get; private set; } + [DataMember] public double Sum { get; private set; } + [DataMember] public OrderStatus Status { get; private set; } + [DataMember] public DateTime DateCreate { get; private set; } + [DataMember] public DateTime? DateImplement { get; private set; } + [DataMember] public int Id { get; private set; } public static Order? Create(OrderBindingModel? model) { diff --git a/MotorPlant/MotorPlantListImplement/BackUpInfo.cs b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs new file mode 100644 index 0000000..3a224b1 --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/BackUpInfo.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MotorPlantListImplement.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/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs new file mode 100644 index 0000000..670794e --- /dev/null +++ b/MotorPlant/MotorPlantListImplement/ImplementationExtension.cs @@ -0,0 +1,21 @@ +using MotorPlantContracts.DI; +using MotorPlantContracts.StoragesContracts; +using MotorPlantListImplement.Implements; + +namespace MotorPlantListImplement +{ + internal class ImplementationExtension : IImplementationExtension + { + public int Priority => 0; + public void RegisterServices() + { + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/MotorPlant/MotorPlantListImplement/MessageInfo.cs b/MotorPlant/MotorPlantListImplement/MessageInfo.cs index 6e96b58..08d4e75 100644 --- a/MotorPlant/MotorPlantListImplement/MessageInfo.cs +++ b/MotorPlant/MotorPlantListImplement/MessageInfo.cs @@ -17,6 +17,7 @@ namespace MotorPlantListImplement.Models public DateTime DateDelivery { get; private set; } = DateTime.Now; public string Subject { get; private set; } = string.Empty; public string Body { get; private set; } = string.Empty; + public int Id => throw new NotImplementedException(); public static MessageInfo? Create(MessageInfoBindingModel model) { if (model == null) diff --git a/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj b/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj index 4da00b3..e955e36 100644 --- a/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj +++ b/MotorPlant/MotorPlantListImplement/MotorPlantListImplement.csproj @@ -11,4 +11,8 @@ + + + + diff --git a/MotorPlant/MotorPlantView/DataGridViewExtension.cs b/MotorPlant/MotorPlantView/DataGridViewExtension.cs new file mode 100644 index 0000000..20a88f3 --- /dev/null +++ b/MotorPlant/MotorPlantView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MotorPlantContracts.Attributes; + +namespace MotorPlantView.Forms +{ + internal 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/MotorPlant/MotorPlantView/FormClients.cs b/MotorPlant/MotorPlantView/FormClients.cs index 881caaa..83f44ce 100644 --- a/MotorPlant/MotorPlantView/FormClients.cs +++ b/MotorPlant/MotorPlantView/FormClients.cs @@ -27,19 +27,8 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - DataGridView.DataSource = list; - DataGridView.Columns["Id"].Visible = false; - DataGridView.Columns["ClientFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Email"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - DataGridView.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); + DataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/MotorPlant/MotorPlantView/FormComponents.cs b/MotorPlant/MotorPlantView/FormComponents.cs index 6c22176..2f7469b 100644 --- a/MotorPlant/MotorPlantView/FormComponents.cs +++ b/MotorPlant/MotorPlantView/FormComponents.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -42,13 +43,10 @@ namespace MotorPlantView.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -56,14 +54,12 @@ namespace MotorPlantView.Forms { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } } diff --git a/MotorPlant/MotorPlantView/FormEngine.cs b/MotorPlant/MotorPlantView/FormEngine.cs index f58811c..291b40e 100644 --- a/MotorPlant/MotorPlantView/FormEngine.cs +++ b/MotorPlant/MotorPlantView/FormEngine.cs @@ -3,6 +3,8 @@ using MotorPlantDataModels.Models; using MotorPlantContracts.BusinessLogicsContracts; using MotorPlantContracts.SearchModels; using MotorPlantContracts.BindingModels; +using MotorPlantContracts.DI; +using MotorPlantDatabaseImplement.Models; namespace MotorPlantView.Forms { @@ -11,14 +13,14 @@ namespace MotorPlantView.Forms private readonly ILogger _logger; private readonly IEngineLogic _logic; private int? _id; - private Dictionary _productComponents; + private Dictionary _engineComponents; public int Id { set { _id = value; } } public FormEngine(ILogger logger, IEngineLogic logic) { InitializeComponent(); _logger = logger; _logic = logic; - _productComponents = new Dictionary(); + _engineComponents = new Dictionary(); } private void FormEngine_Load(object sender, EventArgs e) { @@ -35,7 +37,7 @@ namespace MotorPlantView.Forms { textBoxName.Text = view.EngineName; textBoxPrice.Text = view.Price.ToString(); - _productComponents = view.EngineComponents ?? new Dictionary(); + _engineComponents = view.EngineComponents ?? new Dictionary(); LoadData(); } } @@ -50,10 +52,10 @@ namespace MotorPlantView.Forms _logger.LogInformation("Загрузка компонент изделия"); try { - if (_productComponents != null) + if (_engineComponents != null) { dataGridView.Rows.Clear(); - foreach (var pc in _productComponents) + foreach (var pc in _engineComponents) { dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); } @@ -67,51 +69,44 @@ namespace MotorPlantView.Forms } private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngineComponent)); - if (service is FormEngineComponent form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { + return; + } + _logger.LogInformation("Добавление нового ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + if (_engineComponents.ContainsKey(form.Id)) + { + _engineComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _engineComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } + private void buttonUpd_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _engineComponents[id].Item2; if (form.ShowDialog() == DialogResult.OK) { if (form.ComponentModel == null) { return; } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count} ", form.ComponentModel.ComponentName, form.Count); - if (_productComponents.ContainsKey(form.Id)) - { - _productComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _productComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } + _logger.LogInformation("Изменение ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + _engineComponents[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(FormEngineComponent)); - if (service is FormEngineComponent form) - { - int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _productComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - _productComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } - } - } - } private void buttonDel_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) @@ -121,7 +116,7 @@ namespace MotorPlantView.Forms try { _logger.LogInformation("Удаление компонента: { ComponentName} - { Count}", dataGridView.SelectedRows[0].Cells[1].Value); - _productComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); + _engineComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); } catch (Exception ex) { @@ -147,7 +142,7 @@ namespace MotorPlantView.Forms MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - if (_productComponents == null || _productComponents.Count == 0) + if (_engineComponents == null || _engineComponents.Count == 0) { MessageBox.Show("Заполните компоненты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; @@ -160,7 +155,7 @@ namespace MotorPlantView.Forms Id = _id ?? 0, EngineName = textBoxName.Text, Price = Convert.ToDouble(textBoxPrice.Text), - EngineComponents = _productComponents + EngineComponents = _engineComponents }; var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) @@ -186,7 +181,7 @@ namespace MotorPlantView.Forms private double CalcPrice() { double price = 0; - foreach (var elem in _productComponents) + foreach (var elem in _engineComponents) { price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); } diff --git a/MotorPlant/MotorPlantView/FormEngines.cs b/MotorPlant/MotorPlantView/FormEngines.cs index 7e129dc..838152e 100644 --- a/MotorPlant/MotorPlantView/FormEngines.cs +++ b/MotorPlant/MotorPlantView/FormEngines.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -24,14 +25,7 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["EngineComponents"].Visible = false; - dataGridView.Columns["EngineName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка компонентов"); } catch (Exception ex) @@ -42,13 +36,10 @@ namespace MotorPlantView.Forms private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngine)); - if (service is FormEngine form) + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } + LoadData(); } } @@ -56,14 +47,11 @@ namespace MotorPlantView.Forms { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngine)); - if (service is FormEngine 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/MotorPlant/MotorPlantView/FormMain.Designer.cs b/MotorPlant/MotorPlantView/FormMain.Designer.cs index 2309e01..f525ec4 100644 --- a/MotorPlant/MotorPlantView/FormMain.Designer.cs +++ b/MotorPlant/MotorPlantView/FormMain.Designer.cs @@ -45,6 +45,7 @@ buttonOrderReady = new Button(); buttonIssuedOrder = new Button(); buttonRef = new Button(); + создатьБекапToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); @@ -53,7 +54,7 @@ // toolStrip1 // toolStrip1.ImageScalingSize = new Size(20, 20); - toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, ReportsToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem }); + toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, ReportsToolStripMenuItem, запускРаботToolStripMenuItem, почтаToolStripMenuItem, создатьБекапToolStripMenuItem }); toolStrip1.Location = new Point(0, 0); toolStrip1.Name = "toolStrip1"; toolStrip1.Size = new Size(969, 25); @@ -72,14 +73,14 @@ // КомпонентыToolStripMenuItem // КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; - КомпонентыToolStripMenuItem.Size = new Size(180, 22); + КомпонентыToolStripMenuItem.Size = new Size(174, 22); КомпонентыToolStripMenuItem.Text = "Компоненты"; КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; // // ДвигателиToolStripMenuItem // ДвигателиToolStripMenuItem.Name = "ДвигателиToolStripMenuItem"; - ДвигателиToolStripMenuItem.Size = new Size(180, 22); + ДвигателиToolStripMenuItem.Size = new Size(174, 22); ДвигателиToolStripMenuItem.Text = "Двигатели"; ДвигателиToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click; // @@ -183,14 +184,14 @@ // клиентыToolStripMenuItem // клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; - клиентыToolStripMenuItem.Size = new Size(180, 22); + клиентыToolStripMenuItem.Size = new Size(174, 22); клиентыToolStripMenuItem.Text = "Клиенты"; клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; // // исполнителиToolStripMenuItem // исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; - исполнителиToolStripMenuItem.Size = new Size(180, 22); + исполнителиToolStripMenuItem.Size = new Size(174, 22); исполнителиToolStripMenuItem.Text = "Исполнители"; исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; // @@ -201,6 +202,13 @@ почтаToolStripMenuItem.Text = "Почта"; почтаToolStripMenuItem.Click += почтаToolStripMenuItem_Click; // + // создатьБекапToolStripMenuItem + // + создатьБекапToolStripMenuItem.Name = "создатьБекапToolStripMenuItem"; + создатьБекапToolStripMenuItem.Size = new Size(97, 25); + создатьБекапToolStripMenuItem.Text = "Создать Бекап"; + создатьБекапToolStripMenuItem.Click += createBackUpToolStripMenuItem_Click; + // // FormMain // AutoScaleDimensions = new SizeF(7F, 15F); @@ -243,5 +251,6 @@ private ToolStripMenuItem запускРаботToolStripMenuItem; private ToolStripMenuItem исполнителиToolStripMenuItem; private ToolStripMenuItem почтаToolStripMenuItem; + private ToolStripMenuItem создатьБекапToolStripMenuItem; } } \ No newline at end of file diff --git a/MotorPlant/MotorPlantView/FormMain.cs b/MotorPlant/MotorPlantView/FormMain.cs index 3eb4663..3834ad0 100644 --- a/MotorPlant/MotorPlantView/FormMain.cs +++ b/MotorPlant/MotorPlantView/FormMain.cs @@ -2,6 +2,8 @@ using MotorPlantContracts.BindingModels; using MotorPlantContracts.BusinessLogicsContracts; using MotorPlantBusinessLogic; +using MotorPlantContracts.DI; +using System.Windows.Forms; namespace MotorPlantView.Forms { @@ -11,13 +13,16 @@ namespace MotorPlantView.Forms private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + private readonly IBackUpLogic _backUpLogic; + + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workProcess = workProcess; + _backUpLogic = backUpLogic; } private void FormMain_Load(object sender, EventArgs e) { @@ -25,52 +30,32 @@ namespace MotorPlantView.Forms } private void LoadData() { - _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["EngineId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - dataGridView.Columns["EngineName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) { _logger.LogError(ex, "Ошибка загрузки заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); - if (service is FormComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormEngines)); - - if (service is FormEngines form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void buttonCreateOrder_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); - if (service is FormCreateOrder form) - { - form.ShowDialog(); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + LoadData(); } private void buttonTakeOrderInWork_Click(object sender, EventArgs e) { @@ -154,61 +139,62 @@ namespace MotorPlantView.Forms using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; if (dialog.ShowDialog() == DialogResult.OK) { - _reportLogic.SaveEnginesToWordFile(new ReportBindingModel - { - FileName = dialog.FileName - }); - MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, - MessageBoxIcon.Information); + _reportLogic.SaveEnginesToWordFile(new ReportBindingModel { FileName = dialog.FileName }); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void компонентыПоДвигателямToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportEngineComponents)); - if (service is FormReportEngineComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void списокЗаказовToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders)); - if (service is FormReportOrders form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormClients)); - if (service is FormClients form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void запускРаботToolStripMenuItem_Click(object sender, EventArgs e) { - _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic -)) as IImplementerLogic)!, _orderLogic); - MessageBox.Show("Процесс обработки запущен", "Сообщение", - MessageBoxButtons.OK, MessageBoxIcon.Information); + _workProcess.DoWork(DependencyManager.Instance.Resolve(), _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(ImplementersForm)); - if (service is ImplementersForm form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); } private void почтаToolStripMenuItem_Click(object sender, EventArgs e) { - var service = -Program.ServiceProvider?.GetService(typeof(FormViewMail)); - if (service is FormViewMail form) + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + private void createBackUpToolStripMenuItem_Click(object sender, EventArgs e) + { + try { - form.ShowDialog(); + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка создания бэкапа", MessageBoxButtons.OK, + MessageBoxIcon.Error); } } diff --git a/MotorPlant/MotorPlantView/FormViewMail.Designer.cs b/MotorPlant/MotorPlantView/FormViewMail.Designer.cs index 675c7cd..9bbb217 100644 --- a/MotorPlant/MotorPlantView/FormViewMail.Designer.cs +++ b/MotorPlant/MotorPlantView/FormViewMail.Designer.cs @@ -42,14 +42,14 @@ dataGridView.Size = new Size(776, 426); dataGridView.TabIndex = 0; // - // FormViewMail + // ViewMailForm // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); Controls.Add(dataGridView); - Name = "FormViewMail"; - Text = "Письма"; + Name = "ViewMailForm"; + Text = "ViewMailForm"; Load += ViewMailForm_Load; ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); ResumeLayout(false); diff --git a/MotorPlant/MotorPlantView/FormViewMail.cs b/MotorPlant/MotorPlantView/FormViewMail.cs index 2140a57..3361f4e 100644 --- a/MotorPlant/MotorPlantView/FormViewMail.cs +++ b/MotorPlant/MotorPlantView/FormViewMail.cs @@ -26,14 +26,7 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); _logger.LogInformation("Загрузка списка писем"); } catch (Exception ex) diff --git a/MotorPlant/MotorPlantView/ImplementersForm.cs b/MotorPlant/MotorPlantView/ImplementersForm.cs index 649c03a..6708e58 100644 --- a/MotorPlant/MotorPlantView/ImplementersForm.cs +++ b/MotorPlant/MotorPlantView/ImplementersForm.cs @@ -31,21 +31,8 @@ namespace MotorPlantView.Forms { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView1.DataSource = list; - dataGridView1.Columns["Id"].Visible = false; - dataGridView1.Columns["ImplementerFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Password"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["Qualification"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - dataGridView1.Columns["WorkExperience"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка компонентов"); + dataGridView1.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка исполнителей"); } catch (Exception ex) { diff --git a/MotorPlant/MotorPlantView/Program.cs b/MotorPlant/MotorPlantView/Program.cs index 048fb02..e93665d 100644 --- a/MotorPlant/MotorPlantView/Program.cs +++ b/MotorPlant/MotorPlantView/Program.cs @@ -11,6 +11,7 @@ using MotorPlantBusinessLogic; using MotorPlantBusinessLogic.BusinessLogic; using MotorPlantBusinessLogic.MailWorker; using MotorPlantContracts.BindingModels; +using MotorPlantContracts.DI; namespace MotorPlantView.Forms { @@ -27,84 +28,66 @@ namespace MotorPlantView.Forms // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); + InitDependency(); try { - var mailSender = - _serviceProvider.GetService(); + var mailSender = DependencyManager.Instance.Resolve(); mailSender?.MailConfig(new MailConfigBindingModel { - MailLogin = - System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? - string.Empty, - MailPassword = - System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? - string.Empty, - SmtpClientHost = - System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? - string.Empty, - SmtpClientPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), - PopHost = - System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, - PopPort = - Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) + MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, + MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, + SmtpClientHost = System.Configuration.ConfigurationManager.AppSettings["SmtpClientHost"] ?? string.Empty, + SmtpClientPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SmtpClientPort"]), + PopHost = System.Configuration.ConfigurationManager.AppSettings["PopHost"] ?? string.Empty, + PopPort = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["PopPort"]) }); - // ñîçäàåì òàéìåð - var timer = new System.Threading.Timer(new - TimerCallback(MailCheck!), null, 0, 100000); + var timer = new System.Threading.Timer(new TimerCallback(MailCheck!), null, 0, 100000); } catch (Exception ex) { - var logger = _serviceProvider.GetService(); - logger?.LogError(ex, "Îøèáêà ðàáîòû ñ ïî÷òîé"); + var logger = DependencyManager.Instance.Resolve(); + logger?.LogError(ex, "Mails Problem"); } - Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(DependencyManager.Instance.Resolve()); } - private static void ConfigureServices(ServiceCollection services) + private static void InitDependency() { - services.AddLogging(option => + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); } - 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 7711a13e2a93bf742cf6aba53542046df1401106 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=BE=D1=84=D1=8C=D1=8F=20=D0=AF=D0=BA=D0=BE=D0=B1?= =?UTF-8?q?=D1=87=D1=83=D0=BA?= Date: Sat, 22 Jun 2024 09:38:32 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MotorPlantContracts.dll | Bin 30720 -> 0 bytes .../MotorPlantDataModels.dll | Bin 6656 -> 0 bytes .../MotorPlantDatabaseImplement.dll | Bin 82944 -> 0 bytes .../MotorPlantFileImplement.dll | Bin 40448 -> 0 bytes .../MotorPlantListImplement.dll | Bin 26112 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantContracts.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDataModels.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll delete mode 100644 MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll diff --git a/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll b/MotorPlant/ImplementationExtensions/MotorPlantContracts.dll deleted file mode 100644 index 8257f45d9b099e8334691faef8d77bf3e94d00f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30720 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 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantDatabaseImplement.dll deleted file mode 100644 index 3c3ed4481375225c19dcf2707c044a347981c746..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82944 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 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantFileImplement.dll deleted file mode 100644 index c22c3c1c414ce8574f0b2d55c8b012165c8ed65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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≠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 diff --git a/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll b/MotorPlant/ImplementationExtensions/MotorPlantListImplement.dll deleted file mode 100644 index a60b21835d5ff0b8baf4289d4b3d0e5837827b83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26112 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 O7I=97gZ_V$f&T}v76=>w -- 2.25.1