From d062463466ac2ab8a8173e2dc079540d8302f70c Mon Sep 17 00:00:00 2001 From: ValAnn Date: Wed, 22 May 2024 13:07:02 +0400 Subject: [PATCH 1/4] =?UTF-8?q?=D0=B4=D0=BE=D0=BD,=20=D0=B4=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= =?UTF-8?q?=20=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 -- 2.25.1 From 953e250a6e6d36982ed730bb32febeeef2e10b17 Mon Sep 17 00:00:00 2001 From: ValAnn Date: Wed, 22 May 2024 16:02:18 +0400 Subject: [PATCH 2/4] =?UTF-8?q?=D0=BE=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SushiBarContracts.dll | Bin 30720 -> 30720 bytes .../SushiBarDataModels.dll | Bin 6144 -> 6144 bytes .../SushiBarDatabaseImplement.dll | Bin 76288 -> 76288 bytes .../SushiBarListImplement.dll | Bin 24064 -> 24064 bytes ... => 20240522110209_InitCreate.Designer.cs} | 2 +- ...Create.cs => 20240522110209_InitCreate.cs} | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename SushiBar/SushiBarDatabaseImplement/Migrations/{20240522080218_InitCreate.Designer.cs => 20240522110209_InitCreate.Designer.cs} (99%) rename SushiBar/SushiBarDatabaseImplement/Migrations/{20240522080218_InitCreate.cs => 20240522110209_InitCreate.cs} (100%) diff --git a/SushiBar/ImplementationExtensions/SushiBarContracts.dll b/SushiBar/ImplementationExtensions/SushiBarContracts.dll index 0c118c7985b437ef8a2af888d5f846ece7ed0ccf..9f20d54acb91af10f311ef50a3d80cf54bef8cca 100644 GIT binary patch delta 238 zcmZqpz}WDCaY6@6OW*U&8+%mJ1d?lR-cq#@^xIWeG5OtdgUOo@q?NF0q!^ePnV1=y zn3*Le8zm-LBw84n8>bqjBpaApnwl7-SQr}^rI{NfZ;r|N!OY^8F>B}Kh=Krtbw~cZ zRt$D`Usv&Mx856`t&?{Ylqo<3)nS4l)me#F8!yFLOgJGvv0<}c;Ui}M6b1tZGX^6D z6Ch~}Ce0WU8Ipk_i3~{$7C_R1!H~fmD3=NpO99Fl0C|=Sra-j@K)wY~#sDaj1{5`5 LNZwpu+Q5d{GPd%dbY zzw>qSXqr9c(9JL>*U38y$`qi29ZXO`km|JPY2SGE&G!y}x=VbsU*RKWe^Z8Jh9m|P zhC~KK1`7srAj=3y8iQHJ45>g-6EHRb${GXNX+V`}K=EXt3J^2^>IPwuOe%xv=K9h` FCIG|7PDKC! diff --git a/SushiBar/ImplementationExtensions/SushiBarDataModels.dll b/SushiBar/ImplementationExtensions/SushiBarDataModels.dll index 4b85e0a2d2e142a44026c3e8d442433c346241d1..302d4ae1fec0fda8c2aeb84803bf9026c1792123 100644 GIT binary patch delta 235 zcmZoLXfT-2!P4e&Yv#tDH@pHicI`F0e$MmnSaQ^#sf=g(<_^9>MvW8$Gb0l-V-qv8 z#AKtyB#T4~Lv!O)qm*O=b4ybbgA@y61EVx^gXGDI0_iNls+}7r_Xq?CbSxG8e(W!g zIkDiMNZ*CDh!0d0zkj#+8V8W2d zV8~#>U=Cy%0ZC&p%a|b*C~5-6CO}zZAUh4HG7Tu63{(Mv20+~)43bG@Fx@;^G?xhg Dzu-q< diff --git a/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll b/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll index 4b0412e76963d09486777997f18208768c2af2ab..ca5f775d5b312a54d7106c88b34614d2b8406ac7 100644 GIT binary patch delta 254 zcmZp;!qRYsWkLtbHj7i2HugOEE^vDB(MmT-!Lqh{21Iy`Ma*RbR zLFM`Tj$(qd#KU5SoOp}vL5)CcP zO^nQq%}tC`4NVM9Oe~B|(h}2Blg-V|4U!C!Owv+Kx1W(@+`+2q7$lR*V7mRhDx)C_04u9ay8r+H diff --git a/SushiBar/ImplementationExtensions/SushiBarListImplement.dll b/SushiBar/ImplementationExtensions/SushiBarListImplement.dll index bb1fb9e44aa83ce32774b64366e6df8c3ca7d87e..85ece57ef27e350e9d131533b3c1a2b89c9e6a58 100644 GIT binary patch delta 237 zcmZqJ!`QHgaY6?R+l8Ft8+)#J3%t@}I3K9N<~i4JQ{oox^V>HU_#9=|NHH)oGBGnY zF*8d{HcCvgNVG6CH%>K5Nj5OIG&M0uu`o6;N;5Y|o*Wxe&2r{#M#JPgAprvabnhHF&HtJ z07+voX~vMqkPH+_WJqGL0Fo9Ah79IFxm2K73Q)!X$g^ZH1*$aw@-2We20)oKpr`>u K^5*5ykxT%gtVg8) delta 237 zcmZqJ!`QHgaY6^nrLNGa8+)#J3uLS9+NPzv#C4|dtBFfXnx1(@Igs31u7+9P+)_?(#dK!;_E-R9e&wXFW849N^h3?>YT z42BFA4CX+V5s)+nvy2&1fubg0Yyy-u2C~zDD${`C$v_n#XaLj=!XTMc2Gh;Uqa&FB DJs3>f diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522110209_InitCreate.Designer.cs similarity index 99% rename from SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs rename to SushiBar/SushiBarDatabaseImplement/Migrations/20240522110209_InitCreate.Designer.cs index e8eb255..a78068c 100644 --- a/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.Designer.cs +++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522110209_InitCreate.Designer.cs @@ -12,7 +12,7 @@ using SushiBarDatabaseImplement; namespace SushiBarDatabaseImplement.Migrations { [DbContext(typeof(SushiBarDatabase))] - [Migration("20240522080218_InitCreate")] + [Migration("20240522110209_InitCreate")] partial class InitCreate { /// diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240522110209_InitCreate.cs similarity index 100% rename from SushiBar/SushiBarDatabaseImplement/Migrations/20240522080218_InitCreate.cs rename to SushiBar/SushiBarDatabaseImplement/Migrations/20240522110209_InitCreate.cs -- 2.25.1 From b4fafcfa48c4fb64f00163d12b6900fd8130ea3c Mon Sep 17 00:00:00 2001 From: ValAnn Date: Sat, 25 May 2024 11:03:30 +0400 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B3=D0=B8=D1=82=D0=B8=D0=B3=D0=BD=D0=BE=D1=80?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index ca1c7a3..f56d961 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,10 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# dll файлы +*.dll + +/SushiBar/ImplementationExtensions # Mono auto generated files mono_crash.* -- 2.25.1 From ad5c35dd42b387f0c53be367b69e1a2fddabb6ac Mon Sep 17 00:00:00 2001 From: ValAnn Date: Sat, 25 May 2024 11:04:46 +0400 Subject: [PATCH 4/4] =?UTF-8?q?=D0=B2=D1=81=D0=B5=20=D0=B5=D1=89=D0=B5=20?= =?UTF-8?q?=D0=B3=D0=B8=D1=82=D0=B8=D0=B3=D0=BD=D0=BE=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SushiBarContracts.dll | Bin 30720 -> 0 bytes .../SushiBarDataModels.dll | Bin 6144 -> 0 bytes .../SushiBarDatabaseImplement.dll | Bin 76288 -> 0 bytes .../SushiBarListImplement.dll | Bin 24064 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 SushiBar/ImplementationExtensions/SushiBarContracts.dll delete mode 100644 SushiBar/ImplementationExtensions/SushiBarDataModels.dll delete mode 100644 SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll delete mode 100644 SushiBar/ImplementationExtensions/SushiBarListImplement.dll diff --git a/SushiBar/ImplementationExtensions/SushiBarContracts.dll b/SushiBar/ImplementationExtensions/SushiBarContracts.dll deleted file mode 100644 index 9f20d54acb91af10f311ef50a3d80cf54bef8cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30720 zcmeHw3wTuJ)$ZDRE}0oZl9_}gAmD_X;TFREDkdZWqTD0_Zy*^m1B^^EVJ3l~1tx$O z>IJE-RaJU;DSU{rVg7zvF;N2;r@`L47iT{{t@sdSiL4vtW`fHvM;8!0A2zDFmRf< z_=#$YV)0llG$~sv1g>ZdpOm8n-BlC|MWS%zvQj%f9BVT^DMty>ycAW$o!qWCxNJH( zsJV#f^)*DAu>U*^(+e|+JTzvl67;;A$0FRwT-$fIA*g-KT+?9drK8ODF+=rh&=2-8 z!*ts=5kR2Q1|b3nhe?P40>i}c5aE7(JNn$Sjop>Vj!I+~z0fPgMA9@fsR$s@Z$>N; zK)6jp1P~sRP(m_TKhq)tT+ty$FcCoXHwh6yWSE2qX3^PQm6sir$Sx^GM^hWYML;an z+8{&#fm#}b2uoBLwx)#fnNA`gRklfp03ydEL;x|sBt!s_YZ4+{tuo^DO5~I&dFGk^ zA|OD%Nr(Vqph<`TVvtFQ0OA~z5COzslMn&K5R(w$WmOc;L5UnniJV4>?4459p-^Q! zih!`^nuG`-{3am+hys%k0mLwq5COz+lMn&K2$K*2#7L760mLYi5COz_CLscdLX!{y z#AuTc0mK-S5P`Cbb!$;jmFFrbkqfWqY~vCthKr&P*v8@YLJSwrHV&N9R+#KYTZw=S z$C-o(AjX@72q3WJ7)e9`F~KB6Fvk+Rt5PtZl4r5$F9HHgGzk$vOfm@(%!ur+$1z4d z+n7&@IN9_U0Rg6%ga{y}nuG`-rkR8YW)|$O$1(Oj+n7(uV!G)s0s_o12_+;Km6@hR z1h~#J2@ycdHVGvp)6Ow1BEa>0lTbp^b*^a<0j?LAga{x?OhN<@r6wT)2wY%{z7zpO znMo)inO(VQ5dp3hCZPo7x?D9H>G4kN2e!>;w{tLV5s|M`UfR9@RL}dl%X76e+QD0tF|+h*xLCI6i#=6%j!m&58q`UKbJPZH zOi>&wvnRoY9+Og2EK#0q7cx1Q^lMnK6=EIqjKZ|#Ig81J{SC@yL#4BnOQ9VRN72{} zQ+J4t8C=Pc&YsSBM!K|K=`fLa>)}OYj%74qlvYZn#H>K}nx+0G_TW+TPQj+=U}>&bE`+9v#V& zBRAVQcB|Lnb>5YoM&7h2RzlCX><;9w7h)0gfWq438LQ=HyS%P(3y6Cy+wFCa^TNGw zG;EFR>_OA_AhJDPPxKcknN#rZdUii=zi|%odORo)d7XKeW;?x3uj7{R1z-CDTV+=i zb@R-+7_y8iR}?EAMwK%=eJpv?VKl~60sZ7Pb4=MNidblEj4AY>Cyq7E;~DEFXB2B6 za&nHF>Wp2>O%uf$=h?m!Z9Q^)-l**@5dQAGQX^*^tCnYEf-Qw8+SuH`Yp89%wDC_n z$J=toqWoCPJh3Mbq!6o@2c>c0;+33t7a^rw%|tM_1gxYuEi#=%z~o$P5+Zl zVc41yW~u2U0#YqA2@ybCY!V`XSZ)#`fT%JF5zK{^)2piir%cJS+VmFz0aloV2q0FP zga{xmF$obsTxt>`fVj*gL@+lJoP#O^$5tXoRU#)(Dca>wrRhaL*egsz1Q4rCLIiU& z$nGj4J1UV~Qi88GlZt>?SDJ(fAl8_K2q0=qLIe;2lMn&KT9XiAP<#qT)YWG7IU`jT zj;KVAr9_UBQo>rOQhgB+J!ldlfC!m{2q4y(ga{zkn}i4;HkgD6Ai^dg0*I?jLIe;S zO+tjLu%BU9wVz?9lrl$5UlEYF&Ll(tQEw6=m=l5BQ^H{08&wwpsTxc|1Q44{LIe;o zlMuli_w24V6wIe&5jXusK!8S*5CKG!Nr(Vqvq^{mVv9+L@N;#mM!KzVIhG#M?S<8H zb`-9ZbB4X}QbTYQUd{rpXRC2e@OqV8b>`cmQ+ZM1m920Zq%rfVE}W;SyUcW~iJPYs z6&Fn|o;-0T6kI9Ld~^z%nc>@sW?<`*GZ1oBV=P?19@WD$1I)J%aUQ;+ie_NKWwE?q zMP)h83!&fYhCVM6#juq_$8vnhx%ax=Sp4ZTZ89$PlKWh!7}K;9AFQtQ9?r;$P)N$e z=XNB-dQIox!x_JW59@FxWFhDNIAbN|>oJbanQUXP%lmcsobBmF=Xz zx{ttfCvwT4_4HlMNz;jaTE%Ch;9{VY?r<}|Mwpj!SLZnC0x4mW_?LpuKx=S>Bk*+6 zGVnfn-n%tDmkxMmWeuXuS+h{u%f#o=d@gy8_Yu^q9-dBmE0ggZDf8j^4=Lu#{wX_DbCu=+!vgkI{dn#l*m@LZ3%*iQ5 zA3CTF+8@(0FhbHOLu`XGev@4aEk|rI?f3w~C4Gq4Zt4F3Z2f4MXrnU=5hWAbJdXKJ z25UZ=B-(SL<ynWYf_{Tu$9( zXuC!GO`4&7U9=-gyH&JKrF~PhA1m!H$zfc^pHPSC)GC@yw3&3DXm9ps+Z_6#XrG8S zmmU%AXQGwUv!eNZ-=$KTPsb&PCD4c}=|#~#&os1Oh-a;MR#K;E&0bD-5xpv&W3_kD zx);$KqU})HuS8p_wBLv}P-*XqHbZIei?&y3ABxsrX@3xH_W&b@KTGa^On(mbyNLcG zT3dhC7SU&-Z5C}QX&U!~N3?267j3d=m(xJe7Kyf+{GtU#tED2*o)9fUrJ@yx7Nv!v zz2upR@foL!ISVRHpP7A-nrW40E65@@Gt>fY6s^pD30Rxn3AfGqY2Xz)?po+}JL6wO z-mJfN7XEDh%-bYF!1-${@@$D_#GG$qpBx9Hk?+^V`nKftTN~&8ma`kyBMz2da55U6 zZ>N;=N0Q64lFEpGpI9H32!E3J@7lQx_c`7J4zqL2R~;V!jc5jA_?w=bm%*evxr7@W zf3W-weu9l-?sj}GJhzWgU!$#3YiiWUsGVUon4j6X43niK_c_vajf`3tKAcMdP4eaF zUaIir>l3LfcQAY&_nxa4&<$B5AipSeG-~nHTl=rlVqQsmtF&sV)NzZ*g(6=hZEm#u z!@~FOoz#9Yddet?(f&ps88!OyUbtOKlG++ZoZjucLp;~nMx*XK?A$M_?c*TNwU5@F zPE9+ltxWXK8>g>KJnUwi?PaVLtj=M1p~w{?-;_B{pGJFWqMnQ1o~AGJ^ZI^W{sXw) zX>^&TEkF)2OIrkOr=_v&8=}4MKCCT=c9&su9Yg6f+OKTgv_sSB2g>#_udnpDvdzof zf$u4vQMN^yS-4g_uWX+=cW8EcN!ilUvT#j#)zGAz4l<4x9IpJ8dQ$r|Z%v9eDeo$s z_ZED-;CL`^la9M+IbLv_c5l*okHNNiPm3j{(JKRKh02e6WguOtY+Q#yv`*Q$4udGFY+Q$PXp6FO z9nPVIvT+>-(+$eTbr?+h3{C1VgbpiD9uq_8xbo!OhtMfyYjp3>hSF(eyUvZPGrg^B zgY)<5=hA!1HZuPZ?PuZpo^(&xrl_liChkb@nRTYZxt~=niEo(3|!1s8!jD^aQkn%C-`1R!EO1TL^7dNKY%< zbNP4Zqv@Ekb>!a-?L}q#Fn5PGhJLARpXOq8(p$>bn!iIEOYbV%!Tc=jvHru*q(uGSPyQ zsZD7^(1MfcL6xpKZ@E5&9#yuTc^d9u4lCQK%)R@G1m(q@5 zyqr(_4Nb)0Y2o^2`3m0xYcGcBcknzuSdo0PY~hR03H_F!Jrh9^!+bLDTb1uX5; zyhMsNDep$xTFdre-ZyMPOFQlUh7FIEIN^#w&X>eXKOTB5b9j`L!mG(sL5!-fJp|oSUFF?Ce zX}m)3pmj>)6?zBpR|jUP6V$A1+`0)$D2+>VVl*Y5Th3+ymX~CVeU$hpb zJt^AluDY}i+fK?qkMp~o_T|3pI5o`lBmGu1 zW4zqR1{^OqhI#)6PvhWSWuEOOOB;n%>K04;#BHlJPu< za~Oqn>06fV6Sv3yZA&{1?G8)J@_6ibTH420iSDwrPuyNRKg-~Q%bBp)?}gowD&d_$2LBHr`P` zMc-C7-cdhAt;)tb>Zj=eW#b+7)AWd;Ny!dVhq85JuXvbVSK7zeD;}n9rRAjU(4L_W zlr|E%KSQ4=Z9aCmN9Z%9U4|X*5weYy)^(l49_3lWH>%v$uD7s9d6sgNR)loV(O{*` zLb~T@q|zQix^^0`v?EB@PSXrcN_~_zD%-vRJG7$|S6bVEEILYGQyTBfkI`S5@hdKTkH`D@7ipKW@qYeAx=GpizT*^q zQ`z{w;}qSkYQFY` z>vz!W%Eo*B4(e7m-ide82g=4f@lN_g*?6!2GJU3Oyw`u3Y~!VMr6qnzLk-RKC)W<` zmo!RgI(p@oG(l;64L?oOmB!cb(^R4~zJ|X-3zf##@K@+!Lz5g{rI2XG8uBXDDNku=L1%62MUqqph5m8~%S zV*9VjR>bYu;yOS55@_k7UFZ69zaiRhC`Z{`>5J^Yp&^D1CA-qzMHh=^T>Ian)s_w4 z2hlpwc9Dm|_V*B7qkr$$H_nl7Nw@?WeO38v(Kt$9ag4}4@oeS!e~mZWr0;sAS`FD` z{)eltmNczj)>B`-A5)`!d8#kBrp8H?|5sD>-BxECb^i>1%$;`{#!d@8Z#uEwVl-vI~ksl+?@A$%&S zKh@z=iQVTmd@AW&+|!SN?-mD1&x!HCTD5fi+Ju5nfCzqYrEk2h2vWB+yl?=I$OosrjR4=r(tve$aT3-@G;;$ zj&|`ms*pX8i{}ZkJ};hKV(nJQKJUQi9w0}1PmnaOou-g|Z1^tYfWxkFE)HO+?iXu; zLiQOhKEuU2QgE{PmxxcPLiQ{Z&oc2T7oQ4|Ys4p@kUeX~vsSDj!Gu^_6td4Q@!2KT z-N1Vs*NWUGK5ZKN>=&Q?!rv!&P~$Q1nD`$R&!ggbTs)79&+~#O;rS%KDd#rn7N2*- z=N+-WC-?z;{==#1(r!BEXu}ss2Y}pG4neohITnadf%ps;pOIo64XY!qRIH_9EfZ_G zK8PkbE5xS~K9kY{;u8>`TJZ^qH4N*Lw1ik&6iWMu&u;jjWyEt2JmYDt;?t&3T1hrsX5b6k8*inUAlZiQ@p2Ud(FiSU8=kWJb|A^X^D>|?V@%Luw{zw&%1 z%`ZL$3fXhGcn%kzk%FV)c{Hs=d`cCvXC?Ue(`tkXC}h4?BGgLSFnnCD7O}S2*t!eW z13)gx9$1IDTE)LjeA>ikzxW)4b(Zs}@JEF|31*I~TbOQP-Vx7tB-#h!ui2&UcFxOf zm);kqK$zin&V96<`(-q&0auAwOBHgeGV!UDv^By9#6O^9siXLW;d8w!A$*HMsiRo; z!1_H`tMF|K*}7k>2Vp(#Y8U>fLbe_k>q%JOc6ABgt&pwni1hn^dj3g4!X zt^38gU##uIA63ZK<6=E7)-K_@6|$9_Qagpr*qk!Eom_smGfs~=+|EIC%26Ob1y1%E zEXS9=hzeKF1;$JHMrHWzyGVw1H|1xJSjdE5Z)lzqj_yiQPXBd35J0VPqLgsgg zyhkGMksMovX;a8P?IIr)pQB1%p8zt?ZTW8xl8137th~!!Ax+Ho6Bi;GvgPzK;#mU0}44>Q22x} zEea)Hk=qnXzT(*~%u$8RcZuAskePSIlRVN^3YqtdT%eGd5gsmKi7=%KnXeH!ppcn_ z$Sn$)*)3^Xg=tgBd^=u|zz#&1qY9ZnA^u%r?GnCQAzP`RlvW`#_I}cO!W1ZEzC`3w zh0K(TXN@och0G^JZc)fgtH^B%nK>Y7+l4u*kohi=yA?9?u6RW2{B3L8XF4!eVqr^wBM6gCMA=oO|F4!eV=ZU{y ziC~RjLa944aOV%qw&sT5txaT zM^h;u@3{}8S$KzV4xK}IV~5J|MqdTI=HtoC0vbyf;)%sl8c!>b>QX$FSwqFN0jW3A zB>DZ`486fl^hat0He@o6Ph*^+H=l(+n?LhkcXQg&`3Z@@%*ztlh}oLP%(yH@Bi}bQ z_Maqqg(dCj{M}&wmdpH)@{N+P|D=?1UM1zsmQ+UkKWXe!AQ2AavHW@_m*M5yJ;0CL z9J4C#7NC)@!5IFgC+B4_-;)SG%>B0IZ}6+qIOg|r4+zigW7OAZtJInrH8N^vSPkZQ zCYRxpEXJ2}9|sz>Fno+$5@|=kI|gzsE|MAH?Mp5$+ice{U`IN)LuvX8 z!1VNEcK*8_Hp~zwP?ve4;ct^TAiJSym@#RP`$5w%Yuu1?plO&t{UGOJ7HOC{{UPUL zCh?oOnUDwJ>7<4kgr5ZC$xk-q;XobF{02ZC3DogoP#)y-fI1Z-orYO95b{{0(=f}< zfjnM*M^gmUG1txoUkubS*9ss{2I_dfaX93uKpnr#8VPwiP^TG)&F>hV2YD7^Ycw0E z<1Ik`{mopUj(7RSLoNa8REiul%=rnB%P^xg%>9XwE0B+d`9B%*0_3C7LZFW4u+t%5 z2-NYLkeQGd19e)0d^D^Pvmq}-ZW>(-)M+_#)2IrlJYQK%K6{GeQmP&P9-Gkf(;H#fu@YMV=a->@9^HM4lR+9$yT3 zJ@Uk_AAmZZ@~(h<6;Q{DbqVAMP{;G-%OKYSb*y4nKyCo)6hodGeu1(YawGE8s0pa! z&9MOFEkGU5l4~Jf4bbJqXnCJEJDZKLYCX5c1dP$3PvwINA#NQJ_wbp%nOy z1yH9$Cf3e@pSpuLd)8>rLY@D7tkp96LJJAP@V(HB6SH0@iEb)Zf*?c0#; zK+HSsPRLFm=AHH($Sxq}opv{54^YRiiM|K9KTxL(tqpP}P^Tg3lRfm{H@oYfwKJRFEQ zs~v(o5{NmAH)k+sfta(}Q;&j;%GMb&GND}g#)sJ#LCA|Ph2_9o=TK+Ih2ZOBW3I(~EY z8_3InI#p@ikgI_@tCE9zCF9qs!nf6=Amjlnk>U2JRg1%m%*%SP&Q0nmr ze!u2SA@*u*_|EZ6uWw~D*VFF`q~u>6CXYL`t@zgIOl}tc-1Q863B7wD$Pz}CYtEg|P z3&oUHTFc2&=*DOa+M;m05vTc0^|dvVXk{SM6sm4QMo`Mbk|Yq@3I(O1Ig6vgrbuWm zRW-#ogy#ifWzqV^SfI8sUQ}L5Ra@hYp}L~VrL;cOxW+1NC^jEdyf?*OWsxu{WI80Z zYAouTxh!keAm>`DlpGgD*M}i54#nev^`Xl8by3C43)F60(VF*JuEN0VY@N`VYx z*lbVJyVA&Cg(-{HHAL%CI;AfUHAG`dQB^IAMj|0;qj=GRP<<%IrK=1Y^$!|#HZ-%y z2AR~j4Ww#F#Z6?&XSATQrc^=YVw6~!EoDxMBieTE#x-lWh472=`QcC`NOP=)?ro|J z_U5ee_BN>k_co*yp|6l;S$ij37Kq2UpyPU576-zSvs;&;^+UZAT@sCLtY~gP--PP> zvabxs!C`=aNEBcUaMx;_#}Q}k^zrfA=`s!%<~Yu`3&4EAj<4>X3#Vj*Df z;#bC3#6zV`jnS&`)qR*3#KOUq;n0?|dt4F@Hg4!0x1tWc(3>{;^DIU#=loc-u6MGk zranmSXP$KRz5Oq43Pi%|!nLvl_BL}y)zRKOM=T8nV^}zP8?8p}!zO+Dr4Cq)oBB++ z_9`q5y>sItT63efxh&dL-$$zIXk#F97TdCD!!oQ)y<=6?H8vRi(zm@V8t)?&!Y%C6 zkPO$iy&8Y#v3DWnMT1*=v)l^hp-6ahDAwD`i=R2qWmU8kwxq5CV(mdJ2sKu3Z3xZV zic3`}Qd!>^imeOOhGa>W6~YL}YX!l#DiqtyA_uOlk2eOeMvyV3ER}6NR}qPE24!5K zs&G-orK!g?%Hrh0WNFqQ2*oVU=&ht`UV=;}c|oVj@^HK%8t03IF-4=N+?0b?SWJ@F} zUsaRKuVkKFag8|E0xVW*wp+=2GP1^?HO>8wYFt`^%>peCt;c>U6yv6*+Gzc{@cO1$ z2sehyW!BDWY z5q~0PZ4($S9{MOII}muLm@KCiykW95#NsS?>?ApJ(Q(b*hH`8tzuqUf_*h2F*n@Xqo>#7$>WA$iBpgO@V&U{Y4)9=x$K_oU3#xd&_9CiI}BpjDwjtagK{P_j6ww3H^5NGVJz zt*#O&0eO7My-KQ^aYZt6Ouc7PjO3=|l#CQ(z;*Yh$e1jpueTok_USPEOP)s=GanXltgJRY&K)fH1x zOWv)@;$%%kNz`K#ED3uueNN!=Py=7*>T9=F*7MF3E3P^9mxtD=+gRLZ8ylkJoh_}2 z_o9qZwzNTlEQuzcOoW2G0WkQ|*m^vDsBh#&GldNXjeSNV@;4i-Ix4l`=7PxA1Y^kY zJf=!xRS>y697EBgG1LJT#`1;Th*L8|zDnJReaY&}6jlk=8QZ9iG# zr%9UwEEREw0OhneS|4UrEg9wE!1{XJOoVIWCS_hOc-Hc+MU^3LZJjK_*nX(xKF;}@ z-5(B#$^%6N+~4B{C=}#f7c%PgaLT$K$H}~e^QAAIa;YoBicwl0h-{6AlMyf=1G1XM zi;R;MJ87|~qSQ4%8G~EfctqB>y(neL?kiQF<|1pU>nll$kvE>n!B6IZw+fxCM-g`} zqMbR}6=AJFmWw&Ydpn?~td+gz@)gJGDf@_C+4PQ|T!O3tt7cJ(?^j*wib~hUr5pHx zsW}vrImjq7E;+I&RmRIAfq0xMd0T>t*5ZO~t=H;7g0*6sdarS3wQ|wCrZ^^CJkCpf zZQL3XmV?FoL(d|0EBK{Bdiz*2z}TT1m9Z|Iaj8p+$_sPPYpdaMCWoFrlai$JP(*_A zy-QP^q-~Xq%HsJAt--(IaMeGoOn8H$+% zsT7|%NL7jyQ|&Wh;TV2mZVLQ4{T#d2Zw%g$3F6zD2+_n!e8bxS2~RNasmFK80er&v zuD2fFbvHw1Hm;aB(PaL{`=3lhwO@PVS0m?mmpr|_`L>UKTYMYY{hH>o`AKs?@OoLz z5OJp9V#XmE`cTrH8F(MU8}=aodnXhJ$pJ7l@PV z;S1L6@V?@i<@(W6TW5@Z`=J`NIlfEeFG%qo3V?MxfBR_1kFLn>Vc>5wH8i))ImDqm z@xROI9N@i7bLr0hHm5g?&!#kCyy1SRuGxRm7AYNQxNNdHeU11u=+41*Ct9E3Te?%X zJH3fhtaNy|%~TELyIUSM4jC#ARLSMy#$BQLay)+Y01LjsXusrXL>fG}gf1i$0f}|r z2qf;$u>crq9MBtPag&IfI4)9o!)}$#8%{T}QUj7{t9qGiN*SP8Vof33#dr|_?n8+S zm$){=EO((er^ExM%Q(|zoUevmaAKEnzQhkrmtxbU*cW6MoY0Nzzm~g))A^gH6`_@?GjgnFj%vrtkNjMm!ViyJyj{|JcZRo8$RRfwczFyN zO~l{j#(!9@H7XKiY_NFRq$$%TPnk9?P&+BGc1B>v#OaemlY+Iy(`QbdQXHHyxp>mL z>BY5pBM&dd2%@+swQ=MNNp5Rr<&dv%@E4Ww$64XRmB(8sw0k4}0JB=}kNtUc%i^X; zV;JASgK$^YZ@@Q~xV2%oMfh`*|Hut_CnR%Jj#nWaIjBF=&H2eO0&}V3K*t>&_xL-W z?l|1>WXGY7Bb_@t9@cJ$T{(@zUxw`XPRFwykHLP#U)Xtb$KfJ>$8#Oec3#iEqs7ly z&+rxwrFVR<YO& zSI7Nq>7!Jt=udXGNPxo}6Gb|NocDfdse;MsNgK3rMLK@sN3kF7cmy@u*?FTjC+Tz^ zMqS5UQf#zR=WZ1JX;kt$$a_=$MrxGXaSwt$Cy^etiqoSZB+G9iJu>BnMEN^!LL)q^ zH7Bzy(8$;EZ4~D*Zb^I|#pmf%kAZlds^ebN_GzTwnOa}5+ztO{Iu3OvH2!mQsxu|) zJ35}}+UWJtS-e*;Ps1b`|Zvwr1g6Ev|R2Q$s zVje2u=c~r?#YjXsvq^e}`Rjgyo*2689GCaIe9~2uW29Ye4QeA}Mzw;y@4EPhfEJo4Sqg3d3uCACX$crx^7% z{+ojLZ_x%+j$gNHctb5JcQ2gBR@5jU_dOiH3h%DQ@iuN4ZyIwM*^}>wxIDEuBA8#jN`*jxiB;X~ouu^X9*#%`L|FWHFor zXv1U;{&D%OyFR?tjkjMB5#P~C6s~In+JkGd9&ONw{QdY;OP)&=&n?b*n)PRm?;5{K z+a>ch`e7MjMsXL~ByF3l#aD^N|L(^Gl)q<;Gg~m(eq)hOF-^nUpHqO71*f6xwO|4m z9W#J4(B9Kw3xNy5QVeY--f^4)DG2LioF`$dPRAKrBpfrO|4Pwkaipq4oCsRbj}hLp eCzIvi{`?mm3FF@kJz!3_e^J=~ALjp#7WkjOW`Mr{ diff --git a/SushiBar/ImplementationExtensions/SushiBarDataModels.dll b/SushiBar/ImplementationExtensions/SushiBarDataModels.dll deleted file mode 100644 index 302d4ae1fec0fda8c2aeb84803bf9026c1792123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 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 Wqs9E+xK36!+{bY7|1ST#75Eo-VoSIH diff --git a/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll b/SushiBar/ImplementationExtensions/SushiBarDatabaseImplement.dll deleted file mode 100644 index ca5f775d5b312a54d7106c88b34614d2b8406ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76288 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 diff --git a/SushiBar/ImplementationExtensions/SushiBarListImplement.dll b/SushiBar/ImplementationExtensions/SushiBarListImplement.dll deleted file mode 100644 index 85ece57ef27e350e9d131533b3c1a2b89c9e6a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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 ZxZ(%5^B=kT)!&S6;o