Как применить принцип инверсии зависимостей при использовании сторонних библиотек? - PullRequest
2 голосов
/ 22 февраля 2020

Я читал о принципе инверсии зависимостей, и, насколько я понимаю, отношение инвертировано, потому что пакет A (высокий уровень) определяет интерфейс, а пакет B (низкий уровень) реализует интерфейс вместо прямого вызова класса в пакете. B.

Но как я могу применить принцип инверсии зависимостей, если у меня нет пакета B? Я использую PHP и через менеджер пакетов Composer импортирую некоторые сторонние библиотеки. Поскольку я не контролирую этот код, я не могу заставить классы в этой библиотеке реализовать мой высокоуровневый интерфейс.

Я искал в Google и Stackoverflow, но не могу найти вопросы или статьи которые упоминают этот вариант использования.

1 Ответ

1 голос
/ 22 февраля 2020

Стандартное решение - написать Адаптер поверх сторонней библиотеки. В C# это будет выглядеть следующим образом:

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

Этот интерфейс будет определен в вашем 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;
    }
}
...