2010-11-15 52 views
1

我有一個Ninject設置,創建一個JobContext解析器InRequestScope()這工作得很好,但是,我有一個非常具體的電話在網站,需要我循環一些數據庫(每年數據庫中的所有數據)。我無法弄清楚發生了什麼事,因爲我忘記了JobContext是InRequestScope,但最後一塊代碼是而不是,這是我認爲應該如何行事。InRequestScope和InTransientScope爲Ninject解析到相同的類型

這裏是設置

//Ninject module 
Bind<Data.IJobContext>().To<Data.JobContext>().InRequestScope(); 


//Controller's Initialize 
protected override void Initialize(System.Web.Routing.RequestContext requestContext) { 
    base.Initialize(requestContext); 

    //set a connection string for the jobContext 
    this.jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(currentYear); 
} 

由於JobContext是它讓重複使用,每年爲同一對象請求範圍。這是我需要它的唯一例子是InTransientScope而不是InRequestScope

//Special function 
foreach (int year in ActiveYears) { 
    jobContext = DependencyResolver.Current.GetService<IJobContext>(); 
    jobContext.SetYear(year); 
    DoSomething(); 
} 

我該如何做到這一點?

回答

3

出現的一個問題是,如果您確實需要JobContext在請求範圍內,並且在其他情況下在瞬態範圍內。似乎有一種設計氣味!嘗試在進行以下操作之前解決此問題。

如果你真的想這樣做,你描述的方式你必須指定兩個不同的命名綁定一個在瞬態和一個在請求範圍內,他們得到他們的名字。

this.Bind<IJobContext>().To<JobContext>().InRequestScope().Named("RequestScoped"); 
this.Bind<IJobContext>().To<JobContext>().InTransientScope().Named("TransientScoped"); 
kernel.Get<IJobContext>("RequestScoped"); 

只是另一件事:我會試圖擺脫Ninject內核的ServiceLocator種用法,並使用依賴注入來代替。我會得到一個更好的設計。

+0

那麼,在幾乎每一個頁面上,它只需要特定的一年。除了在一次調用中,我需要列出每個數據庫中的所有記錄。我不知道有'Named'。雖然我不喜歡它,但它確實有效。我試圖找出另一種做法,但我很茫然。 :) – Buildstarted 2010-11-15 18:28:59

+0

我使用依賴注入,除了這一個位置,順便說一句:) – Buildstarted 2010-11-18 21:47:13

+0

如果使用InRequestScope併發生Db驗證錯誤,您將無法使用請求範圍上下文將其保存到數據庫。在這種情況下,您需要一個臨時作用域來將特定的異常保存到數據庫中。這篇文章給出了很好的信息:http://stackoverflow.com/questions/26775080/how-to-handle-async-calls-with-ninject-inrequestscope – jsgoupil 2015-03-05 22:50:25

相關問題