SubCommandBase.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket.SocketBase;
  6. using SuperSocket.SocketBase.Command;
  7. using SuperSocket.SocketBase.Protocol;
  8. namespace SuperWebSocket.SubProtocol
  9. {
  10. /// <summary>
  11. /// SubCommand base
  12. /// </summary>
  13. public abstract class SubCommandBase : SubCommandBase<WebSocketSession>
  14. {
  15. }
  16. /// <summary>
  17. /// SubCommand base
  18. /// </summary>
  19. /// <typeparam name="TWebSocketSession">The type of the web socket session.</typeparam>
  20. public abstract class SubCommandBase<TWebSocketSession> : ISubCommand<TWebSocketSession>, ISubCommandFilterLoader
  21. where TWebSocketSession : WebSocketSession<TWebSocketSession>, new()
  22. {
  23. #region ISubCommand Members
  24. /// <summary>
  25. /// Gets the name.
  26. /// </summary>
  27. public virtual string Name
  28. {
  29. get { return this.GetType().Name; }
  30. }
  31. void ISubCommand<TWebSocketSession>.ExecuteCommand(TWebSocketSession session, SubRequestInfo requestInfo)
  32. {
  33. var filters = m_Filters;
  34. if (filters == null || filters.Length == 0)
  35. {
  36. ExecuteCommand(session, requestInfo);
  37. return;
  38. }
  39. var commandContext = new CommandExecutingContext();
  40. commandContext.Initialize(session, requestInfo, this);
  41. for (var i = 0; i < filters.Length; i++)
  42. {
  43. var filter = filters[i];
  44. filter.OnCommandExecuting(commandContext);
  45. if (commandContext.Cancel)
  46. break;
  47. }
  48. if (!commandContext.Cancel)
  49. {
  50. ExecuteCommand(session, requestInfo);
  51. for (var i = 0; i < filters.Length; i++)
  52. {
  53. var filter = filters[i];
  54. filter.OnCommandExecuted(commandContext);
  55. }
  56. }
  57. }
  58. /// <summary>
  59. /// Executes the command.
  60. /// </summary>
  61. /// <param name="session">The session.</param>
  62. /// <param name="requestInfo">The request info.</param>
  63. public abstract void ExecuteCommand(TWebSocketSession session, SubRequestInfo requestInfo);
  64. #endregion
  65. private SubCommandFilterAttribute[] m_Filters;
  66. void ISubCommandFilterLoader.LoadSubCommandFilters(IEnumerable<SubCommandFilterAttribute> globalFilters)
  67. {
  68. var filters = new List<SubCommandFilterAttribute>();
  69. if (globalFilters.Any())
  70. {
  71. filters.AddRange(globalFilters);
  72. }
  73. var commandFilters = this.GetType().GetCustomAttributes(true).OfType<SubCommandFilterAttribute>().ToArray();
  74. if (commandFilters.Any())
  75. {
  76. filters.AddRange(commandFilters);
  77. }
  78. m_Filters = filters.OrderBy(f => f.Order).ToArray();
  79. }
  80. }
  81. }