| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- using System;
- using System.Collections.Generic;
- using System.Threading.Tasks;
- namespace ETModel
- {
- [ObjectSystem]
- public class ActorMessageDispatherComponentStartSystem : AwakeSystem<ActorMessageDispatherComponent>
- {
- public override void Awake(ActorMessageDispatherComponent self)
- {
- self.Awake();
- }
- }
- [ObjectSystem]
- public class ActorMessageDispatherComponentLoadSystem : LoadSystem<ActorMessageDispatherComponent>
- {
- public override void Load(ActorMessageDispatherComponent self)
- {
- self.Load();
- }
- }
- /// <summary>
- /// Actor消息分发组件
- /// </summary>
- public class ActorMessageDispatherComponent : Component
- {
- private Dictionary<Type, IMActorHandler> handlers;
-
- public void Awake()
- {
- this.Load();
- }
- public void Load()
- {
- AppType appType = this.Entity.GetComponent<StartConfigComponent>().StartConfig.AppType;
- Log.Info("apptype: " + appType);
- this.handlers = new Dictionary<Type, IMActorHandler>();
- Type[] types = DllHelper.GetMonoTypes();
- foreach (Type type in types)
- {
- object[] attrs = type.GetCustomAttributes(typeof(ActorMessageHandlerAttribute), false);
- if (attrs.Length == 0)
- {
- continue;
- }
- ActorMessageHandlerAttribute messageHandlerAttribute = (ActorMessageHandlerAttribute)attrs[0];
- if (!messageHandlerAttribute.Type.Is(appType))
- {
- continue;
- }
- object obj = Activator.CreateInstance(type);
- IMActorHandler imHandler = obj as IMActorHandler;
- if (imHandler == null)
- {
- throw new Exception($"message handler not inherit AMEvent or AMRpcEvent abstract class: {obj.GetType().FullName}");
- }
- Type messageType = imHandler.GetMessageType();
- handlers.Add(messageType, imHandler);
- }
- }
- public IMActorHandler GetActorHandler(Type type)
- {
- this.handlers.TryGetValue(type, out IMActorHandler actorHandler);
- return actorHandler;
- }
- public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, IMessage message)
- {
- if (!this.handlers.TryGetValue(message.GetType(), out IMActorHandler handler))
- {
- throw new Exception($"not found message handler: {MongoHelper.ToJson(message)}");
- }
-
- await handler.Handle(session, entity, actorRequest, message);
- }
- public override void Dispose()
- {
- if (this.IsDisposed)
- {
- return;
- }
- base.Dispose();
- }
- }
- }
|