2011-02-28 23 views
12

我最近一直在努力學習的IoC,並具有基於下面的代碼夫婦的問題時感到困惑接口抽象的接口。在我創建一個接口之前,例如IRunnable,執行功能void Run()。藉助IoC,我現在將界面視爲僅映射到單個具體類的界面。假設,我如何將多個具體類映射到一個接口?我一直在閱讀,你可以將多個接口映射到一個具體的類,但不是相反的方式(除非這是上下文映射的起作用)。我使用的IoC

假設接口只映射到一個對象,什麼時候應該創建一個接口而不是讓一個對象綁定到自己?無論哪種方式,當映射更改正確時,您將不得不更改同一段代碼?


編輯:我標記了我做的答案,因爲它幫助我個人。兩條評論都是同樣的信息。

回答

16

我最近addressed this topic from a more general viewpoint。底線是,鬆散耦合的代碼傾向於產生一個1:1接口的過多的。這與Reused Abstractions Principle相反。

但是,這更像是一個應用程序設計問題,而不是關於特定DI容器的問題。雖然我不知道Ninject,但我曾經使用過的所有其他容器(Castle Windsor,StructureMap,Spring.NET,Autofac,Unity甚至MEF)都可以將多個實現映射到相同的接口。他們如何做到這一點有所不同,但我在my book的第四部分中涵蓋了所有這些內容 - 不幸的是,Ninject不在本書中。

+0

這幫助我重新回到正軌:「鬆散耦合的代碼傾向於產生1:1接口的過多」。感謝你 - 我覺得這些概念在三天後終於落入了 - – Phil 2011-02-28 21:38:41

18

一個好的IoC容器不應該改變接口的使用方式:

  1. 的接口應該被設計爲正在使用它作爲相依性,正在執行它的成分,而不是類。 (接口隔離原理)
  2. 一個類可以實現多個接口。但是這隻能在這些接口用於相同類型的服務時才能完成,以便該類完成一件事。如果接口是兩個不同的東西,它們應該由兩個不同的類來實現。 (單一責任原則)
  3. 如果您需要針對此類服務的多種策略,幾個類可以實現相同的接口。

Ninject允許使用接口使用兩個不同的概念是這樣的:

  1. 條件綁定:如果幾個類實現相同的接口,你必須指定其實現是在這種情況下使用。這是使用條件下進行:

    Bind<IWeapon>().To<Sword>().When(ctx => TodayIsSunday());

    Bind<IWeapon>().To<Dagger>().When(ctx => !TodayIsSunday());

  2. 多個接口:請參見我的博文http://www.planetgeek.ch/2010/12/08/ninject-extension-contextpreservation-explained/

+0

+1雖然我不能評論Ninject細節,但我完全同意這裏提出的一般觀點。 – 2011-02-28 19:26:50