WeiXin组件Senpac(三)【请求响应上下文设计】

请求

首先是对请求的封装,顶一个了一个所有实体的基础接口,但这个接口没有任何实现。

public interface IEntityBase
{
}

关于消息有这个一个基础接口。

public interface IMessageBase : IEntityBase
{
    string ToUserName{get;set;}
    string FromUserName{get;set;}
    DateTime CreateTime{get;set;}
}
public abstract class MessageBase : IMessageBase
{
    public string ToUserName{get;set;}
    public string FromUserName{get;set;}
    public DateTime CreateTime{get;set;}
    public override string ToStirng(){
        return base.ToString();
    }
}

请求基础级接口。

public interface IRequestMessageBase : IMessageBase
{
    long MsgId{get;set;}
}

请求基础基类,实现请求基础接口,同时继承消息基类的抽象类。

public abstract class RequestMessageBase  : MessageBase, IRequestMessageBase
{
    public RequestMessageBase(){}
    public long MsgId{get;set;}
}

响应

响应的基础接口。

public inteface IResponseMessageBase : IMessageBase
{
}

响应的基类抽象类。

public abstract class ResponseMessageBase  : MessageBase, IResponseMessageBase
{
    
}

上下文就是对请求和响应的封装,或者说连接

public interface IMessageContext<TRequest, TResponse> where TRequest : IRequestMessageBase hwere TResponse : IResponseMessageBase
{
    string UserName{get;set;}
    DateTime LastActiveTime{get;set;}
    MessageContainer<TRequest> RequestMessages{get;set;}
    MessageContainers<TResponse> ResponseMessages{get;set;}
    int MaxRecourdCount{get;set;}
    object StorageData{get;set;}
    Double? ExpireMinutes{get;set;}
    AppStoreState AppStoreState{get;set;}
    event EventHandler<WeixinContextRemovedEventArgs<TRequest, TResponse>> MessageContextRemoved;
    void OnRemoved();
}
//消息容器
public class MessageContianer<T> : List<T>
{
    public int MaxRecourdCount{get;set;}
    public MessageContainer(){}
    public MessageContainer(int maxRecordCount)
    {
        MaxRecordCount = maxRecourdCount;
    }
    public new void Add(T item)
    {
        base.Add(item);
        RemoveExpressItems();
    }
    private void RemoveExpressItems()
    {
        if(MaxRecourdCount > 0 && base.Count > MaxRecourdCount)
        {
            base.RemoveRange(0, base.Count-MaxRecordCount);
        }
    }
    public new void AddRange(IEnumerable<T> collection)
    {
        base.AddRange(collection);
        RemoveExpressItems();
    }
    public new void Insert(int index, T item)
    {
        base.Insert(index, item);
        RemoveExpressItems();
    }
    public new void InsertRange(int index, IEnumerable<T> collection)
    {
        base.InsertRange(index, collection);
        RemoveExpressItems();
    }
}
public enum AppStoreState
{
    None =1,
    Enter=2,
    Exit=4
}
public class WeixinContextRemovedEventArgs<TRequest, TResponse> : EventArgs where TRequest : IRequestMessageBase where TResponse : IResponseMessageBase
{
    public IMessageContext<TRequest, TResponse> MessageContext{get;set;}
    public WeixinContextRemovedEventArgs(IMessageContext<TRequest, TResponse> messageContext)
    {
        MessageContext = messageContext;
    }
    public string OpenId{
        get
        {
            return MessageContext.UseerName;
        }
    }
    public DateTime LastActiveTime
    {
        get{
            return MessagteContext.LastActiveTime;
        }
    }
}

上下文基类。

public class MessageContext<TReqest, TResponse> : IMessageContext<TRequest, TResponse> where TRequest : IRequestMessageBase where TResponse : IResponseMessageBase
{
    public string UserName{get;set;}
    public DateTime LastActiveTime{get;set;}
    public MessageContainer<TRequest> RequestMessages{get;set;}
    public MessageContainer<TResponse> ResponseMessages{get;set;}
    public int MaxRecourdCount
    {
        get
        {
            return _maxRecourdCount;
        }
        set
        {
            RequestMessages.MaxRecourdCount = valsue;
            ResponseMessages.MaxRecordCount = value;
            _maxRecourdCOunt = value;
        }
    }
    public object StorageData{get;set;}
    public Double? ExpireMinutes{get;set;}
    public AppStoreState AppStoreState{get;set;}
    public virutal event EventHandler<WeixinContextRemovedEventArgs<TRequest, TResponse>> MessageContextRemoved = null;
    public MessageContext()
    {
        RequestMessages = new MessageContainer<TRequest>(MaxRecourdCount);
        ResponseMessages = new MessageContianer<TResponse>(MaxRecourdCount);
        LastActiveTime = DateTime.Now;
    }
    public virutal void OnRemoved()
    {
        var onRemovedArg = new WeixinContextRemovedEventArgs<TRequest, TResponse>(this);
        OnMessageContextRemoved(onRemovedArg);
    }
}

总之,上下文管理着所有的请求响应信息、用户信息、删除上下文的动作等。

请求响应处理

处理的基接口。

public interface IMessageHandler : IMessageHandler<IRequestMessageBase, IResponseMessageBase>
{
    new IRequestMessageBase RequestMessage{get;set;}
    new IResponseMessageBase ResponseMessage{get;set;}
}

Handler的目标是处理请求,返回响应。

public abastract partial class MessageHandler<TC>
{
    public virutal IResponseMessageBase OnEventRequest(IRequestMessageEventBase requestMessage)
    {
        IResponseMessageBase responseMessage = null;
        var strongRequestMessage = RequestMessage as IRequestMessageEventBase;
        switch(strongRequestMessage.Event)
        {
            case Event.ENTER:
                responseMessage=OnEvent_EnterRequest(RequestmESSAGE AS RequestMessageEvent_Enter);
                break;
        }
        return responseMessage;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值