Lith 7 mesiacov pred
rodič
commit
55ef231e50
2 zmenil súbory, kde vykonal 80 pridanie a 47 odobranie
  1. 76 46
      src/Vitorm.Data/Data.DataSource.cs
  2. 4 1
      src/Vitorm.Data/Data.cs

+ 76 - 46
src/Vitorm.Data/Data.DataSource.cs

@@ -17,6 +17,52 @@ namespace Vitorm
         public partial class DataSource
         {
 
+
+            #region DataProvider
+
+            readonly ConcurrentDictionary<Type, IDataProvider> entityProviderMap = new();
+
+            readonly List<DataProviderCache> providerCache = new();
+            DataProviderCache CreateDataProvider(Dictionary<string, object> dataProviderConfig)
+            {
+                /*
+                "provider": "Vitorm.Sqlite.DataProvider",
+                "assemblyName": "Vitorm.Sqlite",
+                "assemblyFile": "Vitorm.Sqlite.dll",
+                 */
+
+                object temp;
+                string provider = dataProviderConfig.TryGetValue("provider", out temp) ? temp as string : null;
+                string assemblyName = dataProviderConfig.TryGetValue("assemblyName", out temp) ? temp as string : null;
+                string assemblyFile = dataProviderConfig.TryGetValue("assemblyFile", out temp) ? temp as string : null;
+
+                Type providerType;
+                IDataProvider dataProvider;
+
+                // #1 load
+                providerType = ObjectLoader.GetType(className: provider, assemblyName: assemblyName, assemblyFile: assemblyFile);
+                dataProvider = providerType?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) as IDataProvider;
+
+                // #2 try load by database type (Sqlite/MySql/SqlServer)
+                if (dataProvider == null)
+                {
+                    providerType = ObjectLoader.GetType(className: $"Vitorm.{provider}.DataProvider", assemblyName: $"Vitorm.{provider}", assemblyFile: $"Vitorm.{provider}.dll");
+                    dataProvider = providerType?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) as IDataProvider;
+                }
+
+
+                if (dataProvider == null) return null;
+
+                dataProvider.Init(dataProviderConfig);
+                return new DataProviderCache(dataProvider, dataProviderConfig);
+            }
+
+
+            #endregion
+
+            #region  AddDataProvider 
+
+
             /// <summary>
             /// Data.Init("appsettings.Development.json")
             /// </summary>
@@ -32,26 +78,48 @@ namespace Vitorm
                 var dataProviderConfigs = json.GetByPath<List<Dictionary<string, object>>>(configPath);
                 return AddDataProviders(dataProviderConfigs);
             }
+
             public virtual DataSource AddDataProviders(IEnumerable<Dictionary<string, object>> dataProviderConfigs)
             {
                 var dataProviders = dataProviderConfigs?.Select(CreateDataProvider).NotNull().ToList();
 
                 if (dataProviders?.Any() == true) providerCache.AddRange(dataProviders);
 
-                providerMap.Clear();
+                entityProviderMap.Clear();
 
                 return this;
             }
 
-            public virtual bool AddDataProvider(Dictionary<string, object> dataProviderConfig)
+            /// <summary>
+            /// insert to header of DataProvider list
+            /// </summary>
+            /// <param name="dataProviderConfig"></param>
+            /// <returns></returns>
+            public virtual bool InsertDataProvider(Dictionary<string, object> dataProviderConfig)
             {
                 var provider = CreateDataProvider(dataProviderConfig);
                 if (provider == null) return false;
 
                 providerCache.Insert(0, provider);
-                providerMap.Clear();
+                entityProviderMap.Clear();
                 return true;
             }
+
+            /// <summary>
+            /// insert to tail of DataProvider list
+            /// </summary>
+            /// <param name="dataProviderConfig"></param>
+            /// <returns></returns>
+            public virtual bool AddDataProvider(Dictionary<string, object> dataProviderConfig)
+            {
+                var provider = CreateDataProvider(dataProviderConfig);
+                if (provider == null) return false;
+
+                providerCache.Add(provider);
+                entityProviderMap.Clear();
+                return true;
+            }
+
             public virtual void ClearDataProviders(Predicate<DataProviderCache> predicate = null)
             {
                 if (predicate != null)
@@ -59,16 +127,17 @@ namespace Vitorm
                 else
                     providerCache.Clear();
 
-                providerMap.Clear();
+                entityProviderMap.Clear();
             }
+            #endregion
 
 
-            #region DataProvider
+            #region GetDataProvider
 
             public virtual IDataProvider DataProvider<Entity>() => DataProvider(typeof(Entity));
             public virtual IDataProvider DataProvider(Type entityType)
             {
-                return providerMap.GetOrAdd(entityType, GetDataProviderFromConfig);
+                return entityProviderMap.GetOrAdd(entityType, GetDataProviderFromConfig);
             }
             private IDataProvider GetDataProviderFromConfig(Type entityType)
             {
@@ -87,48 +156,9 @@ namespace Vitorm
                 return providerCache.FirstOrDefault(cache => cache.name == nameOrNamespace || cache.Match(nameOrNamespace))?.dataProvider;
             }
 
-
-            readonly ConcurrentDictionary<Type, IDataProvider> providerMap = new();
-
-            readonly List<DataProviderCache> providerCache = new();
-
-
-            DataProviderCache CreateDataProvider(Dictionary<string, object> dataProviderConfig)
-            {
-                /*
-                "provider": "Vitorm.Sqlite.DataProvider",
-                "assemblyName": "Vitorm.Sqlite",
-                "assemblyFile": "Vitorm.Sqlite.dll",
-                 */
-
-                object temp;
-                string provider = dataProviderConfig.TryGetValue("provider", out temp) ? temp as string : null;
-                string assemblyName = dataProviderConfig.TryGetValue("assemblyName", out temp) ? temp as string : null;
-                string assemblyFile = dataProviderConfig.TryGetValue("assemblyFile", out temp) ? temp as string : null;
-
-                Type providerType;
-                IDataProvider dataProvider;
-
-                // #1 load
-                providerType = ObjectLoader.GetType(className: provider, assemblyName: assemblyName, assemblyFile: assemblyFile);
-                dataProvider = providerType?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) as IDataProvider;
-
-                // #2 try load by database type (Sqlite/MySql/SqlServer)
-                if (dataProvider == null)
-                {
-                    providerType = ObjectLoader.GetType(className: $"Vitorm.{provider}.DataProvider", assemblyName: $"Vitorm.{provider}", assemblyFile: $"Vitorm.{provider}.dll");
-                    dataProvider = providerType?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) as IDataProvider;
-                }
-
-
-                if (dataProvider == null) return null;
-
-                dataProvider.Init(dataProviderConfig);
-                return new DataProviderCache(dataProvider, dataProviderConfig);
-            }
+            #endregion
 
 
-            #endregion
 
 
 

+ 4 - 1
src/Vitorm.Data/Data.cs

@@ -59,12 +59,15 @@ namespace Vitorm
             });
         }
 
+        #region DataProvider
+
         public static bool AddDataProvider(Dictionary<string, object> dataProviderConfig) => dataSource.AddDataProvider(dataProviderConfig);
+        public static void AddDataProviders(IEnumerable<Dictionary<string, object>> dataProviderConfigs) => dataSource.AddDataProviders(dataProviderConfigs);
 
         public static void ClearDataProviders(Predicate<DataProviderCache> predicate = null) => dataSource.ClearDataProviders(predicate);
 
 
-        #region DataProvider
+
 
         public static IDataProvider DataProvider<Entity>() => dataSource.DataProvider<Entity>();
         public static IDataProvider DataProvider(Type entityType) => dataSource.DataProvider(entityType);