2013-08-18 66 views
2

在控制檯應用程序中使用InSingletonScope()作爲數據庫上下文時,有什麼問題嗎?我正在運行一個循環併爲每個項目運行一項工作。另一個範圍會更好嗎?如果我在Web應用程序中使用Ninject,我通常會使用RequestScope。Ninject Singleton Scope內部控制檯應用程序

static void Main(string[] args) 
{ 
    IKernel kernel = new StandardKernel(); 

    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>() 
     .InSingletonScope(); 

回答

3

這取決於您的控制檯應用程序是否是多線程的。如果是這樣,你應該使用InThreadScope,這樣IDisposable對象將被放置在線程的末尾。如果沒有,你可以留在InSingletonScope這將是沒有什麼區別的,你會在單線程應用中使用InThreadScope

如果您對範圍界定有一些額外的需求,您可以嘗試custom scopeInScope。或者你可以嘗試ninject named scope extensions

類似的問題在這裏:Configuring Ninject for a console application and leveraging the existing repository for my MVC application

+0

這工作,但使用後,它注意到它將我的數據庫處於暫停狀態,因爲我的databasefactory上的單例數據庫正在舉行。 –

0

這是所有關於 '請求'。每個應用程序處理請求,每個請求應該有自己的範圍。如果您的控制檯應用程序只處理一個請求(它處理命令行參數,執行一些業務邏輯並且死掉),那麼單例作用域就沒有問題。如果您的應用程序長時間存在並且處理了很多請求(因爲作業的使用可能會提示),則最好將每個作業(或可選地選擇一組作業)視爲一個請求。

在Web應用程序中,請求通常是一個Web請求,範圍通常圍繞一個HTTP請求。對於WCF服務,請求是一個WCF操作,範圍在該操作的周圍。對於Windows服務,不存在HTTP或WCF操作之類的事情,並且通常使用稱爲「生命週期範圍」(您明確開始和結束的生命週期)的內容。

我不知道Ninject的確切術語是什麼,但是您可能需要類似終身作用域的東西。