请求
首先是对请求的封装,顶一个了一个所有实体的基础接口,但这个接口没有任何实现。
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;
}
}