什麼是 Dependency Injection?
Dependency Injection 或稱 DI 或稱依賴注入,其實是一種 design pattern (設計模式)。舉例來說,我們可能會寫出下列形式的類別:
class S3(object):
def __init__(self):
self.aws_s3_client = aws.connect()
這種寫法會將 aws_s3_client 相關的邏輯與 aws.connect()
緊密相依,不僅可能造成每次建立一個 S3 storage 就會建立一個全新的 aws 連線之外,也讓程式較難以進行測試,所以我們可以將 aws_s3_client
以傳入的方式注入給 S3 類別使用:
class S3(object):
def __init__(self, aws_s3_client):
self.aws_s3_client = aws_s3_client
如此一來,測試 aws_s3_client
可以在外層建立並重複利用之外,測試也變得相當好寫,只要建立一個假的 aws_s3_client
注入依賴就可以不用連到 AWS 也能進行測試。
這種做法就是典型的 Dependency Injection 。
理解 Dependency Injection 之後,可以進一步了解何謂 Inversion of Control 或簡稱 IoC, 在此就不劇透何謂 IoC 啦,有興趣可以透過下列 8 分鐘的影片了解來龍去脈:
https://www.youtube.com/watch?v=tYZd8hserms
p.s. 如果你有在寫 Angular 或者 NestJS 勢必要理解 DI 與 IoC 的概念才能較快上手