1. 程式人生 > >依賴注入 Dependency Injection (DI)

依賴注入 Dependency Injection (DI)

依賴注入  Dependency Injection (DI)

如果是第一次接觸這個概念,可能會一時沒有頭緒,網上的各種解釋可能讓你更加混亂,當看到下面那段例項程式碼你可能不相信它就這麼簡單。其實依賴注入本身是單純、簡單的。

你可以直接略過其他直接看例項程式碼!

設計原則

1.找到應用中可能需要改變之處,把他獨立出來,不要和那些不需要編號的程式碼混在一起;

2.針對介面程式設計,而不是針對實現程式設計;

3.多用組合,少用繼承;

4.為了互動物件之間的鬆耦合設計而努力。

5.依賴倒置原則:高層模組不應該依賴於低層模組;兩者都應該依賴於抽象。

策略模式:

定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。其中以上列出的前3條設計模式在策略模式中有所體現。

策略模式有助於理解依賴注入(Dependency Injection)

依賴 Dependency:

從屬,從屬物(英文意思更直接、明瞭)。也可以把依賴看成是一種關係,一種被注入者與注入者直接的關係。(繼承、實現、擁有(has)是面向物件中的關係)

依賴注入是一種方式、方法或者說手段,是讓被注入者和注入者之間建立關聯的手段。

依賴注入的目的是鬆耦合,是互動物件之間的鬆耦合。

容器

通常一個系統中使用 DI,會有一個(或多個)類被用來建立那些(使用依賴注入的)類及其相關的依賴關係,這個(些)類被稱為 容器(containers) ,或者更具體地,控制反轉(Inversion of Control,IoC)

 容器或者依賴注入(Dependency injection,DI)容器。容器本質上是一個工廠,負責提供向它請求的型別例項。

一個構造器注入(Constructor Injection)的例子,C#程式碼:

    public class CharactersController
    {
        public string _title{get;set;}
        public ICharacterRepository _characterRepository { get;}

       public CharactersController(ICharacterRepository characterRepository, string title = "Characters")
        {
            _characterRepository = characterRepository;
            _title = title;
        }
    }
如此看依賴注入就比較簡單,而且平時經常使用。提供一個抽象型別(介面),執行時確定其具體的型別。

(注:C#要求使用構造注入的建構函式只能以一個過載函式,並且該函式也是依賴注入的。建構函式不是依賴注入的引數要提供預設值,否則會InvalidOperationException異常)

其他關於依賴注入的解釋:

1.https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection

Dependency injection (DI) is a technique for achieving loose coupling between objects and their collaborators, or dependencies. Rather than directly instantiating collaborators, or using static references, the objects a class needs in order to perform its actions are provided to the class in some fashion. Most often, classes will declare their dependencies via their constructor, allowing them to follow theExplicit Dependencies Principle. This approach is known as "constructor injection".

翻譯版:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_10-dependency-injection.html

依賴注入(Dependency injection,DI)是一種實現物件及其合作者或依賴項之間鬆散耦合的技術。將類用來執行其操作(Action)的這些物件以某種方式提供給該類,而不是直接例項化合作者或使用靜態引用。通常,類會通過它們的建構函式宣告其依賴關係,允許它們遵循 顯示依賴原則 (Explicit Dependencies Principle) 。這種方法被稱為 “建構函式注入(constructor injection)”。

注:顯示依賴原則——為了正確地執行,方法和類應該明確地要求(通常是通過方法引數或建構函式引數)它們所需要的任何協作物件。

2.https://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html

其中一段引用:

關於什麼是依賴注入,在Stack Overflow上面有一個問題,如何向一個5歲的小孩解釋依賴注入,其中得分最高的一個答案是:

“When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. You might even be looking for something we don’t even have or which has expired.

What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit down to eat.”

翻譯:
“當你自己從冰箱裡取東西時,可能會導致問題。 你可能會讓開門開著,可能會得到一些媽媽爸爸不希望你擁有的東西。你甚至可能正在尋找我們沒有或已經過期的東西。
你應該做的是說明一個需要,“
午飯我需要喝點東西喝”,然後當你坐下來吃東西的時候,我們會確保你有東西喝。