Dependency injection 在使用第三方库时,如何应用依赖倒置原则?

Dependency injection 在使用第三方库时,如何应用依赖倒置原则?,dependency-injection,inversion-of-control,dependency-inversion,Dependency Injection,Inversion Of Control,Dependency Inversion,我读过关于依赖倒置原则的书,据我所知,这种关系是倒置的,因为包A(高级)定义了接口,包B(低级)实现了接口,而不是直接调用包B中的类 但是,当我不拥有包B时,如何应用依赖倒置原则呢?我使用PHP,通过Composer包管理器导入一些第三方库。由于我无法控制该代码,因此无法使该库中的类实现我的高级接口 我在Google和Stackoverflow上搜索过,但似乎找不到提及此用例的问题或文章。标准解决方案是在第三方库上编写一个。在C#中,它将如下所示: public interface IFoo {

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

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


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

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

public interface IFoo
{
    void Bar(int baz);
    string Qux(bool quux);
}
此接口将在pakcage中定义

在另一个包中,您将引用第三方库并编写适配器:

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

再次感谢!那么,适配器包可以直接引用第三个库吗?