使用第三方库时如何应用依赖倒置原则?
How can I apply the dependency inversion principle when using third party libraries?
我正在阅读依赖倒置原则,据我所知,这种关系是倒置的,因为包 A(高层)定义了接口,包 B(低层)实现了接口,而不是直接调用 class 包 B.
但是当我没有包B时,如何应用依赖倒置原则呢?我正在使用 PHP 并通过 Composer 包管理器导入一些第三方库。由于我无法控制该代码,因此我无法使该库中的 classes 实现我的高级接口。
我在 Google 和 Whosebug 上进行了搜索,但似乎找不到提及此用例的问题或文章。
标准的解决方案是在第三方库上写一个Adapter。在 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;
}
}
我正在阅读依赖倒置原则,据我所知,这种关系是倒置的,因为包 A(高层)定义了接口,包 B(低层)实现了接口,而不是直接调用 class 包 B.
但是当我没有包B时,如何应用依赖倒置原则呢?我正在使用 PHP 并通过 Composer 包管理器导入一些第三方库。由于我无法控制该代码,因此我无法使该库中的 classes 实现我的高级接口。
我在 Google 和 Whosebug 上进行了搜索,但似乎找不到提及此用例的问题或文章。
标准的解决方案是在第三方库上写一个Adapter。在 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;
}
}