123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- namespace ET
- {
- /// <summary>
- /// Config组件会扫描所有的有ConfigAttribute标签的配置,加载进来
- /// </summary>
- public class ConfigComponent: Singleton<ConfigComponent>
- {
- public struct GetAllConfigBytes
- {
- }
-
- public struct GetOneConfigBytes
- {
- public string ConfigName;
- }
-
- private readonly Dictionary<Type, ISingleton> allConfig = new Dictionary<Type, ISingleton>();
- public override void Dispose()
- {
- foreach (var kv in this.allConfig)
- {
- kv.Value.Destroy();
- }
- }
- public object LoadOneConfig(Type configType)
- {
- this.allConfig.TryGetValue(configType, out ISingleton oneConfig);
- if (oneConfig != null)
- {
- oneConfig.Destroy();
- }
-
- byte[] oneConfigBytes = EventSystem.Instance.Invoke<GetOneConfigBytes, byte[]>(new GetOneConfigBytes() {ConfigName = configType.FullName});
- object category = SerializeHelper.Deserialize(configType, oneConfigBytes, 0, oneConfigBytes.Length);
- ISingleton singleton = category as ISingleton;
- singleton.Register();
-
- this.allConfig[configType] = singleton;
- return category;
- }
-
- public void Load()
- {
- this.allConfig.Clear();
- Dictionary<Type, byte[]> configBytes = EventSystem.Instance.Invoke<GetAllConfigBytes, Dictionary<Type, byte[]>>(new GetAllConfigBytes());
- foreach (Type type in configBytes.Keys)
- {
- byte[] oneConfigBytes = configBytes[type];
- this.LoadOneInThread(type, oneConfigBytes);
- }
- }
-
- public async ETTask LoadAsync()
- {
- this.allConfig.Clear();
- Dictionary<Type, byte[]> configBytes = EventSystem.Instance.Invoke<GetAllConfigBytes, Dictionary<Type, byte[]>>(new GetAllConfigBytes());
- using ListComponent<Task> listTasks = ListComponent<Task>.Create();
-
- foreach (Type type in configBytes.Keys)
- {
- byte[] oneConfigBytes = configBytes[type];
- Task task = Task.Run(() => LoadOneInThread(type, oneConfigBytes));
- listTasks.Add(task);
- }
- await Task.WhenAll(listTasks.ToArray());
- }
-
- private void LoadOneInThread(Type configType, byte[] oneConfigBytes)
- {
- object category = SerializeHelper.Deserialize(configType, oneConfigBytes, 0, oneConfigBytes.Length);
- Log.Debug($"Deserialize: {configType} ok");
- lock (this)
- {
- ISingleton singleton = category as ISingleton;
- singleton.Register();
- this.allConfig[configType] = singleton;
- }
- }
- }
- }
|