2016-07-07 130 views
1

Managing Dependency Injection in C# with Autofac用手依賴注入:手工VS autofac

var di = new EmployeeObserver(employees, new Printer(Console.Out)); 
di.FindExperts(); 

與autofac的解釋卻是非常簡潔的方式與downloadable source code

依賴注入:

ContainerBuilder autofac = new ContainerBuilder(); 
autofac.Register(o => new EmployeeObserver(o.Resolve<IList<Employee>>(), o.Resolve<IPrinter>())); 
autofac.RegisterType<Printer>().As<IPrinter>(); 
autofac.RegisterInstance(employees).As<IList<Employee>>(); 
autofac.RegisterInstance(Console.Out).As<TextWriter>(); 
using (var container = autofac.Build()) 
{ 
    container.Resolve<EmployeeObserver>().FindExperts(); 
} 

在其他一些Q &作爲它表示我們可以在編寫單元測試時看到autofac的優勢。

除此之外,有人可以給出理由或細節更多爲什麼我應該使用autofac而不是手動依賴注入更復雜的代碼?

它說:

可以在這個特殊的例子,很難看出爲什麼這種方法 比手工配置依賴注入更好,但你 應該注意一個重要的事情 - 與Autofac每個組件 獨立於所有其他配置,這就是當你的應用程序變得更加複雜時, 會有什麼不同。

你能指出一個這種情況的複雜版本的例子,它顯示了我將堅持使用autofac用法vs依賴的優勢嗎?

+0

相關:https://stackoverflow.com/questions/32032771/using-dependency-injection-without-any-di-framework – Steven

+0

你確定其他地方談論在單元測試中使用_autofac_,或者只是_dependency injection_在單元測試?您是否具體詢問單元測試部分,或者一般情況下的DI/autofac?這是一個相當廣泛的主題,所以要在這裏回答你需要對你的問題做出相當準確的判斷。 –

+0

@JamesThorpe尤其不是單元測試部分,而是後者 –

回答

1

在其他一些Q &作爲,它說我們可以看到autofac的優勢,使用,同時編寫單元測試

你已經錯過了這一點。 模擬依賴關係並因此編寫單元測試的能力是依賴注入作爲模式本身的優勢。

的優勢任何 DI容器(不僅Autofac)能夠以某種方式配置依賴關係並在複雜場景中使用此配置。

想象一下,你有一些類,這取決於一些服務,而這又取決於一些其他服務,依此類推。

使用窮人的DI很難實現這一點,但DI容器可以解決這個問題。

+0

我認爲,語言已經成爲障礙。也許@asdf_enel_hak在DI模式和容器的正確軌道上,但表達得很差。 –

1

使用或不使用DI容器對單元測試沒有影響。當你進行單元測試時,你不使用DI容器,因爲單元測試通常處理一個或幾個類,你可以很容易地連接在一起。

請注意,無論是否使用DI容器來組成你的對象仍然是一個高度置評的問題。在這裏我提供了一個基於我在項目中使用依賴注入的經驗的視角。

在礦井,Why DI containers fail with 「complex」 object graphs的製品,我定義這樣一個簡單的對象圖的概念:

任何尺寸和具有以下兩個屬性的任何深度的對象圖:

a)對於任何接口(或抽象),實現此類接口的最多一個類在對象圖中使用。 b)對於任何類,在對象圖中最多使用一個實例(或具有完全相同構造參數參數的多個實例)。該單個實例可以在圖中多次使用。

當你有一個簡單的對象圖時,使用一個DI容器。

有關簡單對象圖的示例,請考慮您有20個服務接口,每個接口由一個類實現。例如。 IEmailService僅由EmailService實現,而ISMSService僅由SMSService等實現,並且您有30個ASP.NET控制器,每個控制器都取決於這些服務接口的任意數量。另外一些服務依賴於其他服務接口,例如OrderService取決於IEmailService

如果沒有簡單的對象圖,即有複雜的對象圖(對於大多數應用程序應用SOLID principles,情況就是這樣),請不要使用DI容器,而應使用Pure DI

如果您將DI容器與複雜的對象圖形一起使用,您最終將使用容器的複雜特徵(如命名註冊)來區分同一接口的不同實現或具有不同構造參數的對象之間的區別。這會讓你的composition root難以維護。

您可能想看看我的this article關於Pure DI如何使您的作品根部清潔。