为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
ITMISS 2022-07-23 17:41:28
我目前正在开展一个项目,该项目允许第 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>();    }};我希望包装器做的是让开发人员说“使用队列工厂,我想用这个队列名称构造一个实例,这里是实现隐藏总线技术接口的消费者接口的类型的名称。” 我只是不知道我是否可以隐藏消费者。
查看完整描述

1 回答

?
www说

TA贡献1775条经验 获得超8个赞

如果我理解正确,您希望防止您的代码与 NServiceBus 或 MassTransit 耦合,并且您不想公开您使用的是哪一个。

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

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

当您发布您的库时,您可以发布您的核心库的组合以及您选择的其接口的实现。

然后,隐藏使用了哪个实现:
至于不暴露是否使用NServiceBusor MassTransit,你不能。如果有人引用了您的库并且它依赖于其中一个包,那么他们也必须添加该包。假设您的库是为 NuGet 打包的,该包将显示其依赖项。


查看完整回答
反对 回复 2022-07-23
  • 1 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号