From 84fc67c08a27e2f6edd019be624f15e9224c7864 Mon Sep 17 00:00:00 2001
From: "Nikolaeva_Y.A" <niko020577@mail.ru>
Date: Tue, 14 Mar 2023 15:53:33 +0400
Subject: [PATCH] =?UTF-8?q?=D0=92=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D0=BB?=
 =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD=D0=B0?=
 =?UTF-8?q?=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 SoftwareInstallation/SoftwareInstallation.sln |   6 +
 .../DataFileSingleton.cs                      |  56 +++++++++
 .../Implements/ComponentStorage.cs            |  89 +++++++++++++++
 .../Implements/OrderStorage.cs                |  90 +++++++++++++++
 .../Implements/PackageStorage.cs              |  89 +++++++++++++++
 .../Models/Component.cs                       |  66 +++++++++++
 .../Models/Order.cs                           | 107 ++++++++++++++++++
 .../Models/Package.cs                         |  93 +++++++++++++++
 .../SoftwareInstallationFileImplement.csproj  |  14 +++
 .../SoftwareInstallationView/Program.cs       |   2 +-
 .../SoftwareInstallationView.csproj           |   1 +
 11 files changed, 612 insertions(+), 1 deletion(-)
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/DataFileSingleton.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Implements/ComponentStorage.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Implements/OrderStorage.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Implements/PackageStorage.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Models/Component.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Models/Order.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/Models/Package.cs
 create mode 100644 SoftwareInstallation/SoftwareInstallationFileImplement/SoftwareInstallationFileImplement.csproj

diff --git a/SoftwareInstallation/SoftwareInstallation.sln b/SoftwareInstallation/SoftwareInstallation.sln
index 463570b..b9e0574 100644
--- a/SoftwareInstallation/SoftwareInstallation.sln
+++ b/SoftwareInstallation/SoftwareInstallation.sln
@@ -13,6 +13,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoftwareInstallationListImp
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoftwareInstallationView", "SoftwareInstallationView\SoftwareInstallationView.csproj", "{E91EF595-BDEC-4005-A9F2-BBF8ADB5AF7F}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoftwareInstallationFileImplement", "SoftwareInstallationFileImplement\SoftwareInstallationFileImplement.csproj", "{B9005716-5A66-4DF8-AE5F-B5A5D4C6DD71}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -39,6 +41,10 @@ Global
 		{E91EF595-BDEC-4005-A9F2-BBF8ADB5AF7F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{E91EF595-BDEC-4005-A9F2-BBF8ADB5AF7F}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{E91EF595-BDEC-4005-A9F2-BBF8ADB5AF7F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B9005716-5A66-4DF8-AE5F-B5A5D4C6DD71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B9005716-5A66-4DF8-AE5F-B5A5D4C6DD71}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B9005716-5A66-4DF8-AE5F-B5A5D4C6DD71}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B9005716-5A66-4DF8-AE5F-B5A5D4C6DD71}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/DataFileSingleton.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/DataFileSingleton.cs
