我目前正在開展一個項目,該項目允許第 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 關注
- 96 瀏覽
添加回答
舉報
0/150
提交
取消