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

我目前正在开展一个项目,该项目允许第 3 方连接到我们产品的消息代理。任务是提供这些第 3 方可以使用的库。我希望能够将 Mass Transit 或 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 使用 Mass Transit 使用消息看起来像这样


public class MyConsumer : IConsumer<SomeMessage> {

    public Task Consume(ConsumeContext<SomeMessage> ctx) => Task.CompletedTask;

}

在创建服务总线实例的引导期间,您可以定义您的消费者(Mass Transit 将在收到消息时构建它们)。


var busControl = Bus.Factory.CreateUsingInMemory(config => {

    config.ReceiveEndpoint("queue_name", endpointCfg => {

        endpointCfg.Consumer<MyConsumer>();

    }

};

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


ITMISS
浏览 105回答 1
1回答

www说

如果我理解正确,您希望防止您的代码与 NServiceBus 或 MassTransit 耦合,并且您不想公开您使用的是哪一个。首先,解耦:通过定义自己的IServiceBus接口,您已经完成了部分工作。只要您的库仅依赖于该接口而不依赖于任何实现,您就不应该耦合到任何一个。为确保避免这种耦合,我会将具体实现保留在单独的项目/库中。您的“核心”域也不应该直接引用。如果您可以在没有任何具体实现的情况下对代码进行单元测试,那么您可以在实现之间自由切换。当您发布您的库时,您可以发布您的核心库的组合以及您选择的其接口的实现。然后,隐藏使用了哪个实现:至于不暴露是否使用NServiceBusor&nbsp;MassTransit,你不能。如果有人引用了您的库并且它依赖于其中一个包,那么他们也必须添加该包。假设您的库是为 NuGet 打包的,该包将显示其依赖项。
打开App,查看更多内容
随时随地看视频慕课网APP