我想知道是否有一个.NET接口,使Redis和兔子之间的过渡,而没有(大)的代码变化?万一我最终想把Rabbit换成Redis,因为在我的测试中,我需要更高的性能,例如。我想用一个界面来轻松地完成这个任务。这可能吗?
qvtsj1bj1#
这是一个典型的反转控制示例,您希望推迟实现细节。正如注解中所建议的,这是通过应用程序特定的接口实现的。因此,为了使您的代码对修改关闭,需要将其放置在单独的项目中,您还需要在其中定义接口,例如
public interface IService { Task DoSomethingAsync(CancellationToken cancellationToken); }
然后为Rabbit和Redis分别创建一个项目(每个项目都有更进一步的、专门的Nugets来处理特定的通信)。现在的诀窍是在每个项目实现接口IService和方法实现时都将使用底层提供者。这样,一旦你需要Rabbit,你就有了单独的项目,你只需再次实现接口,但使用Rabbit提供程序。并且,您可以将使用什么实现的决定推迟到调用代码,这是组合根,您在其中定义服务。
IService
services.AddScoped<IService, RabbitService>();
并且在任何地方都使用IService的示例。一旦需要切换,只需将上面的行更改为:
services.AddScoped<IService, RedisService>();
...因此,您可以在几乎不更改代码的情况下进行更改。如果您的依赖注入配置位于某个外部配置中(这并不广泛应用),您甚至不必接触代码。
1条答案
按热度按时间qvtsj1bj1#
这是一个典型的反转控制示例,您希望推迟实现细节。
正如注解中所建议的,这是通过应用程序特定的接口实现的。因此,为了使您的代码对修改关闭,需要将其放置在单独的项目中,您还需要在其中定义接口,例如
然后为Rabbit和Redis分别创建一个项目(每个项目都有更进一步的、专门的Nugets来处理特定的通信)。
现在的诀窍是在每个项目实现接口
IService
和方法实现时都将使用底层提供者。这样,一旦你需要Rabbit,你就有了单独的项目,你只需再次实现接口,但使用Rabbit提供程序。
并且,您可以将使用什么实现的决定推迟到调用代码,这是组合根,您在其中定义服务。
并且在任何地方都使用
IService
的示例。一旦需要切换,只需将上面的行更改为:
...因此,您可以在几乎不更改代码的情况下进行更改。
如果您的依赖注入配置位于某个外部配置中(这并不广泛应用),您甚至不必接触代码。