dependency-injection - 使用第三方库时如何应用依赖倒置原则?

标签 dependency-injection inversion-of-control dependency-inversion

我正在阅读依赖倒置原则,据我所知,这种关系是倒置的,因为包 A(高级)定义了接口(interface),包 B(低级)实现了接口(interface),而不是直接调用包 B 中的类。

但是当我没有包 B 时,如何应用依赖倒置原则呢?我正在使用 PHP,并通过 Composer 包管理器导入了一些第三方库。由于我无法控制该代码,因此我无法使该库中的类实现我的高级接口(interface)。

我在 Google 和 Stackoverflow 上进行了搜索,但似乎找不到提及此用例的问题或文章。

最佳答案

标准解决方案是写一个 Adapter通过第三方库。在 C# 中,它如下所示:

public interface IFoo
{
    void Bar(int baz);
    string Qux(bool quux);
}

该接口(interface)将在您的 A 包中定义。

在另一个包中,您将引用第三方库并编写适配器:
public class ThirdPartyFoo : IFoo
{
    private ThirdPartyObject thirdPartyObject;

    // Class initialisation goes here...

    public void Bar(int baz)
    {
        var corge = // perhaps translate or modify baz first...
        thirdPartyObject.SomeMethod(corge);
    }

    public string Qux(bool quux)
    {
        var grault = // perhaps translate or modify quux first...
        var res = thirdPartyObject.SomeOtherMethod(grault);
        var garply = // perhaps translate res
        return garply;
    }
}

关于dependency-injection - 使用第三方库时如何应用依赖倒置原则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352886/

相关文章:

c# - 如何从 .Net Core 2.2 中的 StartUp 注入(inject) 2 EventHubClient

spring - 实现驱动和依赖注入(inject)的好处与维护实现的成本

c# - MvvmCross,如何在另一个程序集中注册Service?

haskell - 使用类型类在 Haskell 应用程序中实现依赖倒置?

oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?

android - 编译项目时出现 Dagger 错误

java - 带有新初始化类变量的 Mockito InjectMocks

java - 了解 Guice 从哑数据对象创建对象

java - 如何在运行时观察应用程序上下文(调试时)

c# - 这是 DIP (SOLID) 的有效使用吗?