Sic.Framework/MECF.Framework.Common/Aitex/Core/RT/DataCenter/DataManager.cs

266 lines
7.0 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Aitex.Core.RT.ConfigCenter;
using Aitex.Core.RT.DBCore;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.Util;
using Aitex.Core.WCF;
using MECF.Framework.Common.DataCenter;
using MECF.Framework.Common.FAServices;
using MECF.Framework.Common.Log;
namespace Aitex.Core.RT.DataCenter
{
public class DataManager : ICommonData
{
private ConcurrentDictionary<string, DataItem<object>> _keyValueMap;
private SortedDictionary<string, Func<object>> _dbRecorderList;
private Func<object, bool> _isSubscriptionAttribute;
private Func<MemberInfo, bool> _hasSubscriptionAttribute;
private object _locker = new object();
private LogCleaner logCleaner = new LogCleaner();
private DiskManager diskManager = new DiskManager();
public List<string> NumericDataList
{
get
{
List<string> list = new List<string>();
foreach (KeyValuePair<string, DataItem<object>> item in _keyValueMap)
{
object value = item.Value.Value;
if (value != null)
{
Type type = value.GetType();
if (type == typeof(bool) || type == typeof(double) || type == typeof(float) || type == typeof(bool) || type == typeof(int) || type == typeof(ushort) || type == typeof(short))
{
list.Add(item.Key);
}
}
}
return list;
}
}
public List<VIDItem> VidDataList
{
get
{
List<VIDItem> list = new List<VIDItem>();
foreach (KeyValuePair<string, DataItem<object>> item in _keyValueMap)
{
object value = item.Value.Value;
if (value != null)
{
Type type = value.GetType();
if (type == typeof(bool) || type == typeof(double) || type == typeof(float) || type == typeof(bool) || type == typeof(int) || type == typeof(ushort) || type == typeof(short))
{
list.Add(new VIDItem
{
DataType = type.ToString(),
Description = "",
Index = 0,
Name = item.Key,
Unit = ""
});
}
}
}
return list;
}
}
public List<string> BuiltInDataList
{
get
{
List<string> list = new List<string>();
foreach (KeyValuePair<string, DataItem<object>> item in _keyValueMap)
{
object value = item.Value.Value;
if (value != null)
{
Type type = value.GetType();
if (type == typeof(bool) || type == typeof(double) || type == typeof(float) || type == typeof(bool) || type == typeof(int) || type == typeof(ushort) || type == typeof(short) || type == typeof(string))
{
list.Add(item.Key);
}
}
}
return list;
}
}
public List<string> FullDataList => _keyValueMap.Keys.ToList();
public void Initialize()
{
Initialize(enableService: true);
}
public void Initialize(bool enableService, bool enableStats = true)
{
_dbRecorderList = new SortedDictionary<string, Func<object>>();
_keyValueMap = new ConcurrentDictionary<string, DataItem<object>>();
_isSubscriptionAttribute = (object attribute) => attribute is SubscriptionAttribute;
_hasSubscriptionAttribute = (MemberInfo mi) => mi.GetCustomAttributes(inherit: false).Any(_isSubscriptionAttribute);
DATA.InnerDataManager = this;
if (enableService)
{
Singleton<WcfServiceManager>.Instance.Initialize(new Type[1] { typeof(QueryDataService) });
}
if (enableStats)
{
Singleton<StatsDataManager>.Instance.Initialize();
}
CONFIG.Subscribe("System", "NumericDataList", () => NumericDataList);
logCleaner.Run();
diskManager.Run();
OP.Subscribe("System.DBExecute", DatabaseExecute);
}
private bool DatabaseExecute(string arg1, object[] arg2)
{
try
{
string text = (string)arg2[0];
DB.Insert(text);
LOG.Write("execute sql: " + text);
}
catch (Exception ex)
{
LOG.Write(ex);
}
return true;
}
public void Terminate()
{
logCleaner.Stop();
diskManager.Stop();
}
public Type GetDataType(string name)
{
if (_keyValueMap.ContainsKey(name))
{
object value = _keyValueMap[name].Value;
if (value != null)
{
return value.GetType();
}
}
return null;
}
public SortedDictionary<string, Func<object>> GetDBRecorderList()
{
lock (_locker)
{
return new SortedDictionary<string, Func<object>>(_dbRecorderList);
}
}
public void Subscribe<T>(T instance, string keyPrefix = null) where T : class
{
if (instance == null)
{
throw new ArgumentNullException("instance");
}
Traverse(instance, keyPrefix);
}
public void Subscribe(string key, Func<object> getter, SubscriptionAttribute.FLAG flag)
{
Subscribe(key, new DataItem<object>(getter), flag);
if (flag != SubscriptionAttribute.FLAG.IgnoreSaveDB)
{
lock (_locker)
{
_dbRecorderList[key] = getter;
}
}
}
public void Subscribe(string key, DataItem<object> dataItem, SubscriptionAttribute.FLAG flag)
{
if (string.IsNullOrWhiteSpace(key))
{
throw new ArgumentNullException("key");
}
if (_keyValueMap.ContainsKey(key))
{
throw new Exception($"Duplicated Key:{key}");
}
if (dataItem == null)
{
throw new ArgumentNullException("dataItem");
}
_keyValueMap.TryAdd(key, dataItem);
}
public Dictionary<string, object> Poll(IEnumerable<string> keys)
{
Dictionary<string, object> dictionary = new Dictionary<string, object>();
foreach (string key in keys)
{
if (_keyValueMap.ContainsKey(key))
{
dictionary[key] = _keyValueMap[key].Value;
}
}
return dictionary;
}
public object Poll(string key)
{
return _keyValueMap.ContainsKey(key) ? _keyValueMap[key].Value : null;
}
public void Traverse(object instance, string keyPrefix)
{
Parallel.ForEach(((IEnumerable<FieldInfo>)instance.GetType().GetFields()).Where((Func<FieldInfo, bool>)_hasSubscriptionAttribute), delegate(FieldInfo fi)
{
string text2 = Parse(fi);
text2 = (string.IsNullOrWhiteSpace(keyPrefix) ? text2 : $"{keyPrefix}.{text2}");
Subscribe(text2, () => fi.GetValue(instance), SubscriptionAttribute.FLAG.SaveDB);
});
Parallel.ForEach(((IEnumerable<PropertyInfo>)instance.GetType().GetProperties()).Where((Func<PropertyInfo, bool>)_hasSubscriptionAttribute), delegate(PropertyInfo property)
{
string text = Parse(property);
text = (string.IsNullOrWhiteSpace(keyPrefix) ? text : $"{keyPrefix}.{text}");
Subscribe(text, () => property.GetValue(instance, null), SubscriptionAttribute.FLAG.SaveDB);
});
}
private string Parse(MemberInfo member)
{
return _hasSubscriptionAttribute(member) ? (member.GetCustomAttributes(inherit: false).First(_isSubscriptionAttribute) as SubscriptionAttribute).Key : null;
}
public Dictionary<string, object> PollData(IEnumerable<string> keys)
{
Dictionary<string, object> dictionary = new Dictionary<string, object>();
foreach (string key in keys)
{
if (_keyValueMap.ContainsKey(key))
{
dictionary[key] = _keyValueMap[key].Value;
}
}
return dictionary;
}
}
}