using RestaurantContracts.BindingModels; using RestaurantContracts.BusinessLogicsContracts; using RestaurantContracts.StoragesContracts; using RestaurantDataModels; 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 RestaurantBusinessLogic.BusinessLogics { public class BackUpLogic : IBackUpLogic { private readonly IBackUpInfo _backUpInfo; public BackUpLogic(IBackUpInfo backUpInfo) { _backUpInfo = backUpInfo; } public void CreateBackUp(BackUpBindingModel model) { if (_backUpInfo == null) { return; } try { var dirInfo = new DirectoryInfo(model.FolderName); if (dirInfo.Exists) { foreach (var file in dirInfo.GetFiles()) { file.Delete(); } } string fileName = $"{model.FolderName}.zip"; if (File.Exists(fileName)) { File.Delete(fileName); } 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); 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}"); } // вызываем метод на выполнение method?.MakeGenericMethod(modelType).Invoke(this, new object[] { model.FolderName }); } } // архивируем 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) { 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); } } }