2016-08-23 77 views
0

我正在努力寻找最好的设置我的项目。我有一个GameSessionServer - 类负责JSON请求处理和注册的处理程序..现在我有底部插槽处理器处理器(类的一部分):泛型vs基类

public WebSocketResponse HandleRequest(RequestDto request, GameSessionServer server) 
    { 
     TrySetThreadCulture(request); 
     EnsureUserStoredInSession(server.SessionContext, false, SlotIsEngineRNG(server.SessionContext.SystemGameId)); 

     // custom request handling 
     WebSocketResponse wsr = HandleRequestInternal(request, server); 

     // save the last handler 
     server.SessionContext.Items[typeof(WebSocketHandler)] = this; 
     return wsr; 
    } 

它应该是一个RequestDto基类参数或通用RequestDto ?????? 在一个具体的处理我也铸造RequestDto的具体类型喜欢这里:

protected override WebSocketResponse HandleRequestInternal(RequestDto request, GameSessionServer server) 
    { 
     CasinoSpinRequestDto spinRequest = request as CasinoSpinRequestDto; 

     int TotalBetInCents = (spinRequest.SpinType != "free") ? spinRequest.TotalBet : 0; 
     JsonResult JR = null; 

     CasinoSpinResponseDto spinResponse = new CasinoSpinResponseDto(); 
     switch (spinRequest.SpinType) 
     { 
      case "regular": 
       JR = PlayBetSpin(spinRequest, server); 
       break; 
      case "free": 
       JR = PlayFreeSpin(spinRequest, server.SessionContext); 
       break; 
     } 

     // set balance in cents 
     spinResponse.Credit = JR.BalanceInCents; 

     SlotEngineRNG engineRNG; 
     sbyte[,] wheels = (JR is SpinJsonResult) ? ((SpinJsonResult) JR).Wheels : ((BonusJsonResult) JR).FreeSpin.Wheels; 
     int rsId = (JR is SpinJsonResult) ? 0 : ((BonusJsonResult) JR).FreeSpin.ReelId; 

     if (SlotIsEngineRNG(server.SessionContext.SystemGameId, out engineRNG)) 
     { 
      GameSettingInfo gsi = DataBuffer.Instance.GetGameSetting(server.SessionContext.UserGroupId, (int) server.SessionContext.SystemGameId); 
      spinResponse.Results = CalculateWheelPositionsRNG(wheels , rsId , engineRNG, gsi); 
     } else 
     { 
      int[] pos; 
      PosHoldersFactory.GetSlotPositions(server.SessionContext.SystemGameId, wheels, rsId, out pos); 
      spinResponse.Results = pos; 
     } 

..........................如果你需要更多的澄清

interface IWebRequestHandler 
{ 
    bool CanHandle(RequestDto request); // assuming the request dto is the base class 

    WebSocketResponse Handle(RequestDto request, GameSessionServer server); 
} 

class CasinoSpinRequestHandler : IWebRequestHandler 
{ 
    bool CanHandle(RequestDto request) 
    { 
     return request is CasinoSpinRequestDto; 
    } 

    WebSocketResponse Handle(RequestDto request, GameSessionServer server) 
    { 
     var spinRequest = request as CasinoSpinRequestDto; 

     if (spinRequest == null) throw new ArgumentNullException("Incorrect usage of the handler"); 

     // do your specific spin request code here 
    } 
} 

public WebSocketResponse HandleRequest(RequestDto request, GameSessionServer server) 
{ 
    TrySetThreadCulture(request); 
    EnsureUserStoredInSession(server.SessionContext, false, SlotIsEngineRNG(server.SessionContext.SystemGameId)); 

    var handlerStrategies = this.GetType().Assembly.GetTypes().Where(x => typeof(IWebRequestHandler).IsAssignableFrom(x)).Select(x => Activator.CreateInstance(x)).Cast<IWebRequestHandler>().ToList(); 
    // the above is poor man DI, you can just put in the constructor ctor(IEnumerable<IWebRequestHandler>) 
    // if your DI supports it, otherwise you can abstract the code above to a 
    // static class so it only gets called once. 

    var handler = handlerStrategies.FirstOrDefault(x => x.CanHandle(request)); 

    if (handler == null) throw new Exception("Unable to handle this particular request"); 

    // custom request handling 
    var wsr = handler.Handle(request, server); 

    // the consuming of the handler can also be abstracted to a delegate class 
    // which merely has the responsibility of sorting out which handler to use 

    // save the last handler 
    server.SessionContext.Items[typeof(WebSocketHandler)] = this; 
    return wsr; 
} 

,只是具体哪一部分:......

+1

基类对于不重复过程或过程是很好的,所以如果有重复,并且**不依赖于特定的RequestDto,那么确定它是通用的。您通常可以知道是否需要泛型,因为您需要访问RequestDto上的某些属性(例如,如果它只是一个“Id”字段,那么您可以将它放在一个接口上并约束泛型参数) –

+0

这取决于你的用例,我认为我们没有足够的上下文来评论。据推测,如果你当前的代码编译和工作,那么你不需要任何方法或属性在你的类的通用版本? –

+0

这似乎很奇怪,你似乎正在编写自己的网络服务器....我认为微软有一个内置的HttpServer为此... –

回答

0

所以,你可以使用策略模式。

+0

好吧,我现在看到了。谢谢 –