2012-08-16 23 views
1

Ninject的很多例子都非常非常基本。它不是隻是一個控制器,就是爲了演示目的,他們創建了內核和對象的單個函數。使用Ninject時,我必須調用kernel.Get來實例化一個對象嗎?

所以出於某種原因,我認爲你可以像正常一樣實例化一個對象,而Ninject會攔截它並工作。例如:

public class foo 
{ 
    public foo(IInjectable injected) 
    { 
     //stuff 
    } 
} 

然後在另一個地方類,你可以這樣做:

var fooObject = new foo(); 

所以我應該改爲使用kernel.get?

然後,如果我需要繼續調用內核,我該如何將它傳遞給所有需要它的東西?

+0

我不知道是否日是幫助http://prideparrot.com/blog/archive/2012/4/dependency_injection_using_ninject – VJAI 2012-08-16 03:56:40

回答

1

如果你設計好你的應用程序,那麼你的應用程序中應該只有一個Kernel.Get請求發生(通常通過像Ninject.MVC3這樣的東西)。通常這就是應用程序的根對象被實例化的地方(例如應用程序shell的MainViewModel)。所有其他類型只是在構造函數中聲明它們的依賴關係,而不知道誰負責創建和管理它們的依賴關係。小例子

public class Main { 
    // Somewhere 
    var mainViewModel = Kernel.Get<MainViewModel>(); 
    mainViewModel.Initialize(); 
} 

public class MainViewModel { 
    ctor(ISectionViewModelFactory factory, ISectionViewModel sectionViewModel) { 
    } 

    public void Initialize() { 
     // use injected factory etc. 
    } 
} 

public class ApplicationModule : NinjectModule { 

    public override void Load() { 
     Bind<ISectionViewModel>().To<SectionViewModel>(); 
     Bind<ISectionViewModelFactory>().ToFactory(); // <-- requires factory extension 
    } 
} 

並且應用程序自己構建起來而不在別處訪問內核。

請參閱the factory extensionToFactory()位。

0

你的方法只有在你也注入foo(一般來說,開始將內核注入到類中並不是一個好主意,因爲它開始解除控制的反轉,可以這麼說) 。

這很難說,沒有一些上下文,但讓我們說你的代碼上面包含在另一個類酒吧。然後你會繼續像這樣:

public class bar 
{ 
    foo _fooObject; 

    public bar(foo fooObject) 
    { 
     _fooObject = fooObject; 
    } 
} 

然後當然對將成立的結合,例如:

Bind<foo>.ToSelf(); 

如果你需要創建FOO的多個實例酒吧,那麼你可以使用一個工廠:

public class bar 
{ 
    fooFactory _factory; 

    public bar(fooFactory factory) 
    { 
     _factory = factory; 
    } 

    void baz() 
    { 
     foo fooObject = _factory.GetNew(); 
    } 
} 
+0

儘管鑑於他使用Ninject,他實際上使用https://github.com/ninject/ninject.extensions.factory/wiki(儘管沒有因爲教學原因而造成傷害,因此請儘早處理) – 2012-08-18 07:05:29

相關問題