AMHandler.cs 1.6 KB
Newer Older
T
tanghai 已提交
1 2 3 4
using System;

namespace Model
{
5
	public abstract class AMHandler<Message>: IMHandler where Message : AMessage
T
tanghai 已提交
6 7 8
	{
		protected abstract void Run(Session session, Message message);

9
		public void Handle(Session session, AMessage msg)
T
tanghai 已提交
10
		{
11
			Message message = msg as Message;
T
tanghai 已提交
12 13
			if (message == null)
			{
14
				Log.Error($"消息类型转换错误: {msg.GetType().Name} to {typeof (Message).Name}");
T
tanghai 已提交
15 16 17 18 19 20
			}
			this.Run(session, message);
		}

		public Type GetMessageType()
		{
21
			return typeof (Message);
T
tanghai 已提交
22 23 24
		}
	}

25
	public abstract class AMRpcHandler<Request, Response>: IMHandler where Request : ARequest where Response : AResponse
T
tanghai 已提交
26 27 28 29 30 31 32 33 34 35 36
	{
		protected static void ReplyError(Response response, Exception e, Action<Response> reply)
		{
			Log.Error(e.ToString());
			response.Error = ErrorCode.ERR_RpcFail;
			response.Message = e.ToString();
			reply(response);
		}

		protected abstract void Run(Session session, Request message, Action<Response> reply);

37
		public void Handle(Session session, AMessage message)
T
tanghai 已提交
38 39 40
		{
			try
			{
41
				Request request = message as Request;
T
tanghai 已提交
42 43
				if (request == null)
				{
44
					Log.Error($"消息类型转换错误: {message.GetType().Name} to {typeof (Request).Name}");
T
tanghai 已提交
45 46 47 48 49 50 51 52
				}
				this.Run(session, request, response =>
				{
					// 等回调回来,session可以已经断开了,所以需要判断session id是否为0
					if (session.Id == 0)
					{
						return;
					}
53 54
					response.RpcId = request.RpcId;
					session.Reply(response);
T
tanghai 已提交
55 56 57 58
				});
			}
			catch (Exception e)
			{
59
				throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
T
tanghai 已提交
60 61 62 63 64
			}
		}

		public Type GetMessageType()
		{
65
			return typeof (Request);
T
tanghai 已提交
66 67 68
		}
	}
}