Created
September 24, 2011 19:31
-
-
Save jmarnold/1239745 to your computer and use it in GitHub Desktop.
Fleck Fun
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface ICommandInvoker | |
{ | |
void InvokeFor(SocketMessage message); | |
} | |
public class CommandInvoker : ICommandInvoker | |
{ | |
public void InvokeFor(SocketMessage message) | |
{ | |
//no-op..just an example | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface IJsonService | |
{ | |
T Deserialize<T>(string source) where T : class; | |
object Deserialize(Type type, string source); | |
string Serialize(object message); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface IMessageDispatcher | |
{ | |
void Dispatch(object message); | |
} | |
public class MessageDispatcher : IMessageDispatcher | |
{ | |
private readonly IJsonService _jsonService; | |
private readonly ISocketProvider _socketProvider; | |
public MessageDispatcher(IJsonService jsonService, ISocketProvider socketProvider) | |
{ | |
_jsonService = jsonService; | |
_socketProvider = socketProvider; | |
} | |
public void Dispatch(object message) | |
{ | |
var socketMsg = new SocketMessage | |
{ | |
Type = message.GetType().Name, | |
Message = _jsonService.Serialize(message) | |
}; | |
_socketProvider.Send(_jsonService.Serialize(socketMsg)); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface ISocketMessageDeserializer | |
{ | |
object Deserialize(SocketMessage message); | |
} | |
public class SocketMessageDeserializer : ISocketMessageDeserializer | |
{ | |
private readonly DefaultSocketMessageParser _defaultParser; | |
private readonly IEnumerable<ISocketMessageParser> _parsers; | |
public SocketMessageDeserializer(DefaultSocketMessageParser defaultParser, IEnumerable<ISocketMessageParser> parsers) | |
{ | |
_defaultParser = defaultParser; | |
_parsers = parsers; | |
} | |
public object Deserialize(SocketMessage message) | |
{ | |
var type = message.Type; | |
if (!type.ToLower().EndsWith("command")) | |
{ | |
type = "{0}Command".ToFormat(type); | |
} | |
var messageType = Type.GetType("{0}.{1}, {2}".ToFormat(typeof(CommandBase).Namespace, type, | |
typeof(CommandBase).Assembly.FullName), false, true); | |
var parser = _parsers.LastOrDefault(p => p.AppliesTo(message)) ?? _defaultParser; | |
return parser.Parse(messageType, message); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface ISocketMessageParser | |
{ | |
bool AppliesTo(SocketMessage message); | |
object Parse(Type type, SocketMessage message); | |
} | |
public class DefaultSocketMessageParser : ISocketMessageParser | |
{ | |
private readonly IJsonService _jsonService; | |
public DefaultSocketMessageParser(IJsonService jsonService) | |
{ | |
_jsonService = jsonService; | |
} | |
public bool AppliesTo(SocketMessage message) | |
{ | |
return true; | |
} | |
public object Parse(Type type, SocketMessage message) | |
{ | |
return _jsonService.Deserialize(type, message.Message); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface ISocketProvider | |
{ | |
void Send(string message); | |
void Listen(); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SocketMessage | |
{ | |
public string Type { get; set; } | |
public string Version { get; set; } | |
public string Message { get; set; } | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class SocketProvider : ISocketProvider | |
{ | |
private readonly IJsonService _jsonService; | |
private readonly ICommandInvoker _commandInvoker; | |
private readonly IList<IWebSocketConnection> _connections = new List<IWebSocketConnection>(); | |
public SocketProvider(WebSocketServer server, IJsonService jsonService, ICommandInvoker commandInvoker) | |
{ | |
Configure(server); | |
_jsonService = jsonService; | |
_commandInvoker = commandInvoker; | |
} | |
public void Configure(WebSocketServer server) | |
{ | |
server.Start(socket => | |
{ | |
socket.OnOpen = () => _connections.Add(socket); | |
socket.OnClose = () => _connections.Remove(socket); | |
socket.OnMessage = (m => | |
{ | |
var msg = _jsonService.Deserialize<SocketMessage>(m); | |
_commandInvoker.InvokeFor(msg); | |
}); | |
}); | |
} | |
public void Listen() | |
{ | |
// this is here for semantics. We need to move the configure stuff into here | |
} | |
public void Send(string message) | |
{ | |
_connections | |
.ToList() | |
.Each(socket => socket.Send(message)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment