2013-07-03 67 views
3

我剛開始學習依賴注入,並將其卡在這裏。Ninject基於頂級項目獲得不同實現的最佳實踐

我的項目在實體框架DbContext上有一個WCF DataService。

public class MyDataService : DataService<MyDbContext> 
{ 

    protected override MyDbContext CreateDataSource() 
    { 
     // I want to use dependency injection for this 
     return new MyDbContext(); 
    } 
} 

類或者是
一)IIS託管,所以我沒有集成測試任何控制 b)所示,var host = new DataServiceHost(type, new Uri[] { });

都使用不同的contstructors爲MyDbContext

創建所以基本上注入本

protected override MyDbContext CreateDataSource() 
    { 
     INinjectModule module = ???; // - 
     IKernel kernel = new StandardKernel(module); 
     return kernel.Get<MyDbContext>(); 
    } 

所以疑問句語境重刑是,在這種情況下最好的做法是什麼? 我應該:

a)在類庫創建模塊,這兩個主要項目和服務的使用 二)創建包含Ninject模塊DataService在項目內的公共靜態變量。 c)在保存Ninject內核的DataService項目中創建一個公共靜態變量。d)其他。

我寧願像

protected override MyDbContext CreateDataSource() 
    { 
     DefaultKernel.Get<MyDbContext>(); 
    } 

回答

3

首先,你應該有一個成分根。也就是說,創建一個單獨的地方(不是每個單一功能)都會創建您的Kernel

其次,在這裏你不需要一個NinjectModule ..你要求Ninject創建一個具體對象的實例(在幾乎所有情況下都會打敗目的)。

你應該建立什麼,是一個獨立的NinjectModule傳遞到Kernel的構造..這樣的:

interface IContext { 
} 

class MyDbContext : DbContext, IContext { 
} 

class YourModule : NinjectModule { 
    protected override void Bind() { 
     Bind<IContext>().To<MyDbContext>(); 
    } 
} 

// In your composition root somewhere 
var kernel = new StandardKernel(new NinjectModule[] { new YourModule() }); 

// in your createdatasource method 
kernel.Get<IContext>(); 

這將讓你開始。通常情況下,您的組合根是驅動整個應用程序注入對象的因素,因此無需通過周圍的Kernel(您將在當前設置中執行該操作)。

開始使用DI/IoC時很難理解的是,創建整個依賴關係圖是容器的工作。因此,如果你設置以下綁定:

IContract1 -> ConcreteObject1 
IContract2 -> ConcreteObject2 
IContract3 -> ConcreteObject3 

..和具有以下設置:如果你問你的容器的具體實現的IContract1(這將是ConcreteObject1

class ConcreteObject1 : IContract1 { 
    public ConcreteObject1(IContract2 contract3) { 
    } 
} 

class ConcreteObject2 : IContract2 { 
    public ConcreteObject2(IContract3 contract3) { 
    } 
} 

,然後它會創建它....但:ConcreteObject1需要在構造函數中具體實現IContract2。所以容器說:「等等,我知道如何創建這個」,並通過ConcreteObject2的實例。同樣,它說「等待,ConcreteObject2想要IContract3的具體實施..再一次,它取而代之。

希望有幫助。

+0

謝謝,有一件事情我沒有得到:應該把'Composition Root'放在主項目裏還是放在類庫裏面,其他項目都參考? –

+0

通常他們是「自上而下」。對於Web應用程序,請將其放入Web應用程序Global.asax.cs中。對於WinForms,Program.cs。 –

+0

我已經更新了我的答案,以幫助更好地理解內核只需在您的組合根目錄中。 –