我目前正在开展一个项目,该项目允许第 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
接口,您已经完成了部分工作。只要您的库仅依赖于该接口而不依赖于任何实现,您就不应该耦合到任何一个。
为确保避免这种耦合,我会将具体实现保留在单独的项目/库中。您的“核心”域也不应该直接引用。如果您可以在没有任何具体实现的情况下对代码进行单元测试,那么您可以在实现之间自由切换。
当您发布您的库时,您可以发布您的核心库的组合以及您选择的其接口的实现。
然后,隐藏使用了哪个实现:
至于不暴露是否使用NServiceBus
or MassTransit
,你不能。如果有人引用了您的库并且它依赖于其中一个包,那么他们也必须添加该包。假设您的库是为 NuGet 打包的,该包将显示其依赖项。
- 1 回答
- 0 关注
- 104 浏览
添加回答
举报
0/150
提交
取消