Unity3D自学笔记——Photon服务器的后台架构实现(三)

ALI.ARPG.CommandProcessor
这里写图片描述

这里写图片描述

ICommand
命令接口,该接口为空接口,没有包含任何函数,只作为约束

public interface ICommand
    {

    }

ICommandHandler
命令角色,通过调用Data层实现具体的业务逻辑处理,这里用了TCommand泛型而没直接用ICommand,是为了后面CommandBus反射去找ICommand对应的Handler

public interface ICommandHandler<in TCommand> where TCommand : ICommand
    {
        ICommandResult Excute(TCommand command);
    }

ICommandResult
ICommandHandler执行处理的结果

public interface ICommandResult
    {
        bool Success { get; }
    }
public class CommandResult : ICommandResult
    {
        public CommandResult(bool success)
        {
            this.Success = success;
        }

        public bool Success { get; protected set; }
    }

IValidateHandler
同样为命令角色,命令执行前验证,如用户注册前需要验证用户名合法性,验证结果为IEnumerable,意味可以有多种验证错误,如长度不符合,字符非法等,返回null,则表示验证通过

public interface IValidateHandler<in TCommand> where TCommand : ICommand
    {
        IEnumerable<ValidationResult> Validate(TCommand command);
    }

ValidationResult
验证结果,这里没用接口是因为其没有具体方法,只是一个单纯的对象

public class ValidationResult
    {
        public string MemberName { get; set; }
        public string Message { get; set; }
        public ValidationResult()
        {
        }

        public ValidationResult(string memberName, string message)
        {
            this.MemberName = memberName;
            this.Message = message;
        }

        public ValidationResult(string message)
        {
            this.Message = message;
        }        
    }

ICommandBus
命令接收者,接收命令,并移交至相应的Handler进行处理。

public interface ICommandBus
    {
        ICommandResult Submit<TCommand>(TCommand command) where TCommand : ICommand;
        IEnumerable<ValidationResult> Validate<TCommand>(TCommand command) where TCommand : ICommand;
    }

CommandBus
通过反射查找对应的CommandHandler和ValidateHandler,具体实现方法为GetHandlerType
1. 遍历ALI.ARPG.DOMAIN里的所有类型
2. 查找是否有实现了TCommand对应ICommandHandler、IValidateHandler接口的类
*如
TCommad为 RegCommand : ICommand
对应的ICommandHandler 即为 ICommandHandler< RegCommand>,则遍历查找是否有类实现了该接口*
3. 反射创建该类
4. 此处应该有缓存

 public class CommandBus : ICommandBus
    {
        public ICommandResult Submit<TCommand>(TCommand command) where TCommand : ICommand
        {
            var handler = GetCommandHandler(command);
            if (!((handler != null) && handler is ICommandHandler<TCommand>))
            {
                throw new CommandHandlerNotFoundException(typeof(TCommand));
            }
            return handler.Excute(command);
        }

        public IEnumerable<ValidationResult> Validate<TCommand>(TCommand command) where TCommand : ICommand
        {
            var handler = GetValidateHandler(command);
            if (!((handler != null) && handler is IValidateHandler<TCommand>))
            {
                throw new ValidationHandlerNotFoundException(typeof(TCommand));
            }
            return handler.Validate(command);
        }

        private ICommandHandler<TCommand> GetCommandHandler<TCommand>(TCommand command) where TCommand : ICommand
        {
            Object handler = GetHandlerType(command, typeof(ICommandHandler<>));
            if (handler != null)
                return handler as ICommandHandler<TCommand>;
            return null;
        }

        private IValidateHandler<TCommand> GetValidateHandler<TCommand>(TCommand command) where TCommand : ICommand
        {
            Object handler = GetHandlerType(command, typeof(IValidateHandler<>));
            if (handler != null)
                return handler as IValidateHandler<TCommand>;
            return null;
        }

        private Object GetHandlerType<TCommand>(TCommand command, Type handlerType)
        {
            Assembly assmbly = Assembly.Load("ALI.ARPG.DOMAIN");
            Type[] types = assmbly.GetTypes();
            Type commandType = command.GetType();
            handlerType = handlerType.MakeGenericType(commandType);

            foreach (var type in types)
            {
                if (type.GetInterfaces().Length > 0 && (type.GetInterfaces()[0].Equals(handlerType)))
                {
                    var handler = Activator.CreateInstance(type);
                    return handler;
                }
            }

            return null;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值