围绕依赖关系创建适配器有什么好处?
What are the benefits to creating adapters around dependencies?
具有非常具体实现的特定依赖项。
例如,Hangfire 排队库。这有非常具体的实现来排队后台作业以异步执行。
我围绕这个依赖创建了一个包装器,但它最终与依赖本身紧密耦合。然后,当我在其他程序集中使用我的适配器时,它们最终都需要引用 Hangfire。
为什么我要将 Hangfire 依赖项(或类似的依赖项)包装在适配器中?
如果我切换到不同的排队系统,所有代码都将转到 "red" 我无论如何都需要切换它的地方。我可以看到为单元测试 and/or 后期绑定提出的论点,但还有其他原因吗?
您的适配器应该实现一个接口(六边形术语中的端口)。您的界面不应引用您的依赖项。实施将具有此参考。您的业务逻辑应该只使用接口(将注入实现)。这样您的业务逻辑就不会引用您的依赖项。如果您的依赖关系发生变化,您只需编写一个实现相同接口的新适配器。这样你的业务逻辑就不会改变,相关的业务逻辑单元测试也不会改变。这是一个很大的好处。
具有非常具体实现的特定依赖项。
例如,Hangfire 排队库。这有非常具体的实现来排队后台作业以异步执行。
我围绕这个依赖创建了一个包装器,但它最终与依赖本身紧密耦合。然后,当我在其他程序集中使用我的适配器时,它们最终都需要引用 Hangfire。
为什么我要将 Hangfire 依赖项(或类似的依赖项)包装在适配器中?
如果我切换到不同的排队系统,所有代码都将转到 "red" 我无论如何都需要切换它的地方。我可以看到为单元测试 and/or 后期绑定提出的论点,但还有其他原因吗?
您的适配器应该实现一个接口(六边形术语中的端口)。您的界面不应引用您的依赖项。实施将具有此参考。您的业务逻辑应该只使用接口(将注入实现)。这样您的业务逻辑就不会引用您的依赖项。如果您的依赖关系发生变化,您只需编写一个实现相同接口的新适配器。这样你的业务逻辑就不会改变,相关的业务逻辑单元测试也不会改变。这是一个很大的好处。