From d062463466ac2ab8a8173e2dc079540d8302f70c Mon Sep 17 00:00:00 2001 From: ValAnn Date: Wed, 22 May 2024 13:07:02 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=BD,=20=D0=B4=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SushiBarContracts.dll | Bin 0 -> 30720 bytes .../SushiBarDataModels.dll | Bin 0 -> 6144 bytes .../SushiBarDatabaseImplement.dll | Bin 0 -> 76288 bytes .../SushiBarListImplement.dll | Bin 0 -> 24064 bytes .../SushiBarBusinessLogic_/BackUpLogic.cs | 102 +++++ .../Attributes/ColumnAttribute.cs | 25 ++ .../Attributes/GridViewAutoSize.cs | 27 ++ .../BindingModels/BackUpSaveBinidngModel.cs | 13 + .../BindingModels/MessageInfoBindingModel.cs | 2 + .../BusinessLogicsContracts/IBackUpLogic.cs | 14 + .../SushiBarContracts/DI/DependencyManager.cs | 66 +++ .../DI/IDependencyContainer.cs | 40 ++ .../DI/IImplementationExtension.cs | 17 + .../DI/ServiceDependencyContainer.cs | 62 +++ .../DI/ServiceProviderLoader.cs | 56 +++ .../StoragesContracts/IBackUpInfo.cs | 15 + .../ViewModels/ClientViewModel.cs | 18 +- .../ViewModels/ComponentViewModel.cs | 18 +- .../ViewModels/ImplementerViewModel.cs | 23 +- .../ViewModels/MessageInfoViewModel.cs | 16 +- .../ViewModels/OrderViewModel.cs | 68 +-- .../ViewModels/SushiViewModel.cs | 17 +- .../Models/IMessageInfoModel.cs | 4 +- .../ImplementationExtension.cs | 28 ++ .../Implements/BackUpInfo.cs | 32 ++ ... => 20240522080218_InitCreate.Designer.cs} | 2 +- ...Create.cs => 20240522080218_InitCreate.cs} | 0 .../Models/Client.cs | 18 +- .../Models/Component.cs | 11 +- .../Models/Implementer.cs | 23 +- .../Models/MessageInfo.cs | 92 ++-- .../SushiBarDatabaseImplement/Models/Order.cs | 32 +- .../SushiBarDatabaseImplement/Models/Sushi.cs | 18 +- .../SushiBarDatabaseImplement.csproj | 3 + .../ImplementationExtension.cs | 29 ++ .../Implements/BackUpInfo.cs | 44 ++ .../Models/MessageInfo.cs | 4 +- .../SushiBarFileImplement.csproj | 1 + .../Models/MessageInfo.cs | 4 +- .../SushiBarView/DataGridViewExtension.cs | 51 +++ SushiBar/SushiBarView/FormClients.cs | 10 +- SushiBar/SushiBarView/FormComponents.cs | 32 +- SushiBar/SushiBarView/FormImplementers.cs | 18 +- SushiBar/SushiBarView/FormMail.cs | 12 +- SushiBar/SushiBarView/FormMain.Designer.cs | 409 +++++++++--------- SushiBar/SushiBarView/FormMain.cs | 129 +++--- SushiBar/SushiBarView/FormSushi.cs | 75 ++-- SushiBar/SushiBarView/FormSushis.cs | 45 +- SushiBar/SushiBarView/Program.cs | 95 ++-- 49 files changed, 1236 insertions(+), 584 deletions(-) create mode 100644 SushiBar/ImplementationExtensions/SushiBarContracts.dll create mode 100644 SushiBar/ImplementationExtensions/SushiBarDataModels.dll create mode 100644 SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll create mode 100644 SushiBar/ImplementationExtensions/SushiBarListImplement.dll create mode 100644 SushiBar/SushiBarBusinessLogic_/BackUpLogic.cs create mode 100644 SushiBar/SushiBarContracts/Attributes/ColumnAttribute.cs create mode 100644 SushiBar/SushiBarContracts/Attributes/GridViewAutoSize.cs create mode 100644 SushiBar/SushiBarContracts/BindingModels/BackUpSaveBinidngModel.cs create mode 100644 SushiBar/SushiBarContracts/BusinessLogicsContracts/IBackUpLogic.cs create mode 100644 SushiBar/SushiBarContracts/DI/DependencyManager.cs create mode 100644 SushiBar/SushiBarContracts/DI/IDependencyContainer.cs create mode 100644 SushiBar/SushiBarContracts/DI/IImplementationExtension.cs create mode 100644 SushiBar/SushiBarContracts/DI/ServiceDependencyContainer.cs create mode 100644 SushiBar/SushiBarContracts/DI/ServiceProviderLoader.cs create mode 100644 SushiBar/SushiBarContracts/StoragesContracts/IBackUpInfo.cs create mode 100644 SushiBar/SushiBarDatabaseImplement/ImplementationExtension.cs create mode 100644 SushiBar/SushiBarDatabaseImplement/Implements/BackUpInfo.cs rename SushiBar/SushiBarDatabaseImplement/Migrations/{20240508104959_InitCreate.Designer.cs => 20240522080218_InitCreate.Designer.cs} (99%) rename SushiBar/SushiBarDatabaseImplement/Migrations/{20240508104959_InitCreate.cs => 20240522080218_InitCreate.cs} (100%) create mode 100644 SushiBar/SushiBarFileImplement/ImplementationExtension.cs create mode 100644 SushiBar/SushiBarFileImplement/Implements/BackUpInfo.cs create mode 100644 SushiBar/SushiBarView/DataGridViewExtension.cs diff --git a/SushiBar/ImplementationExtensions/SushiBarContracts.dll b/SushiBar/ImplementationExtensions/SushiBarContracts.dll new file mode 100644 index 0000000000000000000000000000000000000000..0c118c7985b437ef8a2af888d5f846ece7ed0ccf GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/SushiBar/ImplementationExtensions/SushiBarDataModels.dll b/SushiBar/ImplementationExtensions/SushiBarDataModels.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b85e0a2d2e142a44026c3e8d442433c346241d1 GIT binary patch literal 6144 zcmeHLeQX=$8Gp`qPThorrfq1TEj?N~LJP*JT~gS9Bz95^q)qEId#6j6rCHrN17V{>3koyH$!-)NdZ+nBUzqWeAXo$YhO z7~{W5dz1U!^YuRO^E~f|{d(+%yGSM?1<%QoL`U)FHYo6e;Q-WKtG?4kM;5+v&Qa-_ zSI(K(Ww>g^u}h9tRtuVC*`Au$Ri|pHhNWh<=G3xX)Z?9)A1F1V8c*CV($18yZr2b9S9{8KG8Q2kJ>=k%INd5>MS2?HKd+!ldxW2({LoQB( zn*?{T!LiP7FLv&usSr1e?b6g;Du=nJTXgTWaL1HlsNY2`y4HR_X&KL!!=vBa((h5) z74rFZi|(gNC8Yb35{~o57VdK`<2~BKJ*k98&&%N)ZdR(H5&ER?cn>L`4C(G|iSx~t zIDbH4pSzVqjec#k6#Hc<&c&s)5KlXv4ng08{nAZ5pJxKw>3rZK>KAy4z#)NIf!hRL zFHi%v(JZis3_-`RLeCXroDb}!IB*3efhui+<}B>7wKzhrhNgpF1}>pF;BtBgxQ6}? zT#ua+N1v_0kJAmnG?jo?3waKhrW;|GMhj^kv}X zGUKy?jz~;@U-=3!DI~u9RblVS-0Pr_KTcl*{TD&MraTP#K85@KNZ?(<{&9g%E8J^F zW}jbBz6HEMV*76@hk*|WKfe`zUM9A&lxGlk6uUfv45A{31;7|`h=@EQ$fOf=2TqI# zPOxrZCuSr1pSl1vx!f;RWv}#0UUscw%PdXsE77)8O;gL8 z`p$lu)Xb_rQLTX4KpCUp8MdW4vtT|kW*4ibemRwNZ#r9sMOn8z-5Jep6{56hfM;$m z`pMvqj&J{~FU>S1aj(FjsYV8Fho^K!L;`Ct$`k z*WG73zL#-$)`i<^ZD-HO{tAZDtw1E4ZqdrVK~A@dy3=6OcDZ6(2wzAtnx{_~unZE| zUbQ@CIdRsd9UVv`<-A@j>ct@sAKm#XB<#j8bw^|glaQ)mw1X3EaFo&W)l!Lz-;~v- zqbV73UA>$)XD19VY&fAgh-nmGR&^9%&wTq)L^G*7E+%olGHcD)PFWK(Z2nuTv~A58 zrK%(Bnoj&wg>buWYWoG{Hud$0#~rMig4a~klY?LW3fWZDd$4ECnr$kA@(a0Vhg@C zl`Px!jDlMi1vSCm@>g6=clKiOyTN)w(j0_K^=fm0TpBY9j_ukr9{LsaAxkr7T?0OO zzqQ8hr|>?S_YuW8t43s@-A;`;^cSid)B&S$++xE8GEeiWE{TcA`7~E4SIzIn$vM%^j>gS9^kLch7yccBFQ=c8qFYtvyvc zT6?8}_`+3>d^=gEC$`;!i*sw0QpV z!v##Ds5lyNgTYAsxIp0#Uj!tI3ugVsLO!MSZyHE#7)TDJl6rrtKb6{)OwDLBdSPH- zAdyexQ#1NTTp=X7br0WcCL*0frfKgRtD2sH&o2lTX02WLl)zEVX4fqJ&t{k%=Ho=j7A zemA<}gJ;UpJrw6!Vn3a%jWGiz$esw>O9bxo*yP{_ftxnRg%g)$f-sc`Uet zbKoyBtui&g)$i)QW*RFdW13@{VNuyFVEO3c$YkxwweWFjN#;A8Cy_*_UZMl7Du14^ ze&)&9j(Y0(VX!t7kWg5uX22No7?vL@ah>}+s;JFFasQwcG7 zureSoy^p6O!X`oWzZB&`^LOnf=$nSWGF8MFv&cvTrwjKvs$$e#@H-5tgZnIxuhAHK z6k%gR%WaGBQ_mm+jf?vM$5UyE_rv;2;OLPWc}&8e1CPzT`*BxEG#(y*8SJ@op0KqL zqZ!KN!;Bk8MkfBa^OIDr)J4vLVd&hnts!xGPB1>gUvIHfy;a_lN>kMhbEF&=F!E^f&n(F_? Sb-cdeK7xz?clqC~z`p>nBufkc literal 0 HcmV?d00001 diff --git a/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll b/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll new file mode 100644 index 0000000000000000000000000000000000000000..4b0412e76963d09486777997f18208768c2af2ab GIT binary patch literal 76288 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 z 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 W+xd@Ned=#U&*I_w-`D?l8TfZ7FT?8q literal 0 HcmV?d00001 diff --git a/SushiBar/SushiBarBusinessLogic_/BackUpLogic.cs b/SushiBar/SushiBarBusinessLogic_/BackUpLogic.cs new file mode 100644 index 0000000..af0b77b --- /dev/null +++ b/SushiBar/SushiBarBusinessLogic_/BackUpLogic.cs @@ -0,0 +1,102 @@ +using Microsoft.Extensions.Logging; +using SushiBarContracts.BindingModels; +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.StoragesContracts; +using SushiBarDataModels; +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 SushiBarBusinessLogic +{ + 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/SushiBar/SushiBarContracts/Attributes/ColumnAttribute.cs b/SushiBar/SushiBarContracts/Attributes/ColumnAttribute.cs new file mode 100644 index 0000000..88be856 --- /dev/null +++ b/SushiBar/SushiBarContracts/Attributes/ColumnAttribute.cs @@ -0,0 +1,25 @@ +namespace SushiBarContracts.Attributes +{ + [AttributeUsage(AttributeTargets.Property)] + public class ColumnAttribute : Attribute + { + public string Title { get; private set; } + + public bool Visible { get; private set; } + + public int Width { get; private set; } + + public GridViewAutoSize GridViewAutoSize { get; private set; } + + public bool IsUseAutoSize { get; private set; } + + public ColumnAttribute(string title = "", bool visible = true, int width = 0, GridViewAutoSize gridViewAutoSize = GridViewAutoSize.None, bool isUseAutoSize = false) + { + Title = title; + Visible = visible; + Width = width; + GridViewAutoSize = gridViewAutoSize; + IsUseAutoSize = isUseAutoSize; + } + } +} \ No newline at end of file diff --git a/SushiBar/SushiBarContracts/Attributes/GridViewAutoSize.cs b/SushiBar/SushiBarContracts/Attributes/GridViewAutoSize.cs new file mode 100644 index 0000000..aa39f59 --- /dev/null +++ b/SushiBar/SushiBarContracts/Attributes/GridViewAutoSize.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.Attributes +{ + public enum GridViewAutoSize + { + NotSet = 0, + + None = 1, + + ColumnHeader = 2, + + AllCellsExceptHeader = 4, + + AllCells = 6, + + DisplayedCellsExceptHeader = 8, + + DisplayedCells = 10, + + Fill = 16 + } +} diff --git a/SushiBar/SushiBarContracts/BindingModels/BackUpSaveBinidngModel.cs b/SushiBar/SushiBarContracts/BindingModels/BackUpSaveBinidngModel.cs new file mode 100644 index 0000000..a64d394 --- /dev/null +++ b/SushiBar/SushiBarContracts/BindingModels/BackUpSaveBinidngModel.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.BindingModels +{ + public class BackUpSaveBinidngModel + { + public string FolderName { get; set; } = string.Empty; + } +} diff --git a/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs b/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs index 3c58deb..8c55ff7 100644 --- a/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs +++ b/SushiBar/SushiBarContracts/BindingModels/MessageInfoBindingModel.cs @@ -15,5 +15,7 @@ namespace SushiBarContracts.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/SushiBar/SushiBarContracts/BusinessLogicsContracts/IBackUpLogic.cs b/SushiBar/SushiBarContracts/BusinessLogicsContracts/IBackUpLogic.cs new file mode 100644 index 0000000..c63d308 --- /dev/null +++ b/SushiBar/SushiBarContracts/BusinessLogicsContracts/IBackUpLogic.cs @@ -0,0 +1,14 @@ +using SushiBarContracts.BindingModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.BusinessLogicsContracts +{ + public interface IBackUpLogic + { + void CreateBackUp(BackUpSaveBinidngModel model); + } +} diff --git a/SushiBar/SushiBarContracts/DI/DependencyManager.cs b/SushiBar/SushiBarContracts/DI/DependencyManager.cs new file mode 100644 index 0000000..658ceed --- /dev/null +++ b/SushiBar/SushiBarContracts/DI/DependencyManager.cs @@ -0,0 +1,66 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.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/SushiBar/SushiBarContracts/DI/IDependencyContainer.cs b/SushiBar/SushiBarContracts/DI/IDependencyContainer.cs new file mode 100644 index 0000000..26cdff2 --- /dev/null +++ b/SushiBar/SushiBarContracts/DI/IDependencyContainer.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.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/SushiBar/SushiBarContracts/DI/IImplementationExtension.cs b/SushiBar/SushiBarContracts/DI/IImplementationExtension.cs new file mode 100644 index 0000000..a7dd6d7 --- /dev/null +++ b/SushiBar/SushiBarContracts/DI/IImplementationExtension.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.DI +{ + public interface IImplementationExtension + { + public int Priority { get; } + /// + /// Регистрация сервисов + /// + public void RegisterServices(); + } +} diff --git a/SushiBar/SushiBarContracts/DI/ServiceDependencyContainer.cs b/SushiBar/SushiBarContracts/DI/ServiceDependencyContainer.cs new file mode 100644 index 0000000..f6ef39b --- /dev/null +++ b/SushiBar/SushiBarContracts/DI/ServiceDependencyContainer.cs @@ -0,0 +1,62 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.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/SushiBar/SushiBarContracts/DI/ServiceProviderLoader.cs b/SushiBar/SushiBarContracts/DI/ServiceProviderLoader.cs new file mode 100644 index 0000000..a4041dd --- /dev/null +++ b/SushiBar/SushiBarContracts/DI/ServiceProviderLoader.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.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/SushiBar/SushiBarContracts/StoragesContracts/IBackUpInfo.cs b/SushiBar/SushiBarContracts/StoragesContracts/IBackUpInfo.cs new file mode 100644 index 0000000..dc5cb2c --- /dev/null +++ b/SushiBar/SushiBarContracts/StoragesContracts/IBackUpInfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarContracts.StoragesContracts +{ + public interface IBackUpInfo + { + List? GetList() where T : class, new(); + + Type? GetTypeByModelInterface(string modelInterfaceName); + } +} diff --git a/SushiBar/SushiBarContracts/ViewModels/ClientViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/ClientViewModel.cs index 28f55a9..b2df5f3 100644 --- a/SushiBar/SushiBarContracts/ViewModels/ClientViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/ClientViewModel.cs @@ -1,16 +1,20 @@ using SushiBarDataModels.Models; using System.ComponentModel; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Models; + namespace SushiBar.ViewModels { public class ClientViewModel : IClientModel { - public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Логин (эл. почта)")] - public string Email { get; set; } = string.Empty; - [DisplayName("Пароль")] - public string Password { get; set; } = string.Empty; + [Column(visible: false)] + public int Id { get; set; } + [Column(title: "ФИО клиента", width: 150)] + public string ClientFIO { get; set; } = string.Empty; + [Column(title: "Логин (эл. почта)", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string Email { get; set; } = string.Empty; + [Column(title: "Пароль", width: 150)] + public string Password { get; set; } = string.Empty; } } diff --git a/SushiBar/SushiBarContracts/ViewModels/ComponentViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/ComponentViewModel.cs index 5b924c1..a0d6222 100644 --- a/SushiBar/SushiBarContracts/ViewModels/ComponentViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/ComponentViewModel.cs @@ -1,4 +1,5 @@ -using SushiBarDataModels.Models; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,13 @@ namespace SushiBarContracts.ViewModels { public class ComponentViewModel : IComponentModel { - public int Id { get; set; } - - [DisplayName("Название компонента")] - public string ComponentName { get; set; } = string.Empty; - - [DisplayName("Цена")] - public double Cost { get; set; } + [Column(visible: false)] + public int Id { get; set; } + + [Column(title: "Название компонента", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ComponentName { get; set; } = string.Empty; + + [Column(title: "Цена", width: 150)] + public double Cost { get; set; } } } diff --git a/SushiBar/SushiBarContracts/ViewModels/ImplementerViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/ImplementerViewModel.cs index 192c8dc..d9c9854 100644 --- a/SushiBar/SushiBarContracts/ViewModels/ImplementerViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/ImplementerViewModel.cs @@ -1,4 +1,5 @@ -using SushiBarDataModels.Models; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,18 +11,20 @@ namespace SushiBarContracts.ViewModels { public class ImplementerViewModel : IImplementerModel { - public int Id { get; set; } + [Column(visible: false)] + public int Id { get; set; } - [DisplayName("ФИО исполнителя")] - public string ImplementerFIO { get; set; } = string.Empty; - - [DisplayName("Пароль")] + [Column(title: "ФИО исполнителя", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string ImplementerFIO { get; set; } = string.Empty; + + [Column(title: "Пароль", width: 100)] + public string Password { get; set; } = string.Empty; - [DisplayName("Стаж работы")] - public int WorkExperience { get; set; } + [Column(title: "Стаж работы", width: 60)] + public int WorkExperience { get; set; } - [DisplayName("Квалификация")] - public int Qualification { get; set; } + [Column(title: "Квалификация", width: 60)] + public int Qualification { get; set; } } } diff --git a/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs index a9e3807..e101774 100644 --- a/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/MessageInfoViewModel.cs @@ -1,4 +1,5 @@ -using SushiBarDataModels.Models; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,20 +11,25 @@ namespace SushiBarContracts.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/SushiBar/SushiBarContracts/ViewModels/OrderViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/OrderViewModel.cs index 0f0c729..d09aae6 100644 --- a/SushiBar/SushiBarContracts/ViewModels/OrderViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/OrderViewModel.cs @@ -1,4 +1,5 @@ -using SushiBarDataModels.Enums; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Enums; using SushiBarDataModels.Models; using System; using System.Collections.Generic; @@ -11,34 +12,43 @@ namespace SushiBarContracts.ViewModels { public class OrderViewModel : IOrderModel { - [DisplayName("Номер")] - public int Id { get; set; } - public int? ImplementerId { get; set; } - [DisplayName("Исполнитель")] - public string? ImplementerFIO { get; set; } = null; - public int SushiId { get; set; } - public int ClientId { get; set; } - public string ClientEmail { get; set; } = string.Empty; + [Column(title: "Номер", width: 90)] + public int Id { get; set; } - [DisplayName("ФИО клиента")] - public string ClientFIO { get; set; } = string.Empty; + [Column(visible: false)] + public int ClientId { get; set; } - [DisplayName("Изделие")] - public string SushiName { get; set; } = string.Empty; - - [DisplayName("Количество")] - public int Count { get; set; } - - [DisplayName("Сумма")] - public double Sum { get; set; } - - [DisplayName("Статус")] - public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; - - [DisplayName("Дата создания")] - public DateTime DateCreate { get; set; } = DateTime.Now; - - [DisplayName("Дата выполнения")] - public DateTime? DateImplement { get; set; } - } + [Column(title: "Имя клиента", width: 190)] + public string ClientFIO { get; set; } = string.Empty; + + [Column(visible: false)] + public string ClientEmail { get; set; } = string.Empty; + + [Column(visible: false)] + public int? ImplementerId { get; set; } + + [Column(title: "Исполнитель", width: 150)] + public string? ImplementerFIO { get; set; } = null; + + [Column(visible: false)] + public int SushiId { get; set; } + + [Column(title: "Суши", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string SushiName { get; set; } = string.Empty; + + [Column(title: "Количество", width: 100)] + public int Count { get; set; } + + [Column(title: "Сумма", width: 120)] + public double Sum { get; set; } + + [Column(title: "Статус", width: 70)] + public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; + + [Column(title: "Дата создания", width: 120)] + public DateTime DateCreate { get; set; } = DateTime.Now; + + [Column(title: "Дата выполнения", width: 120)] + public DateTime? DateImplement { get; set; } + } } diff --git a/SushiBar/SushiBarContracts/ViewModels/SushiViewModel.cs b/SushiBar/SushiBarContracts/ViewModels/SushiViewModel.cs index 8f9608c..bd8bd02 100644 --- a/SushiBar/SushiBarContracts/ViewModels/SushiViewModel.cs +++ b/SushiBar/SushiBarContracts/ViewModels/SushiViewModel.cs @@ -1,4 +1,5 @@ -using SushiBarDataModels.Models; +using SushiBarContracts.Attributes; +using SushiBarDataModels.Models; using System; using System.Collections.Generic; using System.ComponentModel; @@ -10,12 +11,14 @@ namespace SushiBarContracts.ViewModels { public class SushiViewModel : ISushiModel { - public int Id { get; set; } - [DisplayName("Название изделия")] - public string SushiName { get; set; } = string.Empty; - [DisplayName("Цена")] - public double Price { get; set; } - public Dictionary SushiComponents + [Column(visible: false)] + public int Id { get; set; } + [Column(title: "Название сущи", gridViewAutoSize: GridViewAutoSize.Fill, isUseAutoSize: true)] + public string SushiName { get; set; } = string.Empty; + [Column(title: "Цена", width: 70)] + public double Price { get; set; } + [Column(visible: false)] + public Dictionary SushiComponents { get; set; diff --git a/SushiBar/SushiBarDataModels/Models/IMessageInfoModel.cs b/SushiBar/SushiBarDataModels/Models/IMessageInfoModel.cs index e4c9086..41ffffb 100644 --- a/SushiBar/SushiBarDataModels/Models/IMessageInfoModel.cs +++ b/SushiBar/SushiBarDataModels/Models/IMessageInfoModel.cs @@ -6,8 +6,8 @@ using System.Threading.Tasks; namespace SushiBarDataModels.Models { - public interface IMessageInfoModel - { + public interface IMessageInfoModel : IId + { string MessageId { get; } int? ClientId { get; } string SenderName { get; } diff --git a/SushiBar/SushiBarDatabaseImplement/ImplementationExtension.cs b/SushiBar/SushiBarDatabaseImplement/ImplementationExtension.cs new file mode 100644 index 0000000..8294c99 --- /dev/null +++ b/SushiBar/SushiBarDatabaseImplement/ImplementationExtension.cs @@ -0,0 +1,28 @@ +using SushiBar.StoragesContracts; +using SushiBarContracts.DI; +using SushiBarContracts.StoragesContracts; +using SushiBarDatabaseImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarDatabaseImplement +{ + 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/SushiBar/SushiBarDatabaseImplement/Implements/BackUpInfo.cs b/SushiBar/SushiBarDatabaseImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..2ff4673 --- /dev/null +++ b/SushiBar/SushiBarDatabaseImplement/Implements/BackUpInfo.cs @@ -0,0 +1,32 @@ +using SushiBarContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarDatabaseImplement.Implements +{ + public class BackUpInfo : IBackUpInfo + { + public List? GetList() where T : class, new() + { + using var context = new SushiBarDatabase(); + 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/SushiBar/SushiBarDatabaseImplement/Migrations/20240508104959_InitCreate.Designer.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs similarity index 99% rename from SushiBar/SushiBarDatabaseImplement/Migrations/20240508104959_InitCreate.Designer.cs rename to SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs index 623c252..e8eb255 100644 --- a/SushiBar/SushiBarDatabaseImplement/Migrations/20240508104959_InitCreate.Designer.cs +++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs @@ -12,7 +12,7 @@ using SushiBarDatabaseImplement; namespace SushiBarDatabaseImplement.Migrations { [DbContext(typeof(SushiBarDatabase))] - [Migration("20240508104959_InitCreate")] + [Migration("20240522080218_InitCreate")] partial class InitCreate { /// diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20240508104959_InitCreate.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.cs similarity index 100% rename from SushiBar/SushiBarDatabaseImplement/Migrations/20240508104959_InitCreate.cs rename to SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.cs diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Client.cs b/SushiBar/SushiBarDatabaseImplement/Models/Client.cs index a45fd4a..3024bdd 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/Client.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/Client.cs @@ -9,29 +9,37 @@ 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 SushiBarDatabaseImplement.Models { + [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 ClientOrders { get; set; } = new(); + public virtual List ClientOrders { get; set; } = new(); - [ForeignKey("ClientId")] - public virtual List ClientMessages { get; set; } = new(); + [ForeignKey("ClientId")] + public virtual List ClientMessages { get; set; } = new(); - public static Client? Create(ClientBindingModel model) + public static Client? Create(ClientBindingModel model) { if (model == null) { @@ -76,4 +84,4 @@ namespace SushiBarDatabaseImplement.Models Password = Password }; } -} +} \ No newline at end of file diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Component.cs b/SushiBar/SushiBarDatabaseImplement/Models/Component.cs index 125d8d4..fe5b7ef 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/Component.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/Component.cs @@ -8,15 +8,20 @@ using System.Threading.Tasks; using SushiBarContracts.BindingModels; using SushiBarContracts.ViewModels; using SushiBarDataModels.Models; +using System.Runtime.Serialization; namespace SushiBarDatabaseImplement.Models { - public class Component : IComponentModel + [DataContract] + public class Component : IComponentModel { + [DataMember] public int Id { get; private set; } - [Required] + [DataMember] + [Required] public string ComponentName { get; private set; } = string.Empty; - [Required] + [DataMember] + [Required] public double Cost { get; set; } [ForeignKey("ComponentId")] public virtual List SushiComponents { get; set; } = new(); diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Implementer.cs b/SushiBar/SushiBarDatabaseImplement/Models/Implementer.cs index edb1f81..4ebf930 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/Implementer.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/Implementer.cs @@ -8,23 +8,26 @@ using System.Threading.Tasks; using SushiBarContracts.BindingModels; using SushiBarDatabaseImplement.Models; using SushiBarContracts.ViewModels; +using System.Runtime.Serialization; namespace SushiBarDataModels.Models { - public class Implementer : IImplementerModel + [DataContract] + public class Implementer : IImplementerModel { - public int Id { get; set; } - - [Required] + [DataMember] + public int Id { get; set; } + [DataMember] + [Required] public string ImplementerFIO { get; set; } = string.Empty; - - [Required] + [DataMember] + [Required] public string Password { get; set; } = string.Empty; - - [Required] + [DataMember] + [Required] public int WorkExperience { get; set; } - - [Required] + [DataMember] + [Required] public int Qualification { get; set; } [ForeignKey("ImplementerId")] diff --git a/SushiBar/SushiBarDatabaseImplement/Models/MessageInfo.cs b/SushiBar/SushiBarDatabaseImplement/Models/MessageInfo.cs index 08c53c8..1064f01 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/MessageInfo.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/MessageInfo.cs @@ -8,57 +8,67 @@ using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.Serialization; namespace SushiBarDatabaseImplement.Models { - public class MessageInfo : IMessageInfoModel - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public string MessageId { get; set; } = string.Empty; + public class MessageInfo : IMessageInfoModel + { + [NotMapped] + public int Id { get; private set; } - public int? ClientId { get; set; } + [DataMember] + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public string MessageId { get; set; } = string.Empty; - public virtual Client? Client { get; set; } + [DataMember] + public int? ClientId { get; set; } - [Required] - public string SenderName { get; set; } = string.Empty; + public virtual Client? Client { get; set; } - [Required] - public DateTime DateDelivery { get; set; } + [DataMember] + [Required] + public string SenderName { get; set; } = string.Empty; - [Required] - public string Subject { get; set; } = string.Empty; + [DataMember] + [Required] + public DateTime DateDelivery { get; set; } - [Required] - public string Body { get; set; } = string.Empty; + [DataMember] + [Required] + public string Subject { get; set; } = string.Empty; - public static MessageInfo? Create(MessageInfoBindingModel? model) - { - if (model == null) - { - return null; - } - return new() - { - MessageId = model.MessageId, - ClientId = model.ClientId, - SenderName = model.SenderName, - DateDelivery = model.DateDelivery, - Subject = model.Subject, - Body = model.Body, + [DataMember] + [Required] + public string Body { get; set; } = string.Empty; - }; - } + public static MessageInfo? Create(MessageInfoBindingModel? model) + { + if (model == null) + { + return null; + } + return new() + { + MessageId = model.MessageId, + ClientId = model.ClientId, + SenderName = model.SenderName, + DateDelivery = model.DateDelivery, + Subject = model.Subject, + Body = model.Body, - public MessageInfoViewModel GetViewModel => new() - { - MessageId = MessageId, - ClientId = ClientId, - SenderName = SenderName, - DateDelivery = DateDelivery, - Subject = Subject, - Body = Body - }; - } + }; + } + + public MessageInfoViewModel GetViewModel => new() + { + MessageId = MessageId, + ClientId = ClientId, + SenderName = SenderName, + DateDelivery = DateDelivery, + Subject = Subject, + Body = Body + }; + } } diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Order.cs b/SushiBar/SushiBarDatabaseImplement/Models/Order.cs index cc31418..88df399 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/Order.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/Order.cs @@ -6,37 +6,47 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; namespace SushiBarDatabaseImplement.Models { - public class Order : IOrderModel + [DataContract] + public class Order : IOrderModel { - public int Id { get; private set; } - - [Required] + [DataMember] + public int Id { get; private set; } + [DataMember] + [Required] public int ClientId { get; private set; } public virtual Client Client { get; private set; } = new(); - [Required] + [DataMember] + [Required] public int SushiId { get; private set; } public virtual Sushi Sushi { get; set; } = new(); - [Required] + [DataMember] + [Required] public int Count { get; private set; } - [Required] + [DataMember] + [Required] public double Sum { get; private set; } - [Required] + [DataMember] + [Required] public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен; - [Required] + [DataMember] + [Required] public DateTime DateCreate { get; private set; } = DateTime.Now; - public DateTime? DateImplement { get; private set; } - public int? ImplementerId { get; private set; } + [DataMember] + public DateTime? DateImplement { get; private set; } + [DataMember] + public int? ImplementerId { get; private set; } public virtual Implementer? Implementer { get; set; } = new(); diff --git a/SushiBar/SushiBarDatabaseImplement/Models/Sushi.cs b/SushiBar/SushiBarDatabaseImplement/Models/Sushi.cs index 71b776c..d44ab95 100644 --- a/SushiBar/SushiBarDatabaseImplement/Models/Sushi.cs +++ b/SushiBar/SushiBarDatabaseImplement/Models/Sushi.cs @@ -8,19 +8,27 @@ using System.Text; using System.Threading.Tasks; using SushiBarContracts.BindingModels; using SushiBarContracts.ViewModels; +using System.Runtime.Serialization; namespace SushiBarDatabaseImplement.Models { - public class Sushi : ISushiModel + [DataContract] + public class Sushi : ISushiModel { - public int Id { get; set; } - [Required] + [DataMember] + public int Id { get; set; } + [DataMember] + [Required] public string SushiName { get; set; } = string.Empty; - [Required] + [DataMember] + [Required] public double Price { get; set; } + + private Dictionary? _sushiComponents = null; - [NotMapped] + [DataMember] + [NotMapped] public Dictionary SushiComponents { get diff --git a/SushiBar/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj b/SushiBar/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj index 5fcfde6..a3ebdf7 100644 --- a/SushiBar/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj +++ b/SushiBar/SushiBarDatabaseImplement/SushiBarDatabaseImplement.csproj @@ -20,5 +20,8 @@ + + + diff --git a/SushiBar/SushiBarFileImplement/ImplementationExtension.cs b/SushiBar/SushiBarFileImplement/ImplementationExtension.cs new file mode 100644 index 0000000..bbfef95 --- /dev/null +++ b/SushiBar/SushiBarFileImplement/ImplementationExtension.cs @@ -0,0 +1,29 @@ +using SushiBar.StoragesContracts; +using SushiBarContracts.DI; +using SushiBarContracts.StoragesContracts; + +using SushiBarFileImplement.Implements; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarFileImplement +{ + public class ImplementationExtension : IImplementationExtension + { + public int Priority => 1; + + public void RegisterServices() + { + //TODO DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + } +} diff --git a/SushiBar/SushiBarFileImplement/Implements/BackUpInfo.cs b/SushiBar/SushiBarFileImplement/Implements/BackUpInfo.cs new file mode 100644 index 0000000..a361c9e --- /dev/null +++ b/SushiBar/SushiBarFileImplement/Implements/BackUpInfo.cs @@ -0,0 +1,44 @@ +using SushiBarContracts.StoragesContracts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarFileImplement.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/SushiBar/SushiBarFileImplement/Models/MessageInfo.cs b/SushiBar/SushiBarFileImplement/Models/MessageInfo.cs index 811b998..a87d9bc 100644 --- a/SushiBar/SushiBarFileImplement/Models/MessageInfo.cs +++ b/SushiBar/SushiBarFileImplement/Models/MessageInfo.cs @@ -76,5 +76,7 @@ namespace SushiBarFileImplement.Models new XAttribute("SenderName", SenderName), new XAttribute("DateDelivery", DateDelivery) ); - } + + public int Id => throw new NotImplementedException(); + } } diff --git a/SushiBar/SushiBarFileImplement/SushiBarFileImplement.csproj b/SushiBar/SushiBarFileImplement/SushiBarFileImplement.csproj index 3e8ca0c..dd8251c 100644 --- a/SushiBar/SushiBarFileImplement/SushiBarFileImplement.csproj +++ b/SushiBar/SushiBarFileImplement/SushiBarFileImplement.csproj @@ -17,6 +17,7 @@ + diff --git a/SushiBar/SushiBarListImplement_/Models/MessageInfo.cs b/SushiBar/SushiBarListImplement_/Models/MessageInfo.cs index 2c62f6f..35f09eb 100644 --- a/SushiBar/SushiBarListImplement_/Models/MessageInfo.cs +++ b/SushiBar/SushiBarListImplement_/Models/MessageInfo.cs @@ -49,5 +49,7 @@ namespace SushiBarListImplement.Models SenderName = SenderName, DateDelivery = DateDelivery, }; - } + + public int Id => throw new NotImplementedException(); + } } diff --git a/SushiBar/SushiBarView/DataGridViewExtension.cs b/SushiBar/SushiBarView/DataGridViewExtension.cs new file mode 100644 index 0000000..2bc80ba --- /dev/null +++ b/SushiBar/SushiBarView/DataGridViewExtension.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SushiBarContracts.Attributes; + +namespace SushiBarView +{ + 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/SushiBar/SushiBarView/FormClients.cs b/SushiBar/SushiBarView/FormClients.cs index a602b48..93072cf 100644 --- a/SushiBar/SushiBarView/FormClients.cs +++ b/SushiBar/SushiBarView/FormClients.cs @@ -37,14 +37,8 @@ namespace SushiBarView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ClientFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка клиентов"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка клиентов"); } catch (Exception ex) { diff --git a/SushiBar/SushiBarView/FormComponents.cs b/SushiBar/SushiBarView/FormComponents.cs index 704c8e0..fcbb48f 100644 --- a/SushiBar/SushiBarView/FormComponents.cs +++ b/SushiBar/SushiBarView/FormComponents.cs @@ -10,6 +10,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using SushiBarContracts.DI; namespace SushiBarView { @@ -57,31 +58,24 @@ namespace SushiBarView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } } private void ButtonUpd_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = - Program.ServiceProvider?.GetService(typeof(FormComponent)); - if (service is FormComponent form) - { - form.Id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } + var form = DependencyManager.Instance.Resolve(); + + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } } } private void ButtonDel_Click(object sender, EventArgs e) diff --git a/SushiBar/SushiBarView/FormImplementers.cs b/SushiBar/SushiBarView/FormImplementers.cs index 36811b9..00ccbcc 100644 --- a/SushiBar/SushiBarView/FormImplementers.cs +++ b/SushiBar/SushiBarView/FormImplementers.cs @@ -2,6 +2,7 @@ using SushiBar; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.DI; using System; using System.Collections.Generic; using System.ComponentModel; @@ -30,15 +31,8 @@ namespace SushiBarView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["ImplementerFIO"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка исполнителей"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка исполнителей"); } catch (Exception ex) { @@ -55,9 +49,9 @@ namespace SushiBarView private void buttonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); - if (service is FormImplementer form) - { + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { if (form.ShowDialog() == DialogResult.OK) { LoadData(); diff --git a/SushiBar/SushiBarView/FormMail.cs b/SushiBar/SushiBarView/FormMail.cs index 26889be..5bba35e 100644 --- a/SushiBar/SushiBarView/FormMail.cs +++ b/SushiBar/SushiBarView/FormMail.cs @@ -28,16 +28,8 @@ namespace SushiBarView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["MessageId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["Body"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка почтовых собщений"); + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка почтовых собщений"); } catch (Exception ex) { diff --git a/SushiBar/SushiBarView/FormMain.Designer.cs b/SushiBar/SushiBarView/FormMain.Designer.cs index 52dbf33..f80c6e4 100644 --- a/SushiBar/SushiBarView/FormMain.Designer.cs +++ b/SushiBar/SushiBarView/FormMain.Designer.cs @@ -20,208 +20,216 @@ base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - ButtonCreateOrder = new Button(); - ButtonOrderReady = new Button(); - ButtonRef = new Button(); - ButtonIssuedOrder = new Button(); - ButtonTakeOrderInWork = new Button(); - menuStrip = new MenuStrip(); - toolStripMenuItem1 = new ToolStripMenuItem(); - componentsToolStripMenuItemToolStripMenuItem = new ToolStripMenuItem(); - sushiToolStripMenuItemToolStripMenuItem = new ToolStripMenuItem(); - ClientToolStripMenuItem = new ToolStripMenuItem(); - employersToolStripMenuItem = new ToolStripMenuItem(); - начатьРаботуToolStripMenuItem = new ToolStripMenuItem(); - отчётыToolStripMenuItem = new ToolStripMenuItem(); - componentsToolStripMenuItem1 = new ToolStripMenuItem(); - componentSushiToolStripMenuItem1 = new ToolStripMenuItem(); - ordersToolStripMenuItem = new ToolStripMenuItem(); - dataGridView = new DataGridView(); - gToolStripMenuItem = new ToolStripMenuItem(); - menuStrip.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); - SuspendLayout(); - // - // ButtonCreateOrder - // - ButtonCreateOrder.Location = new Point(676, 37); - ButtonCreateOrder.Name = "ButtonCreateOrder"; - ButtonCreateOrder.Size = new Size(217, 29); - ButtonCreateOrder.TabIndex = 0; - ButtonCreateOrder.Text = "Создать заказ"; - ButtonCreateOrder.UseVisualStyleBackColor = true; - ButtonCreateOrder.Click += ButtonCreateOrder_Click; - // - // ButtonOrderReady - // - ButtonOrderReady.Location = new Point(676, 180); - ButtonOrderReady.Name = "ButtonOrderReady"; - ButtonOrderReady.Size = new Size(217, 29); - ButtonOrderReady.TabIndex = 1; - ButtonOrderReady.Text = "Заказ готов"; - ButtonOrderReady.UseVisualStyleBackColor = true; - ButtonOrderReady.Click += ButtonOrderReady_Click; - // - // ButtonRef - // - ButtonRef.Location = new Point(676, 323); - ButtonRef.Name = "ButtonRef"; - ButtonRef.Size = new Size(217, 29); - ButtonRef.TabIndex = 2; - ButtonRef.Text = "Обновить список"; - ButtonRef.UseVisualStyleBackColor = true; - ButtonRef.Click += ButtonRef_Click; - // - // ButtonIssuedOrder - // - ButtonIssuedOrder.Location = new Point(676, 256); - ButtonIssuedOrder.Name = "ButtonIssuedOrder"; - ButtonIssuedOrder.Size = new Size(217, 29); - ButtonIssuedOrder.TabIndex = 3; - ButtonIssuedOrder.Text = "Заказ выполнен"; - ButtonIssuedOrder.UseVisualStyleBackColor = true; - ButtonIssuedOrder.Click += ButtonIssuedOrder_Click; - // - // ButtonTakeOrderInWork - // - ButtonTakeOrderInWork.Location = new Point(676, 109); - ButtonTakeOrderInWork.Name = "ButtonTakeOrderInWork"; - ButtonTakeOrderInWork.Size = new Size(217, 29); - ButtonTakeOrderInWork.TabIndex = 4; - ButtonTakeOrderInWork.Text = "Отдать на выполнение"; - ButtonTakeOrderInWork.UseVisualStyleBackColor = true; - ButtonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; - // - // menuStrip - // - menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem1, отчётыToolStripMenuItem }); - menuStrip.Location = new Point(0, 0); - menuStrip.Name = "menuStrip"; - menuStrip.Size = new Size(922, 24); - menuStrip.TabIndex = 5; - menuStrip.Text = "menuStrip1"; - // - // toolStripMenuItem1 - // - toolStripMenuItem1.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItemToolStripMenuItem, sushiToolStripMenuItemToolStripMenuItem, ClientToolStripMenuItem, employersToolStripMenuItem, начатьРаботуToolStripMenuItem, gToolStripMenuItem }); - toolStripMenuItem1.Name = "toolStripMenuItem1"; - toolStripMenuItem1.Size = new Size(94, 20); - toolStripMenuItem1.Text = "Справочники"; - // - // componentsToolStripMenuItemToolStripMenuItem - // - componentsToolStripMenuItemToolStripMenuItem.Name = "componentsToolStripMenuItemToolStripMenuItem"; - componentsToolStripMenuItemToolStripMenuItem.Size = new Size(180, 22); - componentsToolStripMenuItemToolStripMenuItem.Text = "Компоненты"; - componentsToolStripMenuItemToolStripMenuItem.Click += componentsToolStripMenuItem_Click; - // - // sushiToolStripMenuItemToolStripMenuItem - // - sushiToolStripMenuItemToolStripMenuItem.Name = "sushiToolStripMenuItemToolStripMenuItem"; - sushiToolStripMenuItemToolStripMenuItem.Size = new Size(180, 22); - sushiToolStripMenuItemToolStripMenuItem.Text = "Суши"; - sushiToolStripMenuItemToolStripMenuItem.Click += sushiToolStripMenuItem_Click; - // - // ClientToolStripMenuItem - // - ClientToolStripMenuItem.Name = "ClientToolStripMenuItem"; - ClientToolStripMenuItem.Size = new Size(180, 22); - ClientToolStripMenuItem.Text = "Клиенты"; - ClientToolStripMenuItem.Click += ClientToolStripMenuItem_Click; - // - // employersToolStripMenuItem - // - employersToolStripMenuItem.Name = "employersToolStripMenuItem"; - employersToolStripMenuItem.Size = new Size(180, 22); - employersToolStripMenuItem.Text = "Исполнители"; - employersToolStripMenuItem.Click += employersToolStripMenuItem_Click; - // - // начатьРаботуToolStripMenuItem - // - начатьРаботуToolStripMenuItem.Name = "начатьРаботуToolStripMenuItem"; - начатьРаботуToolStripMenuItem.Size = new Size(180, 22); - начатьРаботуToolStripMenuItem.Text = "Начать работу"; - начатьРаботуToolStripMenuItem.Click += startWorkToolStripMenuItem_Click; - // - // отчётыToolStripMenuItem - // - отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItem1, componentSushiToolStripMenuItem1, ordersToolStripMenuItem }); - отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; - отчётыToolStripMenuItem.Size = new Size(60, 20); - отчётыToolStripMenuItem.Text = "Отчёты"; - // - // componentsToolStripMenuItem1 - // - componentsToolStripMenuItem1.Name = "componentsToolStripMenuItem1"; - componentsToolStripMenuItem1.Size = new Size(201, 22); - componentsToolStripMenuItem1.Text = "Суши"; - componentsToolStripMenuItem1.Click += ComponentsToolStripMenuItem_Click; - // - // componentSushiToolStripMenuItem1 - // - componentSushiToolStripMenuItem1.Name = "componentSushiToolStripMenuItem1"; - componentSushiToolStripMenuItem1.Size = new Size(201, 22); - componentSushiToolStripMenuItem1.Text = "Суши с компонентами"; - componentSushiToolStripMenuItem1.Click += ComponentSushiToolStripMenuItem_Click; - // - // ordersToolStripMenuItem - // - ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; - ordersToolStripMenuItem.Size = new Size(201, 22); - ordersToolStripMenuItem.Text = "Заказы"; - ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; - // - // dataGridView - // - dataGridView.BackgroundColor = Color.White; - dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(12, 27); - dataGridView.Name = "dataGridView"; - dataGridView.RowTemplate.Height = 25; - dataGridView.Size = new Size(647, 344); - dataGridView.TabIndex = 6; - // - // gToolStripMenuItem - // - gToolStripMenuItem.Name = "gToolStripMenuItem"; - gToolStripMenuItem.Size = new Size(180, 22); - gToolStripMenuItem.Text = "Почта"; - gToolStripMenuItem.Click += mailToolStripMenuItem_Click; - // - // FormMain - // - AutoScaleDimensions = new SizeF(7F, 15F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(922, 383); - Controls.Add(dataGridView); - Controls.Add(ButtonTakeOrderInWork); - Controls.Add(ButtonIssuedOrder); - Controls.Add(ButtonRef); - Controls.Add(ButtonOrderReady); - Controls.Add(ButtonCreateOrder); - Controls.Add(menuStrip); - MainMenuStrip = menuStrip; - Name = "FormMain"; - Text = "FormMain"; - Load += FormMain_Load; - menuStrip.ResumeLayout(false); - menuStrip.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); - ResumeLayout(false); - PerformLayout(); - } + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + ButtonCreateOrder = new Button(); + ButtonOrderReady = new Button(); + ButtonRef = new Button(); + ButtonIssuedOrder = new Button(); + ButtonTakeOrderInWork = new Button(); + menuStrip = new MenuStrip(); + toolStripMenuItem1 = new ToolStripMenuItem(); + componentsToolStripMenuItemToolStripMenuItem = new ToolStripMenuItem(); + sushiToolStripMenuItemToolStripMenuItem = new ToolStripMenuItem(); + ClientToolStripMenuItem = new ToolStripMenuItem(); + employersToolStripMenuItem = new ToolStripMenuItem(); + начатьРаботуToolStripMenuItem = new ToolStripMenuItem(); + gToolStripMenuItem = new ToolStripMenuItem(); + отчётыToolStripMenuItem = new ToolStripMenuItem(); + componentsToolStripMenuItem1 = new ToolStripMenuItem(); + componentSushiToolStripMenuItem1 = new ToolStripMenuItem(); + ordersToolStripMenuItem = new ToolStripMenuItem(); + dataGridView = new DataGridView(); + создатьБэкапToolStripMenuItem = new ToolStripMenuItem(); + menuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // ButtonCreateOrder + // + ButtonCreateOrder.Location = new Point(676, 37); + ButtonCreateOrder.Name = "ButtonCreateOrder"; + ButtonCreateOrder.Size = new Size(217, 29); + ButtonCreateOrder.TabIndex = 0; + ButtonCreateOrder.Text = "Создать заказ"; + ButtonCreateOrder.UseVisualStyleBackColor = true; + ButtonCreateOrder.Click += ButtonCreateOrder_Click; + // + // ButtonOrderReady + // + ButtonOrderReady.Location = new Point(676, 180); + ButtonOrderReady.Name = "ButtonOrderReady"; + ButtonOrderReady.Size = new Size(217, 29); + ButtonOrderReady.TabIndex = 1; + ButtonOrderReady.Text = "Заказ готов"; + ButtonOrderReady.UseVisualStyleBackColor = true; + ButtonOrderReady.Click += ButtonOrderReady_Click; + // + // ButtonRef + // + ButtonRef.Location = new Point(676, 323); + ButtonRef.Name = "ButtonRef"; + ButtonRef.Size = new Size(217, 29); + ButtonRef.TabIndex = 2; + ButtonRef.Text = "Обновить список"; + ButtonRef.UseVisualStyleBackColor = true; + ButtonRef.Click += ButtonRef_Click; + // + // ButtonIssuedOrder + // + ButtonIssuedOrder.Location = new Point(676, 256); + ButtonIssuedOrder.Name = "ButtonIssuedOrder"; + ButtonIssuedOrder.Size = new Size(217, 29); + ButtonIssuedOrder.TabIndex = 3; + ButtonIssuedOrder.Text = "Заказ выполнен"; + ButtonIssuedOrder.UseVisualStyleBackColor = true; + ButtonIssuedOrder.Click += ButtonIssuedOrder_Click; + // + // ButtonTakeOrderInWork + // + ButtonTakeOrderInWork.Location = new Point(676, 109); + ButtonTakeOrderInWork.Name = "ButtonTakeOrderInWork"; + ButtonTakeOrderInWork.Size = new Size(217, 29); + ButtonTakeOrderInWork.TabIndex = 4; + ButtonTakeOrderInWork.Text = "Отдать на выполнение"; + ButtonTakeOrderInWork.UseVisualStyleBackColor = true; + ButtonTakeOrderInWork.Click += ButtonTakeOrderInWork_Click; + // + // menuStrip + // + menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem1, отчётыToolStripMenuItem, создатьБэкапToolStripMenuItem }); + menuStrip.Location = new Point(0, 0); + menuStrip.Name = "menuStrip"; + menuStrip.Size = new Size(922, 24); + menuStrip.TabIndex = 5; + menuStrip.Text = "menuStrip1"; + // + // toolStripMenuItem1 + // + toolStripMenuItem1.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItemToolStripMenuItem, sushiToolStripMenuItemToolStripMenuItem, ClientToolStripMenuItem, employersToolStripMenuItem, начатьРаботуToolStripMenuItem, gToolStripMenuItem }); + toolStripMenuItem1.Name = "toolStripMenuItem1"; + toolStripMenuItem1.Size = new Size(94, 20); + toolStripMenuItem1.Text = "Справочники"; + // + // componentsToolStripMenuItemToolStripMenuItem + // + componentsToolStripMenuItemToolStripMenuItem.Name = "componentsToolStripMenuItemToolStripMenuItem"; + componentsToolStripMenuItemToolStripMenuItem.Size = new Size(154, 22); + componentsToolStripMenuItemToolStripMenuItem.Text = "Компоненты"; + componentsToolStripMenuItemToolStripMenuItem.Click += componentsToolStripMenuItem_Click; + // + // sushiToolStripMenuItemToolStripMenuItem + // + sushiToolStripMenuItemToolStripMenuItem.Name = "sushiToolStripMenuItemToolStripMenuItem"; + sushiToolStripMenuItemToolStripMenuItem.Size = new Size(154, 22); + sushiToolStripMenuItemToolStripMenuItem.Text = "Суши"; + sushiToolStripMenuItemToolStripMenuItem.Click += sushiToolStripMenuItem_Click; + // + // ClientToolStripMenuItem + // + ClientToolStripMenuItem.Name = "ClientToolStripMenuItem"; + ClientToolStripMenuItem.Size = new Size(154, 22); + ClientToolStripMenuItem.Text = "Клиенты"; + ClientToolStripMenuItem.Click += ClientToolStripMenuItem_Click; + // + // employersToolStripMenuItem + // + employersToolStripMenuItem.Name = "employersToolStripMenuItem"; + employersToolStripMenuItem.Size = new Size(154, 22); + employersToolStripMenuItem.Text = "Исполнители"; + employersToolStripMenuItem.Click += employersToolStripMenuItem_Click; + // + // начатьРаботуToolStripMenuItem + // + начатьРаботуToolStripMenuItem.Name = "начатьРаботуToolStripMenuItem"; + начатьРаботуToolStripMenuItem.Size = new Size(154, 22); + начатьРаботуToolStripMenuItem.Text = "Начать работу"; + начатьРаботуToolStripMenuItem.Click += startWorkToolStripMenuItem_Click; + // + // gToolStripMenuItem + // + gToolStripMenuItem.Name = "gToolStripMenuItem"; + gToolStripMenuItem.Size = new Size(154, 22); + gToolStripMenuItem.Text = "Почта"; + gToolStripMenuItem.Click += mailToolStripMenuItem_Click; + // + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { componentsToolStripMenuItem1, componentSushiToolStripMenuItem1, ordersToolStripMenuItem }); + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(60, 20); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // componentsToolStripMenuItem1 + // + componentsToolStripMenuItem1.Name = "componentsToolStripMenuItem1"; + componentsToolStripMenuItem1.Size = new Size(201, 22); + componentsToolStripMenuItem1.Text = "Суши"; + componentsToolStripMenuItem1.Click += ComponentsToolStripMenuItem_Click; + // + // componentSushiToolStripMenuItem1 + // + componentSushiToolStripMenuItem1.Name = "componentSushiToolStripMenuItem1"; + componentSushiToolStripMenuItem1.Size = new Size(201, 22); + componentSushiToolStripMenuItem1.Text = "Суши с компонентами"; + componentSushiToolStripMenuItem1.Click += ComponentSushiToolStripMenuItem_Click; + // + // ordersToolStripMenuItem + // + ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; + ordersToolStripMenuItem.Size = new Size(201, 22); + ordersToolStripMenuItem.Text = "Заказы"; + ordersToolStripMenuItem.Click += OrdersToolStripMenuItem_Click; + // + // dataGridView + // + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(12, 27); + dataGridView.Name = "dataGridView"; + dataGridView.RowTemplate.Height = 25; + dataGridView.Size = new Size(647, 344); + dataGridView.TabIndex = 6; + // + // создатьБэкапToolStripMenuItem + // + создатьБэкапToolStripMenuItem.Name = "создатьБэкапToolStripMenuItem"; + создатьБэкапToolStripMenuItem.Size = new Size(97, 20); + создатьБэкапToolStripMenuItem.Text = "Создать бэкап"; + создатьБэкапToolStripMenuItem.Click += createBackUpToolStripMenuItem_Click; + // + // FormMain + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(922, 383); + Controls.Add(dataGridView); + Controls.Add(ButtonTakeOrderInWork); + Controls.Add(ButtonIssuedOrder); + Controls.Add(ButtonRef); + Controls.Add(ButtonOrderReady); + Controls.Add(ButtonCreateOrder); + Controls.Add(menuStrip); + MainMenuStrip = menuStrip; + Name = "FormMain"; + Text = "FormMain"; + Load += FormMain_Load; + menuStrip.ResumeLayout(false); + menuStrip.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private Button ButtonCreateOrder; + private Button ButtonCreateOrder; private Button ButtonOrderReady; private Button ButtonRef; private Button ButtonIssuedOrder; @@ -239,5 +247,6 @@ private ToolStripMenuItem employersToolStripMenuItem; private ToolStripMenuItem начатьРаботуToolStripMenuItem; private ToolStripMenuItem gToolStripMenuItem; - } + private ToolStripMenuItem создатьБэкапToolStripMenuItem; + } } \ No newline at end of file diff --git a/SushiBar/SushiBarView/FormMain.cs b/SushiBar/SushiBarView/FormMain.cs index 7eb566a..fc3e4e0 100644 --- a/SushiBar/SushiBarView/FormMain.cs +++ b/SushiBar/SushiBarView/FormMain.cs @@ -12,6 +12,8 @@ using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Extensions.DependencyInjection; using SushiBarView.Reports; +using SushiBarContracts.DI; +using System.Windows.Forms; namespace SushiBarView { @@ -24,27 +26,25 @@ namespace SushiBarView 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 readonly ILogger _logger; private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; private readonly IWorkProcess _workProcess; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) - { + private readonly IBackUpLogic _backUpLogic; + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IBackUpLogic backUpLogic) + { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; _workProcess = workProcess; - } + _backUpLogic = backUpLogic; + } private void FormMain_Load(object sender, EventArgs e) { LoadData(); @@ -54,16 +54,8 @@ namespace SushiBarView _logger.LogInformation("Загрузка заказов"); try { - var list = _orderLogic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["SushiId"].Visible = false; - dataGridView.Columns["ClientId"].Visible = false; - dataGridView.Columns["ClientEmail"].Visible = false; - dataGridView.Columns["ImplementerId"].Visible = false; - } - _logger.LogInformation("Загрузка заказов"); + dataGridView.FillAndConfigGrid(_orderLogic.ReadList(null)); + _logger.LogInformation("Загрузка заказов"); } catch (Exception ex) { @@ -73,20 +65,14 @@ namespace SushiBarView } private void componentsToolStripMenuItem_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 sushiToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormSushis)); - if (service is FormSushis form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void ButtonTakeOrderInWork_Click(object sender, EventArgs e) { @@ -186,54 +172,63 @@ namespace SushiBarView private void ComponentSushiToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormReportSushiComponents)); - if (service is FormReportSushiComponents form) - { - form.ShowDialog(); - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); - } + } private void OrdersToolStripMenuItem_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 ClientToolStripMenuItem_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 employersToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); - if (service is FormImplementers form) - { - form.ShowDialog(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } private void startWorkToolStripMenuItem_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 mailToolStripMenuItem_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormMail)); - if (service is FormMail form) - { - form.ShowDialog(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + form.ShowDialog(); + } + + private void createBackUpToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + if (_backUpLogic != null) + { + var fbd = new FolderBrowserDialog(); + if (fbd.ShowDialog() == DialogResult.OK) + { + _backUpLogic.CreateBackUp(new BackUpSaveBinidngModel + { + FolderName = fbd.SelectedPath + }); + MessageBox.Show("Бекап создан", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка создания бэкапа", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } } diff --git a/SushiBar/SushiBarView/FormSushi.cs b/SushiBar/SushiBarView/FormSushi.cs index b265edb..8845378 100644 --- a/SushiBar/SushiBarView/FormSushi.cs +++ b/SushiBar/SushiBarView/FormSushi.cs @@ -12,6 +12,7 @@ using System.Windows.Forms; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; using SushiBarContracts.SearchModels; +using SushiBarContracts.DI; namespace SushiBarView @@ -108,54 +109,46 @@ pc.Value.Item1.ComponentName, pc.Value.Item2 }); private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormSushiComponent)); - if (service is FormSushiComponent form) - { - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count}", form.ComponentModel.ComponentName, form.Count); - if (_sushiComponents.ContainsKey(form.Id)) - { - _sushiComponents[form.Id] = (form.ComponentModel, form.Count); - } - else - { - _sushiComponents.Add(form.Id, (form.ComponentModel, form.Count)); - } - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() != DialogResult.OK) + { + return; + } + _logger.LogInformation("Добавление нового ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + if (_sushiComponents.ContainsKey(form.Id)) + { + _sushiComponents[form.Id] = (form.ComponentModel, + form.Count); + } + else + { + _sushiComponents.Add(form.Id, (form.ComponentModel, + form.Count)); + } + LoadData(); + } private void ButtonUpd_Click(object sender, EventArgs e) { if (dataGridView.SelectedRows.Count == 1) { - var service = - Program.ServiceProvider?.GetService(typeof(FormSushiComponent)); - if (service is FormSushiComponent form) - { - int id = - Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); - form.Id = id; - form.Count = _sushiComponents[id].Item2; - if (form.ShowDialog() == DialogResult.OK) - { - if (form.ComponentModel == null) - { - return; - } - _logger.LogInformation("Изменение компонента: { ComponentName} - { Count} ", form.ComponentModel.ComponentName, form.Count); - _sushiComponents[form.Id] = (form.ComponentModel, form.Count); - LoadData(); - } + var form = DependencyManager.Instance.Resolve(); + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _sushiComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Изменение ингридиента:{ ComponentName}-{ Count}", form.ComponentModel.ComponentName, form.Count); + _sushiComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); + } } } - } + private void ButtonDel_Click(object sender, EventArgs e) { diff --git a/SushiBar/SushiBarView/FormSushis.cs b/SushiBar/SushiBarView/FormSushis.cs index d5933eb..9a06dba 100644 --- a/SushiBar/SushiBarView/FormSushis.cs +++ b/SushiBar/SushiBarView/FormSushis.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using System.Windows.Forms; using SushiBarContracts.BindingModels; using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.DI; namespace SushiBarView { @@ -22,15 +23,13 @@ namespace SushiBarView private void ButtonAdd_Click(object sender, EventArgs e) { - var service = Program.ServiceProvider?.GetService(typeof(FormSushi)); - if (service is FormSushi form) - { - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } - } + var form = DependencyManager.Instance.Resolve(); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + + } + } private readonly ILogger _logger; private readonly ISushiLogic _logic; @@ -51,16 +50,9 @@ namespace SushiBarView { try { - var list = _logic.ReadList(null); - if (list != null) - { - dataGridView.DataSource = list; - dataGridView.Columns["Id"].Visible = false; - dataGridView.Columns["SushiComponents"].Visible = false; - dataGridView.Columns["SushiName"].AutoSizeMode = - DataGridViewAutoSizeColumnMode.Fill; - } - _logger.LogInformation("Загрузка суши"); + + dataGridView.FillAndConfigGrid(_logic.ReadList(null)); + _logger.LogInformation("Загрузка суши"); } catch (Exception ex) { @@ -73,15 +65,12 @@ namespace SushiBarView { if (dataGridView.SelectedRows.Count == 1) { - var service = Program.ServiceProvider?.GetService(typeof(FormSushi)); - if (service is FormSushi form) - { - form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); - if (form.ShowDialog() == DialogResult.OK) - { - LoadData(); - } - } + var form = DependencyManager.Instance.Resolve(); + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } } } diff --git a/SushiBar/SushiBarView/Program.cs b/SushiBar/SushiBarView/Program.cs index 129d4bf..5d371c5 100644 --- a/SushiBar/SushiBarView/Program.cs +++ b/SushiBar/SushiBarView/Program.cs @@ -16,6 +16,7 @@ using Microsoft.EntityFrameworkCore.Design; using SushiBar.BusinessLogicsContracts; using SushiBarBusinessLogic.MailWorker; using SushiBarContracts.BindingModels; +using SushiBarContracts.DI; namespace SushiBarView { @@ -30,13 +31,11 @@ namespace SushiBarView static void Main() { ApplicationConfiguration.Initialize(); - var services = new ServiceCollection(); - ConfigureServices(services); - _serviceProvider = services.BuildServiceProvider(); - try + InitDependency(); + try { - var mailSender = _serviceProvider.GetService(); - mailSender?.MailConfig(new MailConfigBindingModel + var mailSender = DependencyManager.Instance.Resolve(); + mailSender?.MailConfig(new MailConfigBindingModel { MailLogin = System.Configuration.ConfigurationManager.AppSettings["MailLogin"] ?? string.Empty, MailPassword = System.Configuration.ConfigurationManager.AppSettings["MailPassword"] ?? string.Empty, @@ -50,57 +49,47 @@ namespace SushiBarView } catch (Exception ex) { - var logger = _serviceProvider.GetService(); + 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) - { - services.AddLogging(option => - { + private static void InitDependency() + { + DependencyManager.InitDependency(); + + DependencyManager.Instance.AddLogging(option => + { option.SetMinimumLevel(LogLevel.Information); option.AddNLog("nlog.config"); }); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - } - private static void MailCheck(object obj) => ServiceProvider?.GetService()?.MailCheck(); - } + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(true); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + DependencyManager.Instance.RegisterType(); + } + private static void MailCheck(object obj) => DependencyManager.Instance.Resolve()?.MailCheck(); + } } \ No newline at end of file