我希望有人能在我遇到的问题上提供一些指导。我有:
在HTTP世界中,通过创建一个“消息路由”配置,对于每种消息类型,我将有一个不同的方法,也就是说,我假设URL本身包含到要用于发送消息的正确方法的路由。例如GET service.com/{serviceName}/{method}。
在websocket世界中,我没有那种奢侈,我们只能为每个客户端提供一个websocket,来自该客户端的所有消息都将被发送到一个单一的方法,在我们的例子中是onPost。现在,我仍然希望能够指定哪个方法/类应该处理该消息,但我不知道我应该使用什么模式来实现这一目标。
到目前为止,我想出的最好方法是使用模式,这样我就可以在动态中找到正确的处理程序。类似于这个伪代码的东西(在这里我的头顶上):
interface IHandler{
String forMessageType;
void ProcessMessage(message);
}
class HandlerNumberOne implements IHandler{
String forMessageType = "messageTypeOne";
void ProcessMessage(message){ ... }
}
class HandlerLocator{
static List<IHandler> handlers = Container.ResolveAll<IHandler>();
static IHandler getByMessageType(String messageType){
return handlers.First(h=>h.forMessageType == messageType);
}
}然后我将在onPost方法中使用该定位器,如下所示:
class Service{
void onPost(Message msg){
IHandler handler = HandlerLocator.getByMessageType(msg.MessageType);
handler.ProcessMessage(msg);
}
}我的同事们已经把它扔到了火里,因为他们认为Service是一个严重的反模式,因为“它隐藏了依赖关系”。然而,删除我们注入到Service构造函数中的(当前)16个处理程序类依赖项的愿望使我几乎掌握了解决这个问题的任何东西。
编辑:我认为这个问题与这问题不同,因为我问的是一个特定的场景和一个更好的模式,而链接的问题是“如何决定使用哪种模式”,这个问题的意义要广得多。
发布于 2019-02-19 21:27:52
您对服务定位器的使用很好。
你的同志们可能听过“服务定位器是反模式”,却不了解上下文。当依赖项注入更合适时,不应使用服务定位器。但是,您不能真正使用依赖注入来在运行时定位处理程序,因此这里不存在相关的反对意见。
您可能可以在一个名称下注册每个处理程序,然后使用这个名称解析它,就像Container.Resolve<IHandler>(messageType);一样--这将简化您的代码。
https://softwareengineering.stackexchange.com/questions/387446
复制相似问题