Browse Source

Data.AddDataSource

Lith 10 months ago
parent
commit
0298b12e5c

+ 40 - 16
src/Vitorm.Data/Data.cs

@@ -2,9 +2,7 @@
 using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
-using System.Reflection;
 
-using Vit.Core.Module.Log;
 using Vit.Core.Util.ConfigurationManager;
 using Vit.Core.Util.Reflection;
 using Vit.Extensions.Linq_Extensions;
@@ -18,8 +16,28 @@ namespace Vitorm
 
         static Data()
         {
-            var configs = Appsettings.json.GetByPath<List<Dictionary<string, object>>>("Vitorm.Data");
-            providerCache = configs?.Select(GetDataProvider).NotNull().ToList() ?? new();
+            var dataSourceConfigs = Appsettings.json.GetByPath<List<Dictionary<string, object>>>("Vitorm.Data");
+            var dataProviders = dataSourceConfigs?.Select(GetDataProvider).NotNull().ToList();
+
+            if (dataProviders?.Any() == true) providerCache.AddRange(dataProviders);
+        }
+
+        public static bool AddDataSource(Dictionary<string, object> dataSourceConfig)
+        {
+            var provider = GetDataProvider(dataSourceConfig);
+            if (provider == null) return false;
+
+            providerCache.Insert(0, provider);
+            providerMap.Clear();
+            return true;
+        }
+        public static void ClearDataSource(Predicate<DataProviderCache> predicate = null)
+        {
+            if (predicate != null)
+                providerCache.RemoveAll(predicate);
+            else
+                providerCache.Clear();
+            providerMap.Clear();
         }
 
 
@@ -30,43 +48,49 @@ namespace Vitorm
 
             IDataProvider GetDataProviderFromConfig(Type entityType)
             {
-                var ns = entityType.Namespace;
-                return providerCache.FirstOrDefault(cache => ns.StartsWith(cache.@namespace))?.dataProvider
+                var Namespace = entityType.Namespace;
+                return providerCache.FirstOrDefault(cache => Namespace.StartsWith(cache.@namespace))?.dataProvider
                     ?? throw new NotImplementedException("can not find config for type: " + entityType.FullName);
             }
         }
+        public static IDataProvider DataProvider(string Namespace)
+        {
+            return providerCache.FirstOrDefault(cache => Namespace.StartsWith(cache.@namespace))?.dataProvider;
+        }
         public static IDataProvider DataProvider<Entity>() => DataProvider(typeof(Entity));
 
 
-        class DataProviderCache
+        public class DataProviderCache
         {
             public IDataProvider dataProvider;
             public string @namespace;
+            public Dictionary<string, object> dataSourceConfig;
         }
 
 
-        static readonly ConcurrentDictionary<Type, IDataProvider> providerMap = new ConcurrentDictionary<Type, IDataProvider>();
+        static readonly ConcurrentDictionary<Type, IDataProvider> providerMap = new();
 
-        static List<DataProviderCache> providerCache;
+        static readonly List<DataProviderCache> providerCache = new();
 
 
-        static DataProviderCache GetDataProvider(Dictionary<string, object> config)
+        static DataProviderCache GetDataProvider(Dictionary<string, object> dataSourceConfig)
         {
-            config.TryGetValue("provider", out var provider);
-            config.TryGetValue("assemblyName", out var assemblyName);
-            config.TryGetValue("assemblyFile", out var assemblyFile);
+            dataSourceConfig.TryGetValue("provider", out var provider);
+            dataSourceConfig.TryGetValue("assemblyName", out var assemblyName);
+            dataSourceConfig.TryGetValue("assemblyFile", out var assemblyFile);
 
-            Type type = ObjectLoader.GetType(className: config["provider"] as string, assemblyName: assemblyName as string, assemblyFile: assemblyFile as string);
+            Type type = ObjectLoader.GetType(className: dataSourceConfig["provider"] as string, assemblyName: assemblyName as string, assemblyFile: assemblyFile as string);
 
             var dataProvider = type?.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) as IDataProvider;
             if (dataProvider == null) return null;
 
-            dataProvider.Init(config);
+            dataProvider.Init(dataSourceConfig);
 
             return new DataProviderCache
             {
                 dataProvider = dataProvider,
-                @namespace = config["namespace"] as string,
+                @namespace = dataSourceConfig["namespace"] as string,
+                dataSourceConfig = dataSourceConfig,
             };
         }
 

+ 9 - 7
src/Vitorm.SqlServer/SqlTranslateService.cs

@@ -171,13 +171,14 @@ namespace Vitorm.SqlServer
         public override string PrepareCreate(IEntityDescriptor entityDescriptor)
         {
             /* //sql
-CREATE TABLE user (
-  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  name varchar(100) DEFAULT NULL,
-  birth date DEFAULT NULL,
-  fatherId int DEFAULT NULL,
-  motherId int DEFAULT NULL
-) ;
+if object_id(N'[dbo].[User]', N'U') is null
+    CREATE TABLE [dbo].[User] (
+      id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+      name varchar(100) DEFAULT NULL,
+      birth date DEFAULT NULL,
+      fatherId int DEFAULT NULL,
+      motherId int DEFAULT NULL
+    ) ;
               */
             List<string> sqlFields = new();
 
@@ -188,6 +189,7 @@ CREATE TABLE user (
             entityDescriptor.columns?.ForEach(column => sqlFields.Add(GetColumnSql(column)));
 
             return $@"
+if object_id(N'{DelimitTableName(entityDescriptor)}', N'U') is null
 CREATE TABLE {DelimitTableName(entityDescriptor)} (
 {string.Join(",\r\n  ", sqlFields)}
 )";

+ 14 - 0
src/Vitorm/DataProvider/IDataProvider_Extensions.cs

@@ -0,0 +1,14 @@
+using Vitorm.DataProvider;
+using Vitorm.Sql;
+
+namespace Vit.Extensions
+{
+    public static class IDataProvider_Extensions
+    {
+        public static SqlDbContext CreateSqlDbContext(this IDataProvider dataProvider)
+        {
+            return (dataProvider as SqlDataProvider)?.CreateDbContext();
+        }
+
+    }
+}