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



我目前正在进行一个项目,该项目允许第三方连接到我们产品的消息代理中。任务是提供一个第三方可以使用的库。我希望能够将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使用公共交通消费信息看起来像这个

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>();
}
};

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

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

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

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

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

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

最新更新