new file mode 100644
index 0000000..b1bf78c
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/DataFileSingleton.cs
@@ -0,0 +1,56 @@
+using SoftwareInstallationFileImplement.Models;
+using System.Xml.Linq;
+
+namespace SoftwareInstallationFileImplement
+{
+    internal class DataFileSingleton
+    {
+        private static DataFileSingleton? instance;
+
+        private readonly string ComponentFileName = "Component.xml";
+        private readonly string OrderFileName = "Order.xml";
+        private readonly string PackageFileName = "Package.xml";
+
+        public List<Component> Components { get; private set; }
+        public List<Order> Orders { get; private set; }
+        public List<Package> Packages { get; private set; }
+
+        public static DataFileSingleton GetInstance()
+        {
+            if (instance == null)
+            {
+                instance = new DataFileSingleton();
+            }
+            return instance;
+        }
+
+        public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement);
+        public void SavePackages() => SaveData(Packages, PackageFileName, "Packages", x => x.GetXElement);
+        public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
+
+        private DataFileSingleton()
+        {
+            Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
+            Packages = LoadData(PackageFileName, "Package", x => Package.Create(x)!)!;
+            Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
+        }
+
+        private static List<T>? LoadData<T>(string filename, string xmlNodeName, Func<XElement, T> selectFunction)
+        {
+            if (File.Exists(filename))
+            {
+                return XDocument.Load(filename)?.Root?.Elements(xmlNodeName)?.Select(selectFunction)?.ToList();
+            }
+
+            return new List<T>();
+        }
+
+        private static void SaveData<T>(List<T> data, string filename, string xmlNodeName, Func<T, XElement> selectFunction)
+        {
+            if (data != null)
+            {
+                new XDocument(new XElement(xmlNodeName, data.Select(selectFunction).ToArray())).Save(filename);
+            }
+        }
+    }
+}
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/ComponentStorage.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/ComponentStorage.cs
new file mode 100644
index 0000000..04bb3a1
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/ComponentStorage.cs
@@ -0,0 +1,89 @@
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.SearchModels;
+using SofrwareInstallationContracts.StoragesContracts;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationFileImplement.Models;
+
+namespace SoftwareInstallationFileImplement.Implements
+{
+    public class ComponentStorage : IComponentStorage
+    {
+        private readonly DataFileSingleton source;
+
+        public ComponentStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+
+        public ComponentViewModel? Delete(ComponentBindingModel model)
+        {
+            var element = source.Components.FirstOrDefault(x => x.Id == model.Id);
+
+            if (element != null)
+            {
+                source.Components.Remove(element);
+                source.SaveComponents();
+
+                return element.GetViewModel;
+            }
+
+            return null;
+        }
+
+        public ComponentViewModel? GetElement(ComponentSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.ComponentName) && !model.Id.HasValue)
+            {
+                return null;
+            }
+
+            return source.Components.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ComponentName) && x.ComponentName == model.ComponentName) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
+        }
+
+        public List<ComponentViewModel> GetFilteredList(ComponentSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.ComponentName))
+            {
+                return new();
+            }
+
+            return source.Components.Where(x => x.ComponentName.Contains(model.ComponentName)).Select(x => x.GetViewModel).ToList();
+        }
+
+        public List<ComponentViewModel> GetFullList()
+        {
+            return source.Components.Select(x => x.GetViewModel).ToList();
+        }
+
+        public ComponentViewModel? Insert(ComponentBindingModel model)
+        {
+            model.Id = source.Components.Count > 0 ? source.Components.Max(x => x.Id) + 1 : 1;
+            var newComponent = Component.Create(model);
+
+            if (newComponent == null)
+            {
+                return null;
+            }
+
+            source.Components.Add(newComponent);
+            source.SaveComponents();
+
+            return newComponent.GetViewModel;
+        }
+
+        public ComponentViewModel? Update(ComponentBindingModel model)
+        {
+            var component = source.Components.FirstOrDefault(x => x.Id == model.Id);
+
+            if (component == null)
+            {
+                return null;
+            }
+
+            component.Update(model);
+            source.SaveComponents();
+
+            return component.GetViewModel;
+        }
+    }
+}
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/OrderStorage.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/OrderStorage.cs
new file mode 100644
index 0000000..2eef2aa
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/OrderStorage.cs
@@ -0,0 +1,90 @@
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.SearchModels;
+using SofrwareInstallationContracts.StoragesContracts;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationFileImplement.Models;
+
+namespace SoftwareInstallationFileImplement.Implements
+{
+    public class OrderStorage : IOrderStorage
+    {
+        private readonly DataFileSingleton source;
+
+        public OrderStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+
+        public OrderViewModel? Delete(OrderBindingModel model)
+        {
+            var element = source.Orders.FirstOrDefault(x => x.Id == model.Id);
+
+            if (element != null)
+            {
+                source.Orders.Remove(element);
+                source.SaveOrders();
+
+                return element.GetViewModel;
+            }
+
+            return null;
+        }
+
+        public OrderViewModel? GetElement(OrderSearchModel model)
+        {
+            if (!model.Id.HasValue)
+            {
+                return null;
+            }
+
+            return source.Orders.FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
+        }
+
+        public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
+        {
+            if (!model.Id.HasValue)
+            {
+                return new();
+            }
+
+            return source.Orders.Where(x => x.Id == model.Id).Select(x => x.GetViewModel).ToList();
+        }
+
+        public List<OrderViewModel> GetFullList()
+        {
+            return source.Orders.Select(x => x.GetViewModel).ToList();
+        }
+
+        public OrderViewModel? Insert(OrderBindingModel model)
+        {
+            model.Id = source.Orders.Count > 0 ? source.Orders.Max(x => x.Id) + 1 : 1;
+            var newOrder = Order.Create(model);
+
+            if (newOrder == null)
+            {
+                return null;
+            }
+
+            source.Orders.Add(newOrder);
+            source.SaveOrders();
+
+            return newOrder.GetViewModel;
+        }
+
+        public OrderViewModel? Update(OrderBindingModel model)
+        {
+            var order = source.Orders.FirstOrDefault(x => x.Id == model.Id);
+
+            if (order == null)
+            {
+                return null;
+            }
+
+            order.Update(model);
+            source.SaveOrders();
+
+            return order.GetViewModel;
+        }
+    }
+}
+
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/PackageStorage.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/PackageStorage.cs
new file mode 100644
index 0000000..5c6ab40
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Implements/PackageStorage.cs
@@ -0,0 +1,89 @@
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.SearchModels;
+using SofrwareInstallationContracts.StoragesContracts;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationFileImplement.Models;
+
+namespace SoftwareInstallationFileImplement.Implements
+{
+    public class PackageStorage : IPackageStorage
+    {
+        private readonly DataFileSingleton source;
+
+        public PackageStorage()
+        {
+            source = DataFileSingleton.GetInstance();
+        }
+
+        public PackageViewModel? Delete(PackageBindingModel model)
+        {
+            var element = source.Packages.FirstOrDefault(x => x.Id == model.Id);
+
+            if (element != null)
+            {
+                source.Packages.Remove(element);
+                source.SavePackages();
+
+                return element.GetViewModel;
+            }
+
+            return null;
+        }
+
+        public PackageViewModel? GetElement(PackageSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.PackageName) && !model.Id.HasValue)
+            {
+                return null;
+            }
+
+            return source.Packages.FirstOrDefault(x => (!string.IsNullOrEmpty(model.PackageName) && x.PackageName == model.PackageName) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
+        }
+
+        public List<PackageViewModel> GetFilteredList(PackageSearchModel model)
+        {
+            if (string.IsNullOrEmpty(model.PackageName))
+            {
+                return new();
+            }
+
+            return source.Packages.Where(x => x.PackageName.Contains(model.PackageName)).Select(x => x.GetViewModel).ToList();
+        }
+
+        public List<PackageViewModel> GetFullList()
+        {
+            return source.Packages.Select(x => x.GetViewModel).ToList();
+        }
+
+        public PackageViewModel? Insert(PackageBindingModel model)
+        {
+            model.Id = source.Packages.Count > 0 ? source.Packages.Max(x => x.Id) + 1 : 1;
+            var newPackage = Package.Create(model);
+
+            if (newPackage == null)
+            {
+                return null;
+            }
+
+            source.Packages.Add(newPackage);
+            source.SavePackages();
+
+            return newPackage.GetViewModel;
+        }
+
+        public PackageViewModel? Update(PackageBindingModel model)
+        {
+            var package = source.Packages.FirstOrDefault(x => x.Id == model.Id);
+
+            if (package == null)
+            {
+                return null;
+            }
+
+            package.Update(model);
+            source.SavePackages();
+
+            return package.GetViewModel;
+        }
+    }
+}
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Component.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Component.cs
new file mode 100644
index 0000000..bf0a97a
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Component.cs
@@ -0,0 +1,66 @@
+using System.Xml.Linq;
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationDataModels.Models;
+
+namespace SoftwareInstallationFileImplement.Models
+{
+    public class Component : IComponentModel
+    {
+        public string ComponentName { get; private set; } = string.Empty;
+
+        public double Cost { get; set; }
+
+        public int Id { get; private set; }
+
+        public static Component? Create(ComponentBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Component()
+            {
+                Id = model.Id,
+                ComponentName = model.ComponentName,
+                Cost = model.Cost
+            };
+        }
+
+        public static Component? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new Component()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                ComponentName = element.Element("ComponentName")!.Value,
+                Cost = Convert.ToDouble(element.Element("Cost")!.Value)
+            };
+        }
+
+        public void Update(ComponentBindingModel model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            ComponentName = model.ComponentName;
+            Cost = model.Cost;
+        }
+
+        public ComponentViewModel GetViewModel => new()
+        {
+            Id = Id,
+            ComponentName = ComponentName,
+            Cost = Cost
+        };
+
+        public XElement GetXElement => new("Component",
+            new XAttribute("Id", Id),
+            new XElement("ComponentName", ComponentName),
+            new XElement("Cost", Cost.ToString()));
+    }
+}
\ No newline at end of file
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Order.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Order.cs
new file mode 100644
index 0000000..94d8179
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Order.cs
@@ -0,0 +1,107 @@
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationDataModels.Enums;
+using SoftwareInstallationDataModels.Models;
+using System.Xml.Linq;
+
+namespace SoftwareInstallationFileImplement.Models
+{
+    public class Order : IOrderModel
+    {
+        public int PackageId { get; private set; }
+
+        public string PackageName { get; private set; } = string.Empty;
+
+        public int Count { get; private set; }
+
+        public double Sum { get; private set; }
+
+        public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен;
+
+        public DateTime DateCreate { get; private set; } = DateTime.Now;
+
+        public DateTime? DateImplement { get; private set; }
+
+        public int Id { get; private set; }
+
+        public static Order? Create(OrderBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Order()
+            {
+                Id = model.Id,
+                PackageId = model.PackageId,
+                PackageName = model.PackageName,
+                Count = model.Count,
+                Sum = model.Sum,
+                Status = model.Status,
+                DateCreate = model.DateCreate,
+                DateImplement = model.DateImplement
+            };
+        }
+
+        public static Order? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+
+            var order = new Order()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                PackageId = Convert.ToInt32(element.Element("PackageId")!.Value),
+                PackageName = element.Element("PackageName")!.Value,
+                Count = Convert.ToInt32(element.Element("Count")!.Value),
+                Sum = Convert.ToDouble(element.Element("Sum")!.Value),
+                Status = (OrderStatus)Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value),
+                DateCreate = DateTime.ParseExact(element.Element("DateCreate")!.Value, "G", null)
+            };
+
+            DateTime.TryParse(element.Element("DateImplement")!.Value, out DateTime dateImpl);
+            order.DateImplement = dateImpl;
+
+            return order;
+        }
+
+        public void Update(OrderBindingModel model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            PackageId = model.PackageId;
+            PackageName = model.PackageName;
+            Count = model.Count;
+            Sum = model.Sum;
+            Status = model.Status;
+            DateCreate = model.DateCreate;
+            DateImplement = model.DateImplement;
+        }
+
+        public OrderViewModel GetViewModel => new()
+        {
+            Id = Id,
+            PackageId = PackageId,
+            PackageName = PackageName,
+            Count = Count,
+            Sum = Sum,
+            Status = Status,
+            DateCreate = DateCreate,
+            DateImplement = DateImplement
+        };
+
+        public XElement GetXElement => new("Order",
+            new XAttribute("Id", Id),
+            new XElement("PackageName", PackageName),
+            new XElement("PackageId", PackageId.ToString()),
+            new XElement("Count", Count.ToString()),
+            new XElement("Sum", Sum.ToString()),
+            new XElement("Status", Status.ToString()),
+            new XElement("DateCreate", DateCreate.ToString()),
+            new XElement("DateImplement", DateImplement.ToString()));
+    }
+}
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Package.cs b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Package.cs
new file mode 100644
index 0000000..7123acc
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/Models/Package.cs
@@ -0,0 +1,93 @@
+using SofrwareInstallationContracts.BindingModels;
+using SofrwareInstallationContracts.ViewModels;
+using SoftwareInstallationDataModels.Models;
+using System.Xml.Linq;
+
+namespace SoftwareInstallationFileImplement.Models
+{
+    public class Package : IPackageModel
+    {
+        public string PackageName { get; private set; } = string.Empty;
+
+        public double Price { get; private set; }
+
+        public Dictionary<int, int> Components { get; private set; } = new();
+
+        public Dictionary<int, (IComponentModel, int)> _packageComponents = null;
+
+        public Dictionary<int, (IComponentModel, int)> PackageComponents
+        {
+            get
+            {
+                if (_packageComponents == null)
+                {
+                    var source = DataFileSingleton.GetInstance();
+                    _packageComponents = Components.ToDictionary(x => x.Key, y => ((source.Components.FirstOrDefault(z => z.Id == y.Key) as IComponentModel)!, y.Value));
+                }
+                return _packageComponents;
+            }
+        }
+
+        public int Id { get; private set; }
+
+        public static Package? Create(PackageBindingModel model)
+        {
+            if (model == null)
+            {
+                return null;
+            }
+            return new Package()
+            {
+                Id = model.Id,
+                PackageName = model.PackageName,
+                Price = model.Price,
+                Components = model.PackageComponents.ToDictionary(x => x.Key, x => x.Value.Item2)
+
+            };
+        }
+
+        public static Package? Create(XElement element)
+        {
+            if (element == null)
+            {
+                return null;
+            }
+            return new Package()
+            {
+                Id = Convert.ToInt32(element.Attribute("Id")!.Value),
+                PackageName = element.Element("PackageName")!.Value,
+                Price = Convert.ToDouble(element.Element("Price")!.Value),
+                Components = element.Element("PackageComponents")!.Elements("PackageComponent").ToDictionary(x => Convert.ToInt32(x.Element("Key")?.Value), x => Convert.ToInt32(x.Element("Value")?.Value))
+            };
+        }
+
+        public void Update(PackageBindingModel model)
+        {
+            if (model == null)
+            {
+                return;
+            }
+            PackageName = model.PackageName;
+            Price = model.Price;
+            Components = model.PackageComponents.ToDictionary(x => x.Key, x => x.Value.Item2);
+            _packageComponents = null;
+        }
+
+        public PackageViewModel GetViewModel => new()
+        {
+            Id = Id,
+            PackageName = PackageName,
+            Price = Price,
+            PackageComponents = PackageComponents
+        };
+
+        public XElement GetXElement => new("Package",
+            new XAttribute("Id", Id),
+            new XElement("PackageName", PackageName),
+            new XElement("Price", Price.ToString()),
+            new XElement("PackageComponents", Components.Select(x =>
+                new XElement("PackageComponent",
+                new XElement("Key", x.Key),
+                new XElement("Value", x.Value))).ToArray()));
+    }
+}
diff --git a/SoftwareInstallation/SoftwareInstallationFileImplement/SoftwareInstallationFileImplement.csproj b/SoftwareInstallation/SoftwareInstallationFileImplement/SoftwareInstallationFileImplement.csproj
new file mode 100644
index 0000000..c53b4c7
--- /dev/null
+++ b/SoftwareInstallation/SoftwareInstallationFileImplement/SoftwareInstallationFileImplement.csproj
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0-windows</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\SofrwareInstallationContracts\SofrwareInstallationContracts.csproj" />
+    <ProjectReference Include="..\SoftwareInstallationDataModels\SoftwareInstallationDataModels.csproj" />
+  </ItemGroup>
+
+</Project>
\ No newline at end of file
diff --git a/SoftwareInstallation/SoftwareInstallationView/Program.cs b/SoftwareInstallation/SoftwareInstallationView/Program.cs
index dea922a..2d96035 100644
--- a/SoftwareInstallation/SoftwareInstallationView/Program.cs
+++ b/SoftwareInstallation/SoftwareInstallationView/Program.cs
@@ -2,7 +2,7 @@ using SoftwareInstallationBusinessLogic.BusinessLogic;
 using Microsoft.Extensions.DependencyInjection;
 using SofrwareInstallationContracts.BusinessLogicsContracts;
 using SofrwareInstallationContracts.StoragesContracts;
-using SoftwareInstallationListImplement.Implements;
+using SoftwareInstallationFileImplement.Implements;
 using Microsoft.Extensions.Logging;
 using NLog.Extensions.Logging;
 
diff --git a/SoftwareInstallation/SoftwareInstallationView/SoftwareInstallationView.csproj b/SoftwareInstallation/SoftwareInstallationView/SoftwareInstallationView.csproj
index e38cf83..9646c3b 100644
--- a/SoftwareInstallation/SoftwareInstallationView/SoftwareInstallationView.csproj
+++ b/SoftwareInstallation/SoftwareInstallationView/SoftwareInstallationView.csproj
@@ -38,6 +38,7 @@
   <ItemGroup>
     <ProjectReference Include="..\SofrwareInstallationContracts\SofrwareInstallationContracts.csproj" />
     <ProjectReference Include="..\SoftwareInstallationBusinessLogic\SoftwareInstallationBusinessLogic.csproj" />
+    <ProjectReference Include="..\SoftwareInstallationFileImplement\SoftwareInstallationFileImplement.csproj" />
     <ProjectReference Include="..\SoftwareInstallationListImplement\SoftwareInstallationListImplement.csproj" />
   </ItemGroup>
 
-- 
2.25.1