ToolPack1

Для модуля синглтона: убран статичный провайдер. Вместо него

1/7/2020 10:52:16 PM

Changes

Details

diff --git a/Build/RW_Tool.Core.dll b/Build/RW_Tool.Core.dll
index b35200a..514f626 100644
Binary files a/Build/RW_Tool.Core.dll and b/Build/RW_Tool.Core.dll differ
diff --git a/Build/RW_Tool.Core.pdb b/Build/RW_Tool.Core.pdb
index 67a7aee..bac7583 100644
Binary files a/Build/RW_Tool.Core.pdb and b/Build/RW_Tool.Core.pdb differ
diff --git a/Build/RW_Tool.DataSource.FileOrStream.dll b/Build/RW_Tool.DataSource.FileOrStream.dll
index dd6f715..6a24ba9 100644
Binary files a/Build/RW_Tool.DataSource.FileOrStream.dll and b/Build/RW_Tool.DataSource.FileOrStream.dll differ
diff --git a/Build/RW_Tool.DataSource.FileOrStream.pdb b/Build/RW_Tool.DataSource.FileOrStream.pdb
index 6444371..71d15aa 100644
Binary files a/Build/RW_Tool.DataSource.FileOrStream.pdb and b/Build/RW_Tool.DataSource.FileOrStream.pdb differ
diff --git a/Build/RW_Tool.XML_BIN.dll b/Build/RW_Tool.XML_BIN.dll
index e435435..8092808 100644
Binary files a/Build/RW_Tool.XML_BIN.dll and b/Build/RW_Tool.XML_BIN.dll differ
diff --git a/Build/RW_Tool.XML_BIN.pdb b/Build/RW_Tool.XML_BIN.pdb
index 6517374..e3fc737 100644
Binary files a/Build/RW_Tool.XML_BIN.pdb and b/Build/RW_Tool.XML_BIN.pdb differ
diff --git a/Build/Tools.ConfigurationTool.dll b/Build/Tools.ConfigurationTool.dll
index e6205be..0f1d526 100644
Binary files a/Build/Tools.ConfigurationTool.dll and b/Build/Tools.ConfigurationTool.dll differ
diff --git a/Build/Tools.ConfigurationTool.pdb b/Build/Tools.ConfigurationTool.pdb
index ad03055..205adf2 100644
Binary files a/Build/Tools.ConfigurationTool.pdb and b/Build/Tools.ConfigurationTool.pdb differ
diff --git a/Build/Tools.SimpleBenchmark.dll b/Build/Tools.SimpleBenchmark.dll
index 6a4489e..81f0b0f 100644
Binary files a/Build/Tools.SimpleBenchmark.dll and b/Build/Tools.SimpleBenchmark.dll differ
diff --git a/Build/Tools.SimpleBenchmark.pdb b/Build/Tools.SimpleBenchmark.pdb
index 3e1a59c..a94fcb9 100644
Binary files a/Build/Tools.SimpleBenchmark.pdb and b/Build/Tools.SimpleBenchmark.pdb differ
diff --git a/Build/Tools.SingletonTool.dll b/Build/Tools.SingletonTool.dll
index 5664226..bfd9e96 100644
Binary files a/Build/Tools.SingletonTool.dll and b/Build/Tools.SingletonTool.dll differ
diff --git a/Build/Tools.SingletonTool.pdb b/Build/Tools.SingletonTool.pdb
index 217bf60..b435563 100644
Binary files a/Build/Tools.SingletonTool.pdb and b/Build/Tools.SingletonTool.pdb differ
diff --git a/ToolPack1/RW_Tool/RW_Tool.Core/Abstract/I_RW_Service.cs b/ToolPack1/RW_Tool/RW_Tool.Core/Abstract/I_RW_Service.cs
new file mode 100644
index 0000000..5c85648
--- /dev/null
+++ b/ToolPack1/RW_Tool/RW_Tool.Core/Abstract/I_RW_Service.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace RW_Tool.Core.Abstract
+{
+    /// <summary>
+    /// Интерфейс для обертки для чтения/записи какой либо сущности в какое либо хранилище
+    /// </summary>
+    /// <typeparam name="T1">Тип с данными</typeparam>
+    /// <typeparam name="T2">Тип спараметрами</typeparam>
+    public interface I_RW_Service <T1,T2>
+    {
+        T1 Read(T2 param);
+        T1 Read();
+
+        void Write(T1 entity, T2 param);
+        void Write(T1 entity);
+    }
+}
diff --git a/ToolPack1/RW_Tool/RW_Tool.Core/RW_Custom_Service.cs b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Custom_Service.cs
new file mode 100644
index 0000000..88dc210
--- /dev/null
+++ b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Custom_Service.cs
@@ -0,0 +1,79 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using RW_Tool.Core.Abstract;
+
+namespace RW_Tool.Core
+{
+    /// <summary>
+    /// Обертка для чтения/записи какой либо сущности в какое либо хранилище
+    /// с использованием промежуточной сущности T3
+    /// </summary>
+    /// <typeparam name="T1">Тип сущности</typeparam>
+    /// <typeparam name="T2">Параметры</typeparam>
+    /// <typeparam name="T3">Тип сериализуемой сущности</typeparam>
+    public class RW_Custom_Service<T1,T2,T3>:
+        I_RW_Service<T1, T2>
+        where T3 : new()
+    {
+        public T2 DataStorage { protected set; get; }
+        public bool HaveDataStorage => DataStorage != null;
+
+        public ITransformator<T1, T3> Transformator { protected set; get; }
+
+
+        public readonly IReader<T3, T2> Reader;
+        public bool HaveReader => Reader != null;
+
+        public readonly IWriter<T3, T2> Writer;
+        public bool HaveWriter => Writer != null;
+
+
+
+        public RW_Custom_Service(
+            ITransformator<T1, T3> Transformator,
+            IReader<T3, T2> Reader,
+            IWriter<T3, T2> Writer
+            )
+        {
+            this.Transformator = Transformator;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+        public RW_Custom_Service(
+            T2 ds,
+            ITransformator<T1, T3> Transformator,
+            IReader<T3, T2> Reader,
+            IWriter<T3, T2> Writer
+            )
+        {
+            DataStorage = ds;
+            this.Transformator = Transformator;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+
+
+        public T1 Read(T2 param)
+        {
+            if (!HaveReader)
+                throw new Exception();
+
+            T3 serial_entity = Reader.Read(param);
+            return Transformator.ToEntityT1(serial_entity);            
+        }
+        public T1 Read() => Read(DataStorage);
+
+        public void Write(T1 entity, T2 param)
+        {
+            if (!HaveWriter)
+                throw new Exception();
+
+            T3 serial_entity = Transformator.ToEntityT2(entity);
+            Writer.Write(serial_entity, param);             
+        }
+        public void Write(T1 entity) => Write(entity, DataStorage);
+    }
+}
diff --git a/ToolPack1/RW_Tool/RW_Tool.Core/RW_Service.cs b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Service.cs
new file mode 100644
index 0000000..a2f2958
--- /dev/null
+++ b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Service.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using RW_Tool.Core.Abstract;
+
+namespace RW_Tool.Core
+{
+    /// <summary>
+    /// Обертка для чтения/записи какой либо сущности в какое либо хранилище
+    /// </summary>
+    /// <typeparam name="T1">Сущность</typeparam>
+    /// <typeparam name="T2">Набор параметров</typeparam>
+    public class RW_Service<T1,T2> :
+        I_RW_Service<T1, T2>
+    {
+        public T2 DataStorage { protected set; get; }
+        public bool HaveDataStorage => DataStorage != null;
+
+        public readonly IReader<T1, T2> Reader;
+        public bool HaveReader => Reader != null;
+
+        public readonly IWriter<T1, T2> Writer;
+        public bool HaveWriter => Writer != null;
+
+
+        public RW_Service(
+            IReader<T1, T2> Reader,
+            IWriter<T1, T2> Writer
+            )
+        {
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+        public RW_Service(
+            T2 ds, 
+            IReader<T1, T2> Reader, 
+            IWriter<T1, T2> Writer
+            )
+        {
+            this.DataStorage = ds;
+            this.Reader = Reader;
+            this.Writer = Writer;
+        }
+
+
+        public T1 Read(T2 param)
+        {
+            if (!HaveReader)
+                throw new Exception();            
+
+            return Reader.Read(param);
+        }
+        public T1 Read() => Read(DataStorage);
+
+        public void Write(T1 entity, T2 param)
+        {
+            if (!HaveWriter)
+                throw new Exception();
+
+            Writer.Write(entity, param);
+        }
+        public void Write(T1 entity) => Write(entity, DataStorage);
+
+    }
+
+
+}
diff --git a/ToolPack1/RW_Tool/RW_Tool.Core/RW_Tool.Core.csproj b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Tool.Core.csproj
index 726df92..a1b52ae 100644
--- a/ToolPack1/RW_Tool/RW_Tool.Core/RW_Tool.Core.csproj
+++ b/ToolPack1/RW_Tool/RW_Tool.Core/RW_Tool.Core.csproj
@@ -48,10 +48,10 @@
     <Compile Include="Abstract\IReader.cs" />
     <Compile Include="Abstract\IWriter.cs" />
     <Compile Include="Abstract\ITransformator.cs" />
-    <Compile Include="Abstract\I_RW.cs" />
+    <Compile Include="Abstract\I_RW_Service.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="RW.cs" />
-    <Compile Include="RW_Custom.cs" />
+    <Compile Include="RW_Service.cs" />
+    <Compile Include="RW_Custom_Service.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>
\ No newline at end of file
diff --git a/ToolPack1/RW_Tool/RW_Tool.XML_BIN/Factory.cs b/ToolPack1/RW_Tool/RW_Tool.XML_BIN/Factory.cs
index 5d180e7..c495421 100644
--- a/ToolPack1/RW_Tool/RW_Tool.XML_BIN/Factory.cs
+++ b/ToolPack1/RW_Tool/RW_Tool.XML_BIN/Factory.cs
@@ -15,7 +15,7 @@ namespace RW_Tool.XML_BIN
     public class Factory<T>
         where T : class, new()
     {
-        public RW<T, DS_FileOrStream> GetRW(EnumFormat format, DS_FileOrStream ds = null)
+        public RW_Service<T, DS_FileOrStream> GetRW(EnumFormat format, DS_FileOrStream ds = null)
         {
             switch (format)
             {
@@ -25,20 +25,20 @@ namespace RW_Tool.XML_BIN
                 default: throw new Exception();
             }
         }
-             
 
-        public RW<T, DS_FileOrStream> GetXMLRW(DS_FileOrStream ds = null)            
+
+        public RW_Service<T, DS_FileOrStream> GetXMLRW(DS_FileOrStream ds = null)
         =>
-             new RW<T, DS_FileOrStream>
+             new RW_Service<T, DS_FileOrStream>
                 (
                 ds,
                 new XML_Reader<T>(),
                 new XML_Writer<T>()
                 );
 
-        public RW<T, DS_FileOrStream> GetBinRW(DS_FileOrStream ds = null)            
+        public RW_Service<T, DS_FileOrStream> GetBinRW(DS_FileOrStream ds = null)
         =>
-             new RW<T, DS_FileOrStream>
+             new RW_Service<T, DS_FileOrStream>
                 (
                 ds,
                 new Bin_Reader<T>(),
@@ -51,7 +51,7 @@ namespace RW_Tool.XML_BIN
         where T1 : class, new()
         where T3 : class, new()
     {
-        public RW_Custom<T1, DS_FileOrStream, T3> GetRW(EnumFormat format, ITransformator<T1,T3> transformator, DS_FileOrStream ds = null)
+        public RW_Custom_Service<T1, DS_FileOrStream, T3> GetRW(EnumFormat format, ITransformator<T1, T3> transformator, DS_FileOrStream ds = null)
         {
             switch (format)
             {
@@ -63,9 +63,9 @@ namespace RW_Tool.XML_BIN
         }
 
 
-        public RW_Custom<T1, DS_FileOrStream, T3> GetXMLRW(ITransformator<T1, T3> transformator, DS_FileOrStream ds = null)
+        public RW_Custom_Service<T1, DS_FileOrStream, T3> GetXMLRW(ITransformator<T1, T3> transformator, DS_FileOrStream ds = null)
         =>
-             new RW_Custom<T1, DS_FileOrStream, T3>
+             new RW_Custom_Service<T1, DS_FileOrStream, T3>
                 (
                 ds,
                 transformator,
@@ -73,15 +73,16 @@ namespace RW_Tool.XML_BIN
                 new XML_Writer<T3>()
                 );
 
-        public RW_Custom<T1, DS_FileOrStream, T3> GetBinRW(ITransformator<T1, T3> transformator, DS_FileOrStream ds = null)
+        public RW_Custom_Service<T1, DS_FileOrStream, T3> GetBinRW(ITransformator<T1, T3> transformator, DS_FileOrStream ds = null)
         =>
-             new RW_Custom<T1, DS_FileOrStream, T3>
+             new RW_Custom_Service<T1, DS_FileOrStream, T3>
                 (
                 ds,
                 transformator,
                 new Bin_Reader<T3>(),
                 new Bin_Writer<T3>()
                 );
+
     }
 
 }
diff --git a/ToolPack1/Test/Test.ConfigurationTool/ConfigurationTest.cs b/ToolPack1/Test/Test.ConfigurationTool/ConfigurationTest.cs
index 559f727..c1a5f66 100644
--- a/ToolPack1/Test/Test.ConfigurationTool/ConfigurationTest.cs
+++ b/ToolPack1/Test/Test.ConfigurationTool/ConfigurationTest.cs
@@ -31,7 +31,7 @@ namespace Test.ConfigurationTool
 
             conf.Data = Config1.GetConfig_1();
             conf.Export();
-            if (!conf.Exist())
+            if (!conf.FileExist())
                 throw new Exception();
 
             conf.Import();
@@ -84,7 +84,7 @@ namespace Test.ConfigurationTool
 
             for (int i = 0; i < 2; i++)
             {
-                conf.Add(i.ToString(), new Config3()
+                conf.AddAndSave(i.ToString(), new Config3()
                 {
                     ID = i,
                     Name = "name" + i,
diff --git a/ToolPack1/Test/Test.SingletonTool/SingletonTest.cs b/ToolPack1/Test/Test.SingletonTool/SingletonTest.cs
index 41d0770..5785a82 100644
--- a/ToolPack1/Test/Test.SingletonTool/SingletonTest.cs
+++ b/ToolPack1/Test/Test.SingletonTool/SingletonTest.cs
@@ -1,7 +1,8 @@
 using System;
 using Microsoft.VisualStudio.TestTools.UnitTesting;
 
-using Tools.SingletonTool;
+using Tools.SingletonTool.Base;
+using Tools.SingletonTool.Manager;
 
 namespace Test.SingletonTool
 {
@@ -27,21 +28,21 @@ namespace Test.SingletonTool
         [TestMethod]
         public void Test1()
         {
-            var sing = Signlethon<SingleEntity>.Get();
-
-            
+            var sing = new SinglethonManager<SingleEntity>().Get;
         }
 
         [TestMethod]
         public void Test2()
         {
-            var sing = SignlethonWithParams<SingleEntity, SingleParams>.Create(new SingleParams()
+            var sing = new SinglethonWithParamsManager<SingleEntity, SingleParams>(new SingleParams()
             {
                 name = "Name"
-            });
+            }).Get;
 
             if (sing.Name != "Name")
+            {
                 throw new Exception();
+            }
         }
     }
 }
diff --git a/ToolPack1/ToolPack1.sln b/ToolPack1/ToolPack1.sln
index 64b29e8..cb0b55e 100644
--- a/ToolPack1/ToolPack1.sln
+++ b/ToolPack1/ToolPack1.sln
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.28307.136
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29509.3
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Test", "Test", "{ABC5281A-6B36-4D11-AFED-3E2EF981AA49}"
 EndProject
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/BaseConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/BaseConfigEntity.cs
new file mode 100644
index 0000000..31c155d
--- /dev/null
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/BaseConfigEntity.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.IO;
+
+using Tools.SingletonTool.Base;
+
+namespace Tools.ConfigurationTool.Config.Base
+{
+    
+    internal abstract class BaseConfigEntity<D, P>
+        : IConfigEntity<D>,
+        ISignlethonWithParams<P>
+        where D : class, new()
+        where P : ConfigParams
+    {
+        /// <summary>
+        /// Параметры конфига
+        /// </summary>
+        protected P Params { private set; get; }
+
+        /// <summary>
+        /// Данные, хранимые в конфиге
+        /// </summary>
+        public D Data { set; get; } = new D();
+
+
+        public virtual void SetParams(P param)
+        {
+            Params = param;
+
+            //if (File.Exists(Params.ConfigPath))
+            //{
+            //    Import();
+            //}
+            //Export();
+        }
+
+
+
+        protected abstract D Read();
+        protected abstract void Write(D data);
+
+
+        /// <summary>
+        /// Прочитать файл
+        /// </summary>
+        public virtual void Import() 
+        {
+            Data = Read();
+        }
+
+        /// <summary>
+        /// Сохранить в файл
+        /// </summary>
+        public virtual void Export() 
+        {
+            Write(Data);
+        }
+
+        public bool FileExist() => File.Exists(Params.ConfigPath);
+        public void DeleteFile()
+        {
+            if (FileExist())
+            {
+                File.Delete(Params.ConfigPath);
+            }
+        }
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/IConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/IConfigEntity.cs
new file mode 100644
index 0000000..fb4a5e5
--- /dev/null
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Base/IConfigEntity.cs
@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Tools.ConfigurationTool.Config.Base
+{
+    internal interface IConfigEntity<D>
+    {
+        D Data { set; get; }
+
+        /// <summary>
+        /// Прочитать файл
+        /// </summary>
+        void Import();
+
+        /// <summary>
+        /// Сохранить в файл
+        /// </summary>
+        void Export();
+
+        bool FileExist();
+        void DeleteFile();
+    }
+}
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigEntity.cs
index 13a0beb..7cc268a 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigEntity.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigEntity.cs
@@ -6,50 +6,40 @@ using System.Threading.Tasks;
 
 using System.IO;
 
-using RW_Tool.Core.Abstract;
-using RW_Tool.DataSource.FileOrStream;
-
-using Tools.ConfigurationTool.Serializer;
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.Config.Base;
 
 namespace Tools.ConfigurationTool.Config
 {
     //Singlethon сущность конфига 
-    internal class ConfigEntity<T>
-        : ISignlethonWithParams<ConfigParams>
+    internal class ConfigEntity<T> 
+        : BaseConfigEntity<T, ConfigParams>        
         where T : class, new()
     {
-        //Параметры конфига
-        internal ConfigParams Params { private set; get; }
-
-        //Объект сериализации
-        I_RW<T, DS_FileOrStream> Serializer;
-
-        //Данные, хранимые в конфиге
-        public T Data { set; get; } = new T();
-
-        public void SetParams(ConfigParams param)
+        public override void SetParams(ConfigParams param)
         {
-            Params = param;
-
-           Serializer = new SerializerFactory()
-                .GetSerializer<T>(Params.ConfigPath, param.Format);            
+            base.SetParams(param);
 
             if (File.Exists(Params.ConfigPath))
+            {
                 Import();
+            }
             Export();
         }
-
-        //Прочитать файл
-        public void Import()
+        
+        protected override T Read()
         {
-            Data = Serializer.Read();
+            return Params
+                .RW_Factory
+                .Get_RW<T>(Params.ConfigPath, Params.Format)
+                .Read();
         }
-        //Сохранить в файл
-        public void Export()
+
+        protected override void Write(T data)
         {
-            Serializer.Write(Data);
+            Params
+                .RW_Factory
+                .Get_RW<T>(Params.ConfigPath, Params.Format)
+                .Write(Data);
         }
     }
-
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigParams.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigParams.cs
index 4de71f6..1e59b59 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigParams.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigParams.cs
@@ -9,20 +9,35 @@ using System.Windows.Forms;
 
 using RW_Tool.XML_BIN;
 
+using Tools.ConfigurationTool.Services;
+
 namespace Tools.ConfigurationTool.Config
 {    
     //Базовые параметры конфига
     public class ConfigParams
     {
-        //Имя или полный путь к файлу конфигурации
+        //Типо DI
+        public RW_Factory RW_Factory => new RW_Factory();
+
+        /// <summary>
+        /// Имя или полный путь к файлу конфигурации
+        /// </summary>
         public string ConfigFile { set; get; }
-        //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
+
+        /// <summary>
+        /// Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
+        /// </summary>
         public bool UseApplicationPathPrefix { set; get; } = true;
 
-        //Формат в котором будет храниться конфиг
+        /// <summary>
+        /// Формат в котором будет храниться конфиг
+        /// </summary>
         public EnumFormat Format { set; get; } = EnumFormat.XML;
 
-        //Путь по которому выполняются обращению к конфигу
+
+        /// <summary>
+        /// Полный путь по которому выполняются обращению к конфигу
+        /// </summary>
         public string ConfigPath => (UseApplicationPathPrefix
             ?
              Path.Combine(Application.StartupPath, ConfigFile)
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigurationManager.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigurationManager.cs
index 96f3aea..e5f887f 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigurationManager.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/ConfigurationManager.cs
@@ -4,57 +4,70 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
+using Tools.SingletonTool.Manager;
 
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.Config.Base;
 
 namespace Tools.ConfigurationTool.Config
-{      
-    //Обеспечивате доступ к конфигу
-    public sealed class ConfigurationManager<T>
+{
+    /// <summary>
+    /// Обеспечивает доступ к конфигу
+    /// </summary>
+    /// <typeparam name="T"></typeparam>
+    public class ConfigurationManager<T>
         where T: class, new()
     {
-        //Конфиг
-        private ConfigEntity<T> Config => SignlethonWithParams<ConfigEntity<T>, ConfigParams>.Get();
+        private SinglethonWithParamsManager<ConfigEntity<T>, ConfigParams> SinglethonManager;
+
+        internal virtual IConfigEntity<T> ConfigEntity => SinglethonManager.Get;
+
         //Данные конфига
         public T Data
         {
-            set => Config.Data = value;
-            get => Config.Data;
+            set => ConfigEntity.Data = value;
+            get => ConfigEntity.Data;
         }
 
         //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
         public ConfigurationManager(ConfigParams param)
         {
-            if (!SignlethonWithParams<ConfigEntity<T>, ConfigParams>.ExistInstance)
-                SignlethonWithParams<ConfigEntity<T>, ConfigParams>.Create(param);
+            SinglethonManager = 
+                new SinglethonWithParamsManager<ConfigEntity<T>, ConfigParams>(param);            
         }
 
         //Для повторных обращений к конфигу
         public ConfigurationManager()
         {
-            if (!SignlethonWithParams<ConfigEntity<T>, ConfigParams>.ExistInstance)
-                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
+            SinglethonManager = 
+                new SinglethonWithParamsManager<ConfigEntity<T>, ConfigParams>();
         }
 
 
-        //Прочитать из файла
+        /// <summary>
+        /// Прочитать из файла
+        /// </summary>
         public void Import()
         {
-            Config.Import();
+            ConfigEntity.Import();
         }
-        //Сохранить в файл
+        /// <summary>
+        /// Сохранить в файл
+        /// </summary>
         public void Export()
         {
-            Config.Export();
+            ConfigEntity.Export();
         }
 
-        public bool Exist() => File.Exists(Config.Params.ConfigPath);
+
+        public bool FileExist()
+        {
+            return ConfigEntity.FileExist();
+        }
         public void Delete()
         {
-            if (Exist())
-                File.Delete(Config.Params.ConfigPath);
+            ConfigEntity.DeleteFile();
         }
+
     }
 
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigEntity.cs
index c739c1f..f814b9f 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigEntity.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigEntity.cs
@@ -6,55 +6,41 @@ using System.Threading.Tasks;
 
 using System.IO;
 
-using RW_Tool.Core.Abstract;
-using RW_Tool.DataSource.FileOrStream;
-
-using Tools.ConfigurationTool.Serializer;
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.Config.Base;
 
 namespace Tools.ConfigurationTool.Config.Custom
 {
 
     internal class ConfigEntity<T1, T2>
-        : ISignlethonWithParams<ConfigParams<T1, T2>>
+        : BaseConfigEntity<T1, ConfigParams<T1, T2>>
         where T1 : class, new()
         where T2 : class, new()
     {
-        //Параметры конфига
-        public ConfigParams<T1, T2> Params { private set; get; }
-
-        //Объект сериализации
-        I_RW<T1, DS_FileOrStream> Serializer;
-
-
-        //Данные, хранимые в конфиге
-        public T1 Data { set; get; } = new T1();
-
-        public void SetParams(ConfigParams<T1, T2> param)
+        public override void SetParams(ConfigParams<T1, T2> param)
         {
-            Params = param;
-
-            Serializer = new SerializerFactory()
-               .GetSerializer_Custon<T1, T2>(
-               param.ConfigPath,
-               param.Format,
-               param.Transformator
-               );
+            base.SetParams(param);
 
             if (File.Exists(Params.ConfigPath))
+            {
                 Import();
+            }
             Export();
         }
 
-        //Прочитать файл
-        public void Import()
+        protected override T1 Read()
         {
-            Data = Serializer.Read();
+            return Params
+                .RW_Factory
+                .Get_RW<T1, T2>(Params.ConfigPath, Params.Format, Params.Transformator)
+                .Read();
         }
-        //Сохранить в файл
-        public void Export()
+
+        protected override void Write(T1 data)
         {
-            Serializer.Write(Data);
+            Params
+                .RW_Factory
+                .Get_RW<T1, T2>(Params.ConfigPath, Params.Format, Params.Transformator)
+                .Write(data);
         }
     }
 
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigParams.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigParams.cs
index 56e1798..4ec586b 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigParams.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigParams.cs
@@ -4,39 +4,20 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
-using System.Windows.Forms;
-
 using RW_Tool.Core.Abstract;
-using RW_Tool.XML_BIN;
 
 namespace Tools.ConfigurationTool.Config.Custom
 {    
-    public class ConfigParams<T1, T2>
+    public class ConfigParams<T1, T2> : ConfigParams
     {
-        //Имя или полный путь к файлу конфигурации
-        public string ConfigFile { set; get; }
-        //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
-        public bool UseApplicationPathPrefix { set; get; } = true;
-
-        //Формат в котором будет храниться конфиг
-        public EnumFormat Format { set; get; } = EnumFormat.XML;
-
-        //Трансформатор для преобразования формата из T1 в T2
+        /// <summary>
+        /// Трансформатор для преобразования формата из T1 в T2 при чтении/записи
+        /// </summary>
         public ITransformator<T1, T2> Transformator { set; get; }
 
-        //Путь по которому выполняются обращению к конфигу
-        public string ConfigPath => (UseApplicationPathPrefix
-            ?
-             Path.Combine(Application.StartupPath, ConfigFile)
-            :
-             ConfigFile
-            );
-
 
-        public ConfigParams(string ConfigFile, ITransformator<T1, T2> Transformator)
+        public ConfigParams(string ConfigFile, ITransformator<T1, T2> Transformator) : base(ConfigFile)
         {
-            this.ConfigFile = ConfigFile;
             this.Transformator = Transformator;
         }
     }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigurationManager.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigurationManager.cs
index ade5675..a1f809b 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigurationManager.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Config/Custom/ConfigurationManager.cs
@@ -4,57 +4,33 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
-
-using Tools.SingletonTool;
+using Tools.SingletonTool.Manager;
+using Tools.ConfigurationTool.Config.Base;
 
 namespace Tools.ConfigurationTool.Config.Custom
 {      
     //Обеспечивате доступ к конфигу
-    public sealed class ConfigurationManager<T1, T2>
+    public sealed class ConfigurationManager<T1, T2> : ConfigurationManager<T1>
         where T1: class, new()
         where T2 : class, new()
     {
-        //Конфиг
-        private ConfigEntity<T1, T2> Config => SignlethonWithParams<ConfigEntity<T1, T2>, ConfigParams<T1, T2>>.Get();
-        //Данные конфига
-        public T1 Data
-        {
-            set => Config.Data = value;
-            get => Config.Data;
-        }
+        private readonly SinglethonWithParamsManager<ConfigEntity<T1, T2>, ConfigParams<T1, T2>> SinglethonManager
+            = new SinglethonWithParamsManager<ConfigEntity<T1, T2>, ConfigParams<T1, T2>>();
+
+        internal override IConfigEntity<T1> ConfigEntity => SinglethonManager.Get;
 
         //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
         public ConfigurationManager(ConfigParams<T1,T2> param)
         {
-            if (!SignlethonWithParams<ConfigEntity<T1,T2>, ConfigParams<T1,T2>>.ExistInstance)
-                SignlethonWithParams<ConfigEntity<T1,T2>, ConfigParams<T1, T2>>.Create(param);
+            SinglethonManager
+                = new SinglethonWithParamsManager<ConfigEntity<T1, T2>, ConfigParams<T1, T2>>(param);
         }
 
         //Для повторных обращений к конфигу
         public ConfigurationManager()
         {
-            if (!SignlethonWithParams<ConfigEntity<T1>, ConfigParams>.ExistInstance)
-                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
-        }
-
-
-        //Прочитать из файла
-        public void Import()
-        {
-            Config.Import();
-        }
-        //Сохранить в файл
-        public void Export()
-        {
-            Config.Export();
-        }
-
-        public bool Exist() => File.Exists(Config.Params.ConfigPath);
-        public void Delete()
-        {
-            if (Exist())
-                File.Delete(Config.Params.ConfigPath);
+            SinglethonManager
+                = new SinglethonWithParamsManager<ConfigEntity<T1, T2>, ConfigParams<T1, T2>>();
         }
     }
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/BaseMConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/BaseMConfigEntity.cs
new file mode 100644
index 0000000..f2f3ab8
--- /dev/null
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/BaseMConfigEntity.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using System.IO;
+
+using Tools.SingletonTool.Base;
+
+namespace Tools.ConfigurationTool.ConfigMultiple.Base
+{
+    public abstract class BaseMConfigEntity<D, P>
+        : IMConfigEntity<D>, 
+        ISignlethonWithParams<P>
+        where P : MConfigParams
+    {
+        //Параметры конфига
+        public P Params { private set; get; }
+
+        //Данные, хранимые в конфиге
+        public Dictionary<string, D> Data { set; get; } = new Dictionary<string, D>();
+
+
+        public virtual void SetParams(P param)
+        {
+            Params = param;
+        }
+
+
+        protected abstract D Read(string path);
+        protected abstract void Write(D data, string key);
+
+
+        public virtual void Export(string key)
+        {
+            Write(Data[key], key);
+        }
+        public virtual void ExportAll()
+        {
+            DirectoryInfo dir = Params.ConfigDirectoryInfo;
+
+            if (Params.RecreateDirectory)
+            {
+                if (dir.Exists)
+                {
+                    dir.Delete(true);
+                }
+            }
+            dir.Refresh();
+            if (!dir.Exists)
+            {
+                dir.Create();
+            }
+
+            foreach (var elem in Data)
+            {
+                Export(elem.Key);
+            }
+        }
+
+        public virtual void Import(string path)
+        {
+            Data.Add(
+                Path.GetFileNameWithoutExtension(Path.GetFileName(path)),
+                Read(path)
+            );
+        }
+        public virtual void ImportAll()
+        {
+            DirectoryInfo dir = Params.ConfigDirectoryInfo;
+
+            if (!dir.Exists)
+            {
+                dir.Create();
+                return;
+            }
+
+            var data = dir.GetFiles();
+
+            foreach (var elem in data)
+            {
+                Import(elem.FullName);
+            }
+        }
+
+
+        public void AddAndSave(string key, D value)
+        {
+            Data.Add(key, value);
+            Export(key);
+        }
+        public void RemoveAndSave(string key)
+        {
+            Data.Remove(key);
+            var path = Params.GetPathForFile(key);
+            if (File.Exists(path))
+            {
+                File.Delete(path);
+            }
+        }
+
+
+        public void DeleteDirectory()
+        {
+            var dir = Params.ConfigDirectoryInfo;
+
+            if (dir.Exists)
+            {
+                dir.Delete(true);
+            }
+        }
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/IMConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/IMConfigEntity.cs
new file mode 100644
index 0000000..b20d26d
--- /dev/null
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Base/IMConfigEntity.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Tools.ConfigurationTool.ConfigMultiple.Base
+{
+    internal interface IMConfigEntity<D>
+    {
+        Dictionary<string, D> Data { set; get; }
+
+
+        /// <summary>
+        /// Сохранить в папку конфига указанную запись
+        /// </summary>
+        /// <param name="key">ключ</param>
+        void Export(string key);
+        /// <summary>
+        /// Очистить папку и сохранить
+        /// </summary>
+        void ExportAll();
+
+        /// <summary>
+        /// Прочитать запись по указанному пути (key - имя файла)
+        /// </summary>
+        /// <param name="path"></param>
+        void Import(string path);
+        /// <summary>
+        /// Прочитать все значения из папк конфигурации
+        /// </summary>
+        void ImportAll();
+
+
+        /// <summary>
+        /// Добавить значение в конфиг и сохранить в папку
+        /// </summary>
+        /// <param name="key">ключ</param>
+        /// <param name="value">запись</param>
+        void AddAndSave(string key, D value);
+        /// <summary>
+        /// Удалить значение из конфига и из папки
+        /// </summary>
+        /// <param name="key">ключ</param>
+        void RemoveAndSave(string key);
+
+
+        void DeleteDirectory();
+    }
+}
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs
index 3471b8e..a1e826d 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigEntity.cs
@@ -4,101 +4,28 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
-
-using RW_Tool.Core.Abstract;
-using RW_Tool.DataSource.FileOrStream;
-
-using Tools.ConfigurationTool.Serializer;
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.ConfigMultiple.Base;
 
 namespace Tools.ConfigurationTool.ConfigMultiple.Custom
 {
     //Singlethon сущность конфига 
     public class MConfigEntity<T1, T2>
-        : ISignlethonWithParams<MConfigParams<T1,T2>>
+        : BaseMConfigEntity<T1, MConfigParams<T1, T2>>
         where T1 : class, new()
         where T2 : class, new()
     {
-        //Параметры конфига
-        public MConfigParams<T1,T2> Params { private set; get; }
-
-        //Объект сериализации
-        I_RW<T1, DS_FileOrStream> Serializer;
-
-        //Данные, хранимые в конфиге
-        public Dictionary<string, T1> Data { set; get; } = new Dictionary<string, T1>();
-
-
-        public void SetParams(MConfigParams<T1,T2> param)           
-        {
-            Params = param;
-
-            Serializer = new SerializerFactory()
-                .GetSerializer_Custon<T1,T2>(
-                Params.ConfigDirectoryPath, 
-                param.Format, 
-                param.Transformator
-                );
-
-
-
-            if (Directory.Exists(Params.ConfigDirectoryPath))
-                ImportAll();
-            ExportAll();
-        }
-
-
-
-
-
-        public void Export(string key)
+        protected override T1 Read(string path)
         {
-            Serializer.Write(
-                Data[key], 
-                new DS_File(Params.GetPathForFile(key))
-            );
+            return Params.RW_Factory
+                .Get_RW<T1, T2>(path, Params.Format, Params.Transformator)
+                .Read();
         }
-        public void ExportAll()
-        {
-            DirectoryInfo dir = Params.ConfigDirectoryInfo;
-
-            if (Params.RecreateDirectory)
-            {
-                if (dir.Exists)
-                    dir.Delete(true);
-            }
-            dir.Refresh();
-            if (!dir.Exists)
-                dir.Create();
 
-            foreach (var elem in Data)
-                Export(elem.Key);
-        }
-
-        public void Import(string path)
-        {
-            Data.Add(
-                Path.GetFileNameWithoutExtension(Path.GetFileName(path)),
-                Serializer.Read(new DS_File(path))
-            );
-        }
-        public void ImportAll()
+        protected override void Write(T1 data, string key)
         {
-            DirectoryInfo dir = Params.ConfigDirectoryInfo;
-
-            if (!dir.Exists)
-            {
-                dir.Create();
-                return;
-            }
-
-            var data = dir.GetFiles();
-
-            foreach (var elem in data)
-            {
-                Import(elem.FullName);
-            }
+            Params.RW_Factory
+                .Get_RW<T1, T2>(Params.GetPathForFile(key), Params.Format, Params.Transformator)
+                .Write(data);
         }
     }
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs
index b93ab5c..76af8f5 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigParams.cs
@@ -4,48 +4,19 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
-using System.Windows.Forms;
-
 using RW_Tool.Core.Abstract;
-using RW_Tool.XML_BIN;
 
 namespace Tools.ConfigurationTool.ConfigMultiple.Custom
 {
     //Базовые параметры конфига
-    public class MConfigParams<T1,T2>
+    public class MConfigParams<T1,T2> 
+        : MConfigParams
     {
-        //Папка, в которой будут храниться конфиги
-        public string ConfigDirectory { set; get; }
-        //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
-        public bool UseApplicationPathPrefix { set; get; } = true;
-
-        //Формат в котором будет храниться конфиг
-        public EnumFormat Format { set; get; } = EnumFormat.XML;
-
         public ITransformator<T1, T2> Transformator { set; get; }
 
-        //Пересоздавать папку при общем сохранении
-        public bool RecreateDirectory { set; get; } = true;
-
-        //Полный путь к конфигу
-        public string ConfigDirectoryPath => (UseApplicationPathPrefix
-            ?
-             Path.Combine(Application.StartupPath, ConfigDirectory)
-            :
-             ConfigDirectory
-            );
-        public DirectoryInfo ConfigDirectoryInfo => new DirectoryInfo(ConfigDirectoryPath);
-
-        public string GetPathForFile(string key) =>        
-             Path.Combine(ConfigDirectoryPath, key + 
-                (Format == EnumFormat.XML ? ".xml" : ".bin")
-                );
-
 
-        public MConfigParams(string ConfigDirectory, ITransformator<T1, T2> Transformator)
+        public MConfigParams(string ConfigDirectory, ITransformator<T1, T2> Transformator) : base(ConfigDirectory)
         {
-            this.ConfigDirectory = ConfigDirectory;
             this.Transformator = Transformator;
         }
     }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs
index d784ded..88d6b18 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/Custom/MConfigurationManager.cs
@@ -4,71 +4,36 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
+using Tools.SingletonTool.Manager;
 
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.ConfigMultiple.Base;
 
 namespace Tools.ConfigurationTool.ConfigMultiple.Custom
 {      
     //Обеспечивате доступ к конфигу
-    public sealed class MConfigurationManager<T1, T2>
+    public class MConfigurationManager<T1, T2>
+        : MConfigurationManager<T1>
         where T1: class, new()
         where T2 : class, new()
     {
-        //Конфиг
-        private MConfigEntity<T1, T2> Config => SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.Get();
-        //Данные конфига
-        public Dictionary<string, T1> Data
-        {
-            set => Config.Data = value;
-            get => Config.Data;
-        }
+        private readonly SinglethonWithParamsManager<MConfigEntity<T1, T2>, MConfigParams<T1, T2>> SinglethonManager;
+
+        internal override IMConfigEntity<T1> ConfigEntity => SinglethonManager.Get;
+
 
         //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
         public MConfigurationManager(MConfigParams<T1, T2> param)
         {
-            if (!SignlethonWithParams<MConfigEntity<T1,T2>, MConfigParams<T1,T2>>.ExistInstance)
-                SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.Create(param);
+            SinglethonManager 
+                = new SinglethonWithParamsManager<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>(param);
         }
 
         //Для повторных обращений к конфигу
         public MConfigurationManager()
         {
-            if (!SignlethonWithParams<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>.ExistInstance)
-                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
-        }
-
-
-        public void Add(string key, T1 value)
-        {
-            Data.Add(key, value);
-            Config.Export(key);
-        }
-        public void Remove(string key)
-        {
-            Data.Remove(key);
-            var path = Config.Params.GetPathForFile(key);
-            if (File.Exists(path))
-                File.Delete(path);
+            SinglethonManager
+                = new SinglethonWithParamsManager<MConfigEntity<T1, T2>, MConfigParams<T1, T2>>();
         }
 
-        //Прочитать из файла
-        public void Import()
-        {
-            Config.ImportAll();
-        }
-        //Сохранить в файл
-        public void Export()
-        {
-            Config.ExportAll();
-        }
-
-        public void Delete()
-        {
-            var dir = Config.Params.ConfigDirectoryInfo;
-
-            if (dir.Exists)
-                dir.Delete(true);
-        }
     }
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigEntity.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigEntity.cs
index 4b14e26..fa7e54d 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigEntity.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigEntity.cs
@@ -6,93 +6,39 @@ using System.Threading.Tasks;
 
 using System.IO;
 
-using RW_Tool.Core.Abstract;
-using RW_Tool.DataSource.FileOrStream;
-
-using Tools.ConfigurationTool.Serializer;
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.ConfigMultiple.Base;
 
 namespace Tools.ConfigurationTool.ConfigMultiple
 {
     //Singlethon сущность конфига 
-    public class MConfigEntity<T>
-        : ISignlethonWithParams<MConfigParams>
+    internal class MConfigEntity<T>
+        : BaseMConfigEntity<T, MConfigParams>
         where T : class, new()
     {
-        //Параметры конфига
-        public MConfigParams Params { private set; get; }
-
-        //Объект сериализации
-        I_RW<T, DS_FileOrStream> Serializer;
-
-        //Данные, хранимые в конфиге
-        public Dictionary<string, T> Data { set; get; } = new Dictionary<string, T>();
 
-
-        public void SetParams(MConfigParams param)
+        public override void SetParams(MConfigParams param)
         {
-            Params = param;
-
-            Serializer = new SerializerFactory()
-                .GetSerializer<T>(
-                    param.ConfigDirectoryPath, 
-                    param.Format
-                );
+            base.SetParams(param);
 
             if (Directory.Exists(Params.ConfigDirectoryPath))
+            {
                 ImportAll();
+            }
             ExportAll();
         }
 
-
-        public void Export(string key)
-        {
-            Serializer.Write(
-                Data[key], 
-                new DS_File(Params.GetPathForFile(key))
-            );
-        }
-        public void ExportAll()
+        protected override T Read(string path)
         {
-            DirectoryInfo dir = Params.ConfigDirectoryInfo;
-
-            if (Params.RecreateDirectory)
-            {
-                if (dir.Exists)
-                    dir.Delete(true);
-            }
-            dir.Refresh();
-            if (!dir.Exists)
-                dir.Create();
-
-            foreach (var elem in Data)
-                Export(elem.Key);
+            return Params.RW_Factory
+                .Get_RW<T>(path, Params.Format)
+                .Read();
         }
 
-        public void Import(string path)
-        {
-            Data.Add(
-                Path.GetFileNameWithoutExtension(Path.GetFileName(path)),
-                Serializer.Read(new DS_File(path))
-            );
-        }
-        public void ImportAll()
+        protected override void Write(T data, string key)
         {
-            DirectoryInfo dir = Params.ConfigDirectoryInfo;
-
-            if (!dir.Exists)
-            {
-                dir.Create();
-                return;
-            }
-
-            var data = dir.GetFiles();
-
-            foreach (var elem in data)
-            {
-                Import(elem.FullName);
-            }
+            Params.RW_Factory
+                .Get_RW<T>(Params.GetPathForFile(key), Params.Format)
+                .Write(data);
         }
-
     }
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigParams.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigParams.cs
index 30cf5ae..41c7a08 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigParams.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigParams.cs
@@ -7,14 +7,18 @@ using System.Threading.Tasks;
 using System.IO;
 using System.Windows.Forms;
 
-using RW_Tool.Core.Abstract;
 using RW_Tool.XML_BIN;
 
+using Tools.ConfigurationTool.Services;
+
 namespace Tools.ConfigurationTool.ConfigMultiple
 {
     //Базовые параметры конфига
     public class MConfigParams
     {
+        public RW_Factory RW_Factory => new RW_Factory();
+
+
         //Папка, в которой будут храниться конфиги
         public string ConfigDirectory { set; get; }
         //Флаг: испоьзовать ли в пути к файлу путь к .exe приложению
@@ -36,10 +40,18 @@ namespace Tools.ConfigurationTool.ConfigMultiple
         public DirectoryInfo ConfigDirectoryInfo => new DirectoryInfo(ConfigDirectoryPath);
 
 
-        public string GetPathForFile(string key) =>        
-             Path.Combine(ConfigDirectoryPath, key + 
-                (Format == EnumFormat.XML ? ".xml" : ".bin")
-                );
+        public string GetPathForFile(string key)
+        {
+            switch (Format) 
+            {
+                case EnumFormat.XML:
+                    return Path.Combine(ConfigDirectoryPath, key + ".xml");
+                case EnumFormat.Bin:
+                    return Path.Combine(ConfigDirectoryPath, key + ".bin");
+            }
+
+            return Path.Combine(ConfigDirectoryPath, key + ".NoFormate");
+        }
 
 
         public MConfigParams(string ConfigDirectory)
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigurationManager.cs b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigurationManager.cs
index 651a99f..1266461 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigurationManager.cs
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/ConfigMultiple/MConfigurationManager.cs
@@ -4,70 +4,67 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-using System.IO;
+using Tools.SingletonTool.Manager;
 
-using Tools.SingletonTool;
+using Tools.ConfigurationTool.ConfigMultiple.Base;
 
 namespace Tools.ConfigurationTool.ConfigMultiple
 {      
     //Обеспечивате доступ к конфигу
-    public sealed class MConfigurationManager<T>
+    public class MConfigurationManager<T>
         where T: class, new()
     {
+        private readonly SinglethonWithParamsManager<MConfigEntity<T>, MConfigParams> SinglethonManager;
+
         //Конфиг
-        private MConfigEntity<T> Config => SignlethonWithParams<MConfigEntity<T>, MConfigParams>.Get();
-        //Данные конфига
+        internal virtual IMConfigEntity<T> ConfigEntity => SinglethonManager.Get;
+        
         public Dictionary<string, T> Data
         {
-            set => Config.Data = value;
-            get => Config.Data;
+            set => ConfigEntity.Data = value;
+            get => ConfigEntity.Data;
         }
 
         //При первом обращении необходимо использовать данный конструктор для иницилизации параметров конфига
         public MConfigurationManager(MConfigParams param)
         {
-            if (!SignlethonWithParams<MConfigEntity<T>, MConfigParams>.ExistInstance)
-                SignlethonWithParams<MConfigEntity<T>, MConfigParams>.Create(param);
+            SinglethonManager
+                = new SinglethonWithParamsManager<MConfigEntity<T>, MConfigParams>(param);
         }
 
         //Для повторных обращений к конфигу
         public MConfigurationManager()
         {
-            if (!SignlethonWithParams<MConfigEntity<T>, MConfigParams>.ExistInstance)
-                throw new Exception("Use ConfigurationManager(ConfigParams param) first");
+            SinglethonManager
+                = new SinglethonWithParamsManager<MConfigEntity<T>, MConfigParams>();
         }
 
 
-        public void Add(string key, T value)
+        public void AddAndSave(string key, T value)
         {
-            Data.Add(key, value);
-            Config.Export(key);
+            ConfigEntity.AddAndSave(key, value);
         }
-        public void Remove(string key)
+        public void RemoveAndSave(string key)
         {
-            Data.Remove(key);
-            var path = Config.Params.GetPathForFile(key);
-            if (File.Exists(path))
-                File.Delete(path);
+            ConfigEntity.RemoveAndSave(key);
         }
 
+
         //Прочитать из файла
         public void Import()
         {
-            Config.ImportAll();
+            ConfigEntity.ImportAll();
         }
         //Сохранить в файл
         public void Export()
         {
-            Config.ExportAll();
+            ConfigEntity.ExportAll();
         }
 
         public void Delete()
         {
-            var dir = Config.Params.ConfigDirectoryInfo;
-
-            if (dir.Exists)
-                dir.Delete(true);
+            ConfigEntity.DeleteDirectory();
         }
+
     }
 }
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Services/RW_Factory.cs b/ToolPack1/Tools/Tools.ConfigurationTool/Services/RW_Factory.cs
new file mode 100644
index 0000000..8da15e4
--- /dev/null
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Services/RW_Factory.cs
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using RW_Tool.Core.Abstract;
+using RW_Tool.DataSource.FileOrStream;
+using RW_Tool.XML_BIN;
+
+namespace Tools.ConfigurationTool.Services
+{
+    public class RW_Factory       
+    {
+        /// <summary>
+        /// Получить сервис чтения/записи
+        /// </summary>
+        /// <typeparam name="T">Тип для приложения и для хранения</typeparam>
+        public I_RW_Service<T, DS_FileOrStream> Get_RW<T>(string file, EnumFormat format)
+            where T : class, new()
+        => new Factory<T>().GetRW(format, new DS_File(file));
+
+
+        /// <summary>
+        /// Получить сервис чтения/записи
+        /// </summary>
+        /// <typeparam name="T1">Тип для приложения</typeparam>
+        /// <typeparam name="T3">Тип для хранения</typeparam>
+        /// <param name="transformator">Преобразователь для чтени/записи</param>
+        public I_RW_Service<T1, DS_FileOrStream> Get_RW<T1, T3>(string file, EnumFormat format, ITransformator<T1, T3> transformator)
+            where T1 : class, new()
+            where T3 : class, new()
+        => new Factory<T1, T3>().GetRW(format, transformator, new DS_File(file));
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.ConfigurationTool/Tools.ConfigurationTool.csproj b/ToolPack1/Tools/Tools.ConfigurationTool/Tools.ConfigurationTool.csproj
index 1ce3ee4..908b8a2 100644
--- a/ToolPack1/Tools/Tools.ConfigurationTool/Tools.ConfigurationTool.csproj
+++ b/ToolPack1/Tools/Tools.ConfigurationTool/Tools.ConfigurationTool.csproj
@@ -41,12 +41,16 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="ConfigMultiple\Base\IMConfigEntity.cs" />
+    <Compile Include="Config\Base\BaseConfigEntity.cs" />
+    <Compile Include="ConfigMultiple\Base\BaseMConfigEntity.cs" />
     <Compile Include="ConfigMultiple\Custom\MConfigEntity.cs" />
     <Compile Include="ConfigMultiple\Custom\MConfigParams.cs" />
     <Compile Include="ConfigMultiple\Custom\MConfigurationManager.cs" />
     <Compile Include="ConfigMultiple\MConfigEntity.cs" />
     <Compile Include="ConfigMultiple\MConfigParams.cs" />
     <Compile Include="ConfigMultiple\MConfigurationManager.cs" />
+    <Compile Include="Config\Base\IConfigEntity.cs" />
     <Compile Include="Config\ConfigEntity.cs" />
     <Compile Include="Config\ConfigParams.cs" />
     <Compile Include="Config\ConfigurationManager.cs" />
@@ -54,7 +58,7 @@
     <Compile Include="Config\Custom\ConfigParams.cs" />
     <Compile Include="Config\Custom\ConfigurationManager.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Serializer\SerializerFactory.cs" />
+    <Compile Include="Services\RW_Factory.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\RW_Tool\RW_Tool.Core\RW_Tool.Core.csproj">
@@ -74,5 +78,6 @@
       <Name>Tools.SingletonTool</Name>
     </ProjectReference>
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>
\ No newline at end of file
diff --git a/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonManager.cs b/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonManager.cs
new file mode 100644
index 0000000..6ea602f
--- /dev/null
+++ b/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonManager.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Tools.SingletonTool.Base
+{
+
+    /// <summary>
+    /// Обертка над статичным классом
+    /// </summary>
+    /// <typeparam name="T">Тип синглтон</typeparam>
+    public interface ISignlethonManager<T>
+        where T : class, new()
+    {
+        /// <summary>
+        /// Получить экземпляр
+        /// </summary>
+        T Get { get; }
+
+        /// <summary>
+        /// Создан ли экземпляр
+        /// </summary>
+        bool ExistInstance { get; }
+    }
+}
diff --git a/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonWithParams.cs b/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonWithParams.cs
new file mode 100644
index 0000000..d6608bd
--- /dev/null
+++ b/ToolPack1/Tools/Tools.SingletonTool/Base/ISignlethonWithParams.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Tools.SingletonTool.Base
+{
+    /// <summary>
+    /// Класс выступающий в роли синглтона с параметрами должен реализовать данный интерфейс
+    /// </summary>
+    /// <typeparam name="P">Тип параметра для создания экземпляра</typeparam>
+    public interface ISignlethonWithParams<in P>
+    {
+        /// <summary>
+        /// Вместо конструктору с параметром для синглтона 
+        /// </summary>
+        void SetParams(P param);
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonManager.cs b/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonManager.cs
new file mode 100644
index 0000000..0b9dc59
--- /dev/null
+++ b/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonManager.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Tools.SingletonTool.Base;
+
+namespace Tools.SingletonTool.Manager
+{
+    /// <summary>
+    /// Синглтон
+    /// </summary>
+    /// <typeparam name="T">Тип синглот</typeparam>
+    public class SinglethonManager<T> 
+        : ISignlethonManager<T>
+        where T : class, new()
+    {
+        private static readonly Lazy<T> Single 
+            = new Lazy<T>(() => { 
+                return new T(); 
+            }, 
+                true);
+
+
+        public T Get 
+            => Single.Value;
+
+        public bool ExistInstance 
+            => Single.IsValueCreated;
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonWithParamsManager.cs b/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonWithParamsManager.cs
new file mode 100644
index 0000000..21ea10a
--- /dev/null
+++ b/ToolPack1/Tools/Tools.SingletonTool/Manager/SinglethonWithParamsManager.cs
@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+using Tools.SingletonTool.Base;
+
+
+namespace Tools.SingletonTool.Manager
+{
+    /// <summary>
+    /// Синглтон с параметром создания
+    /// </summary>
+    /// <typeparam name="T">Тип синглот</typeparam>
+    /// <typeparam name="P">Тип параметра</typeparam>
+    public class SinglethonWithParamsManager<T, P>
+        : ISignlethonManager<T>
+        where T : class, ISignlethonWithParams<P>, new()
+    {
+        private static P Param;
+        private static bool IsParamSet = false;
+
+        private static readonly Lazy<T> Single
+            = new Lazy<T>(() => {
+                if (!IsParamSet)
+                {
+                    throw new Exception("Instance not create. Use SignlethonWithParamsManager(P param) first");
+                }
+
+                T single = new T();
+                single.SetParams(Param);
+                Param = default(P);
+
+                return single;
+            }, 
+                true);
+
+
+        public SinglethonWithParamsManager() 
+        {            
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="param">Параметры для создания экземпляра. Not null</param>
+        public SinglethonWithParamsManager(P param) 
+        {
+            //Возможно добавить синхронность
+            if (!IsParamSet)
+            {
+                Param = param;
+                IsParamSet = true;
+            }
+        }
+
+        public T Get
+            => Single.Value;
+
+        public bool ExistInstance
+            => Single.IsValueCreated;
+
+    }
+}
diff --git a/ToolPack1/Tools/Tools.SingletonTool/Tools.SingletonTool.csproj b/ToolPack1/Tools/Tools.SingletonTool/Tools.SingletonTool.csproj
index 35a957e..41e99c5 100644
--- a/ToolPack1/Tools/Tools.SingletonTool/Tools.SingletonTool.csproj
+++ b/ToolPack1/Tools/Tools.SingletonTool/Tools.SingletonTool.csproj
@@ -40,9 +40,11 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Base\ISignlethonManager.cs" />
+    <Compile Include="Base\ISignlethonWithParams.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="Signlethon.cs" />
-    <Compile Include="SignlethonWithParams.cs" />
+    <Compile Include="Manager\SinglethonWithParamsManager.cs" />
+    <Compile Include="Manager\SinglethonManager.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 </Project>
\ No newline at end of file