2011-07-04 23 views
5

我對構造函數注入模式和規則Don’t call the container; it’ll call you有點困惑。構造函數注入 - 在哪裏調用?

有人可以解釋我(也可能是其他人)真正的應用程序應該如何使用構造函數注入派生所有DI優勢?我給出的是一些簡單的,我認爲普通的例子:

DomainObject 
RepositoryObject 
DaoObject 

的關係是顯而易見的(我認爲) - RepositoryObject需要DaoObject,domainObject的需要存儲庫。

使用構造函數注入我假設我可以忘記(在大多數情況下)關於NEW關鍵字,但是何時,何地以及如何創建新對象(主要是域)?我必須爲所有班級編寫工廠?我應該在該工廠參考DI容器嗎?

當有人向我展示一些真正的應用程序示例(請不要Asp.Net MVC :))或草圖一些項目結構時最好。

+2

看到這個答案:http://stackoverflow.com/questions/6277771/what-is-a-composition-root-in-the-context-of-dependency-injection/6277806#6277806 –

+0

@Mark - 好的,我認爲我掌握了這一點,但是我在創建域對象方面遇到了一些問題。讓我們假設我已經創建了控制器對象(Global.asax作爲應用程序的根目錄),現在我有一些操作(post),並且必須在這一點創建,讓我們說 - 新的Book和Book需要一些依賴的c(Repository或者東西)。那麼如何創建這個新對象呢?我應該總是向Controller對象提供該依賴項,儘管其中一些僅用於創建「Book」對象? Repositorys(他們的一些方法創建新的域對象)也是如此。 – mgibas

+1

http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-object/4836790#4836790 –

回答

1

我不明白你的類關係,所以這裏是一個比較明顯的;-)例如:

class FooService 
{ 
    IFooRepository FooRepository { get; set; } 

    public Service(IFooRepository fooRepository) 
    { 
     this.FooRepository = fooRepository; 
    } 
} 

class Controller 
{ 
    IFooService FooService { get; set; } 
    IBarService BarService { get; set; } 

    public Controller(IFooService fooService, IBarService barService) 
    { 
     this.FooService = fooService; 
     this.BarService = barService; 
    } 
} 

正如你已經說的 - 沒有new FooRepository()也不new FooService()代碼的任何地方。

+0

你需要使用一個容器有一個MVC集成,即。 http://code.google.com/p/autofac/wiki/Mvc3Integration –

+0

Thx,但我知道如何在MVC中使用它來創建控制器,但與其他對象(主要是域)有什麼關係? – mgibas

+0

域對象(嵌套對象)將由DI容器根據您的配置自動創建。您必須通過告訴它爲每個構造函數參數實例化哪個類來配置DI容器(通過代碼或某些配置文件)。在我的例子中,你會告訴DI容器在每次看到類型爲「IFooService」的參數時實例化'FooService',所以當它創建一個控制器時,它知道要傳遞什麼參數。 –

1

答案和Mark Seemann的鏈接已經足夠,但我想添加一些內容。作爲DI(我是)的初學者,這個問題總是讓我感到毛骨悚然:「好吧,沒有新的,但是什麼時候以及如何將我的真實對象稱爲並注入?」。我花了一段時間才理解和應用。

當你按照答案和鏈接你會看到。您應該在應用程序的Global.asax文件中註冊接口和類。例如,如果您正在使用Ninject,請轉到nuget並下載Ninject.Web(用於網絡表單)並將其應用於此示例中。http://azolotar.blog.com/2010/06/22/ninject-2-0-in-webforms/

示例中的關鍵點。

  • 的Global.asax從NinjectHttpApplication(這是在Ninject.Web.dll)
  • CreateKernel方法被重寫這是你創建的內核,並告訴你dependecy地圖容器
  • 的BasePage繼承:這個適用於webforms,因此如果頁面中的所有接口都來自basepage,則頁面中的接口將得到解決。

我要補充這一點,BasePage的實現是很容易的(這裏是github的代碼),你可能已經有一個BasePage的所以加入這一行KernelContainer.Inject(本);到您的基頁的OnInit可以解決問題。最後一部分,如果你打算在ascx中使用任何東西,你應該重寫你的ascx的OnInit,這樣容器就可以解決依賴關係。

我知道你說沒有MVC或網頁?),但道理是一樣的

  • 坐落於應用程序的啓動(Main的depenceny地圖窗口)
  • 因爲它不是網絡沒有URL沒有直接調用表格,你會稱之爲How to use Ninject in a Windows Forms application?,就像這個例子。不知道你是否使用一些模式MVP或MVVM,但這可以是一個起點

該死的這聽起來沒有幫助的答案,但無論如何,希望這有助於。