当前位置: 首页 > 知识库问答 >
问题:

隐藏接口后面的服务总线实现

翟青青
2023-03-14

我目前正在从事一个项目,该项目允许第三方连接到我们产品的消息代理。任务是提供一个第三方可以使用的库。我希望能够将公共交通或NServiceBus与之一起打包,但我希望将该细节隐藏在接口后面。

我把服务车藏起来了。。。

public class MyServiceBus : IServiceBus {

  private readonly MassTransit.IBus _bus;
  private readonly MassTransit.IBusControl _busControl;

  public PanelSawServiceBus(MassTransit.IBus bus, MassTransit.IBusControl busControl) {
     _bus = bus;
     _busControl = busControl;
  }

  public Task PublishAsync<T>(T message, CancellationToken token = default(CancellationToken)) where T : class =>
     _bus.Publish(message, token);

  public Task SendAsync<T>(T message, CancellationToken token = default(CancellationToken)) where T : class =>
     (_bus as ISendEndpointProvider)?.Send(message, token);

  public Task StartAsync() => _busControl.StartAsync();
  public Task StopAsync() => _busControl.StopAsync();
}

供应商不应该被允许发布/发送消息,而应该只消费。如何隐藏消息的消费,以便打包服务总线库而不暴露正在使用的库?

编辑1使用大众交通消费消息如下所示

public class MyConsumer : IConsumer<SomeMessage> {
    public Task Consume(ConsumeContext<SomeMessage> ctx) => Task.CompletedTask;
}

在引导过程中,当您创建服务总线实例时,您可以定义您的消费者(当您收到消息时,公共交通将构建消费者)。

var busControl = Bus.Factory.CreateUsingInMemory(config => {
    config.ReceiveEndpoint("queue_name", endpointCfg => {
        endpointCfg.Consumer<MyConsumer>();
    }
};

我希望包装器能让开发人员说“使用队列工厂,我想用这个队列名称构造一个实例,下面是实现隐藏总线技术接口的使用者接口的类型名称。”我只是不知道我是否可以隐藏消费者。

共有1个答案

白灿
2023-03-14

如果我理解正确的话,您希望避免代码耦合到NServiceBus或MassTransit,并且不想公开您正在使用的代码。

首先,解耦:
您已经通过定义自己的IServiceBus接口完成了部分工作。只要您的库只依赖于该接口而不依赖于任何实现,您就不应该耦合到任何一个。

为了确保避免这种耦合,我将在单独的项目/库中保留具体的实现。您的“核心”域也不应直接引用。如果您可以在没有任何具体实现的情况下对代码进行单元测试,那么您可以在实现之间自由切换。

发布库时,可以发布核心库的组成以及所选接口的实现。

然后,隐藏使用的实现:
至于不公开您使用的是NServiceBus还是MassTransit,您不能。如果有人引用了您的库并且它依赖于其中一个包,他们也必须添加该包。假设您的库是为NuGet打包的,该包将揭示其依赖关系。

 类似资料:
  • 我正在尝试通过APIM向服务总线队列发送消息。我已经阅读了几篇类似下面的文章,但运气不佳https://connectedcircuits.blog/2018/09/25/exposing-azure-service-bus-through-apim-generating-a-sas-token-and-setting-the-session-id/ https://www.serverlessn

  • 我使用的是Oracle Service Bus11g第1版(11.1.1.3),但它的XPath实现有问题。 ..但它不是: 执行XQuery时出错:{bea-err}sys001:此功能尚未实现(对不起)

  • 有人能解释一下新发布的WindowsServiceBus(内部部署,而不是Azure)和NServiceBus之间的区别吗? 寻找详细的答案什么窗口SB可能会丢失,因为我很熟悉NSErviceBus可以做什么: 它是真正的服务总线,而不仅仅是使用队列的消息代理吗? 是否可以支持消息多态?(消息子类化其他消息和支持此层次结构的处理程序 长时间运行的进程和相关性 向外扩展

  • 问题内容: 考虑以下情况, 在上面的例子中我得到以下输出这是 相当 期待。 我一直在阅读有关默认方法的信息, 尤其是 关于扩展包含默认方法的接口的信息 2 第二子弹:重新声明的默认方法,这使得它的抽象。 在上面的示例中,我有两个接口的默认方法具有相同的名称,并且当我实现这两个接口时,我只能实现对的引用。 我对此几乎没有疑问, 我怎样才能 到达 的方法 和 如果我不能比,为什么? 没有这种行为从本质

  • UnMarshalException:解封返回时出错;嵌套异常为:java.lang.ClassNotFoundException:seht.somePackage.supernode(没有安全管理器:RMI类加载器禁用)位于sun.RMI.server.unicastRef.Invoke(未知源)位于java.RMI.server.RemoteObjectInvocationHandler.In

  • 我有一个前台服务,按下按钮后会显示一个窗口。有没有办法隐藏(或过度隐藏)服务窗口显示屏上的系统状态栏?有我可以用的旗子吗?我试着到处找,但运气不好。