|
@@ -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
|
|
|
|
|
|
|
|
|
|