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;
}
,只是具体哪一部分:......
基类对于不重复过程或过程是很好的,所以如果有重复,并且**不依赖于特定的RequestDto,那么确定它是通用的。您通常可以知道是否需要泛型,因为您需要访问RequestDto上的某些属性(例如,如果它只是一个“Id”字段,那么您可以将它放在一个接口上并约束泛型参数) –
这取决于你的用例,我认为我们没有足够的上下文来评论。据推测,如果你当前的代码编译和工作,那么你不需要任何方法或属性在你的类的通用版本? –
这似乎很奇怪,你似乎正在编写自己的网络服务器....我认为微软有一个内置的HttpServer为此... –