2009-11-17 83 views
1

因此,我開始使用Ninject進行依賴注入,並且我想知道人們如何使用內核作爲工作單元類型對象(如Linq2Sql Datacontexts)的對象工廠。我只是像正常的依賴注入它們,但是這引入了一些我想避免的對象生存期問題。 DataContexts不同於一般的依賴關係,因爲你應該根據需要啓動新的實例,並在完成時處理它們。使用Ninject內核作爲工作單元對象工廠

要做到這樣的事情需要我簡單地設置像這樣的提供者...

class SomeDataContextProvider : Provider<SomeDataContext> 
{ 
    private static string _connectionString = "someConnectionString" 
    protected override SomeDataContext CreateInstance(IContext context) 
    { 
     return new SomeDataContext(_connectionString); 
    } 
} 

將它們綁定在一個模塊中...

class MyModule : Ninject.Modules.NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<SomeDataContext>().ToProvider(SomeDataContextProvider); 
    } 
} 

,並使用標準的內核時...

class MyClassThatNeedsADataContext 
{ 
    private StandardKernel _kernel = new StandardKernel(new MyModule()); 

    public void SomeMethod() 
    { 
     using (var db = _kernel.Get<SomeDataContext>()) 
     { 
      //Use the context 
     } 
    } 
} 

它似乎有點沉重,基本上是一個靜態工廠,但我使用Ninject的其他東西nyway。我喜歡它爲團隊中的成員提供了一個工廠的約定,而不是讓他們接受它(在奇怪的地方創建一堆不同的工廠類,或者只是在對象上添加靜態方法等)。

想法?有沒有更好的方法來處理使用依賴注入的DataContexts或WCF Service Clients等工作單元依賴關係?

回答

5

我不喜歡將容器注入到類中,因爲它會在應用程序和容器之間創建依賴關係,並且不太清楚類所依賴的依賴關係。我真的不知道這種方法如何讓工廠獲得任何東西,所以我個人會創建一個'DataContextFactory'並將其注入到需要訪問數據庫的任何類中。

+0

好得多。在注入依賴和注入工廠之間我的大腦陷入了某處。謝謝。 – 2009-11-17 22:03:18