5 回答

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
到目前為止,我發(fā)現(xiàn)的最佳定義是James Shore:
對(duì)于5美分的概念,“依賴注入”是一個(gè)25美元的術(shù)語。[...]依賴注入意味著為對(duì)象提供其實(shí)例變量。[...]。
目前由Martin Fowler的一篇文章,可能證明是有用的,太。
依賴注入基本上是提供對(duì)象所需的對(duì)象(其依賴關(guān)系),而不是讓它自己構(gòu)造它們。這是一種非常有用的測(cè)試技術(shù),因?yàn)樗试S模擬或刪除依賴項(xiàng)。
可以通過多種方式(例如構(gòu)造函數(shù)注入或setter注入)將依賴項(xiàng)注入到對(duì)象中。甚至可以使用專門的依賴注入框架(例如Spring)來做到這一點(diǎn),但它們當(dāng)然不是必需的。您不需要這些框架具有依賴注入。顯式地實(shí)例化和傳遞對(duì)象(依賴關(guān)系)與框架注入一樣好。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
依賴注入是一種實(shí)踐,其中對(duì)象的設(shè)計(jì)方式是從其他代碼段接收對(duì)象的實(shí)例,而不是在內(nèi)部構(gòu)造它們。這意味著可以替換實(shí)現(xiàn)對(duì)象所需的接口的任何對(duì)象而無需更改代碼,這簡(jiǎn)化了測(cè)試并改善了解耦。
例如,考慮以下條款:
public class PersonService { public void addManager( Person employee, Person newManager ) { ... } public void removeManager( Person employee, Person oldManager ) { ... } public Group getGroupByManager( Person manager ) { ... }}public class GroupMembershipService() { public void addPersonToGroup( Person person, Group group ) { ... } public void removePersonFromGroup( Person person, Group group ) { ... }}
在這個(gè)例子中,執(zhí)行PersonService::addManager
并且PersonService::removeManager
需要一個(gè)實(shí)例GroupMembershipService
才能完成它的工作。如果沒有依賴注入,傳統(tǒng)的方法是GroupMembershipService
在構(gòu)造函數(shù)中實(shí)例化一個(gè)new ,PersonService
并在兩個(gè)函數(shù)中使用該實(shí)例屬性。但是,如果構(gòu)造函數(shù)GroupMembershipService
有多個(gè)需要的東西,或者更糟糕的是,有一些初始化的“setter”需要調(diào)用GroupMembershipService
,代碼增長(zhǎng)得相當(dāng)快,PersonService
現(xiàn)在不僅取決于GroupMembershipService
而且還取決于其他所有東西。GroupMembershipService
依賴于取決于。此外,鏈接到GroupMembershipService
硬編碼,PersonService
這意味著你不能“假裝”aGroupMembershipService
用于測(cè)試目的,或在應(yīng)用程序的不同部分使用策略模式。
使用依賴注入,而不是實(shí)例化GroupMembershipService
你的內(nèi)部PersonService
,你要么將它傳遞給PersonService
構(gòu)造函數(shù),要么添加一個(gè)Property(getter和setter)來設(shè)置它的本地實(shí)例。這意味著你PersonService
不再需要擔(dān)心如何創(chuàng)建一個(gè)GroupMembershipService
,它只接受它給出的那些,并與它們一起工作。這也意味著任何作為接口的子類GroupMembershipService
或?qū)崿F(xiàn)GroupMembershipService
接口的東西都可以“注入” PersonService
,并且PersonService
不需要知道變化。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
接受的答案是一個(gè)很好的答案 - 但我想補(bǔ)充一點(diǎn),DI非常類似于代碼中經(jīng)典的避免硬編碼常量。
當(dāng)您使用某個(gè)常量(如數(shù)據(jù)庫(kù)名稱)時(shí),您可以快速將其從代碼內(nèi)部移動(dòng)到某個(gè)配置文件,并將包含該值的變量傳遞到需要它的位置。這樣做的原因是這些常量通常比其余代碼更頻繁地更改。例如,如果您想測(cè)試測(cè)試數(shù)據(jù)庫(kù)中的代碼。
DI在面向?qū)ο缶幊填I(lǐng)域類似于此。那里的值而不是常量文字是整個(gè)對(duì)象 - 但是將類代碼從類代碼中創(chuàng)建出來的代碼的原因是相似的 - 對(duì)象的更改頻率比使用它們的代碼更頻繁。需要進(jìn)行此類更改的一個(gè)重要案例是測(cè)試。
添加回答
舉報(bào)