首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用什么模式来实现消息路由机制?

我应该使用什么模式来实现消息路由机制?
EN

Software Engineering用户
提问于 2019-02-19 18:33:36
回答 1查看 193关注 0票数 0

我希望有人能在我遇到的问题上提供一些指导。我有:

  • 一个WebSocket服务,在服务器上只有一个处理所有通信量的方法。
  • 很多不同类型的消息,每个消息都有一个“类型”,我们根据这个值选择要使用的处理程序类。

在HTTP世界中,通过创建一个“消息路由”配置,对于每种消息类型,我将有一个不同的方法,也就是说,我假设URL本身包含到要用于发送消息的正确方法的路由。例如GET service.com/{serviceName}/{method}

在websocket世界中,我没有那种奢侈,我们只能为每个客户端提供一个websocket,来自该客户端的所有消息都将被发送到一个单一的方法,在我们的例子中是onPost。现在,我仍然希望能够指定哪个方法/类应该处理该消息,但我不知道我应该使用什么模式来实现这一目标。

到目前为止,我想出的最好方法是使用模式,这样我就可以在动态中找到正确的处理程序。类似于这个伪代码的东西(在这里我的头顶上):

代码语言:javascript
复制
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方法中使用该定位器,如下所示:

代码语言:javascript
复制
class Service{

    void onPost(Message msg){

        IHandler handler = HandlerLocator.getByMessageType(msg.MessageType);
        handler.ProcessMessage(msg);
    }
}

我的同事们已经把它扔到了火里,因为他们认为Service是一个严重的反模式,因为“它隐藏了依赖关系”。然而,删除我们注入到Service构造函数中的(当前)16个处理程序类依赖项的愿望使我几乎掌握了解决这个问题的任何东西。

  • 是否有我丢失的带有webocket的消息路由插件?我希望能够发送一条消息到URL路径,并让它由一个独特的方法自动处理。
  • (我的主要问题是:)我是否有什么众所周知的模式可以解决我们的困境?
  • 为什么服务定位器模式比消息路由更糟糕?在我看来,基于路径值将消息路由到服务中的方法恰恰是服务定位器模式,对此我错了吗?

编辑:我认为这个问题与问题不同,因为我问的是一个特定的场景和一个更好的模式,而链接的问题是“如何决定使用哪种模式”,这个问题的意义要广得多。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-02-19 21:27:52

您对服务定位器的使用很好。

你的同志们可能听过“服务定位器是反模式”,却不了解上下文。当依赖项注入更合适时,不应使用服务定位器。但是,您不能真正使用依赖注入来在运行时定位处理程序,因此这里不存在相关的反对意见。

您可能可以在一个名称下注册每个处理程序,然后使用这个名称解析它,就像Container.Resolve<IHandler>(messageType);一样--这将简化您的代码。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/387446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档