2009-07-21 76 views
11

我一直在使用Ninject 2開始(從GitHub下載昨天包括MVC擴展項目),並基於以下技術項目:如何讓Ninject 2使用LINQ to SQL DataContext的無參數構造函數?

  • 的.Net 3.5 SP1
  • ASP.NET MVC 1.0
  • LINQ到SQL

沒有什麼神奇這裏 - 我正在使用LINQ實現的在運行時代碼以SQL(和使用單元測試代碼了哈希表)的幾個庫接口(命名爲喜歡IEntityRepository)。這些存儲庫中的每一個都需要從LINQ到SQL的DataContext實例,以便與數據庫進行交互,因此這是具體存儲庫類的構造函數參數。結合設置是這樣的:

Kernel.Bind<MyDataContext>().ToSelf().InRequestScope(); 

這樣做的原因是,我希望能夠分享不同的存儲庫之間的實體,如果我碰巧需要更多的人,並與LINQ到SQL的DataContext單元的工作理念,我覺得對每個HttpRequest創建一個有意義。

我通常使用MyDataContext的無參數構造函數 - 我不認爲這是一個風險因爲它用於測試系統上的內部項目,所以datacontext中的「內置」連接字符串是無害的。然而,由於Ninject 2是「貪婪」,並希望與大多數參數的構造函數,我真的不能粘[Inject]參數爲生成的代碼以任何有意義的方式,我得到每當Ninject嘗試創建我的控制器之一(一個錯誤它需要一個存儲庫,它需要datacontext)。

我已經看過提及IConstructorScorer以及能夠製作一個「倒置」的東西,它總是使用帶有LEAST參數的構造函數,但是這又改變了注入如何工作 - 默認行爲可能是我想要的只是datacontext。

所以 - 有沒有指定這個綁定(且僅此綁定)應使用一個特定構造一個不錯的,乾淨的方式?我們可以像Ninject 1那樣對提供商做同樣的事情,也許可以提供我們自己的「工廠」?或者我應該放棄並嘗試將參數提供給有意義的數據上下文?

回答

6

想通了 - 這是很容易通過結合提供商完成的;

Kernel.Bind<MyDataContext>().ToProvider<ContextProvider>().InRequestScope(); 

無論何時需要構建其中一個討厭的DataContext對象,Ninject現在都會調用我的ContextProvider。這是我的供應商類的樣子:

public class ContextProvider : IProvider 
{ 
    #region IProvider Members 

    public object Create(IContext context) 
    { 
     return new MyDataContext(); 
    } 

    public Type Type 
    { 
     get { throw new NotImplementedException(); } 
    } 

    #endregion 
} 

好像我逃過了它 - 它工作正常。 :)

7

我猜你也可以使用「ToMethod」結合,以避免實現自定義的供應商,這就是我如何使用:

Kernel.Bind<MyDataConext>().ToMethod(c => new MyDataContext()) 
+2

是完整的,我想補充的'InRequestScope()',以保證DataContext的生命週期是正確的。 – 2010-05-04 03:07:57

相關問題