2012-07-12 91 views
1

如何在Timer任務上調用新的Ninject上下文? 將ninject範圍配置爲單元工作很困難。如果我設置爲InRequestScope(),它不適用於非請求任務。所以我成立了類似下面這樣我可以爲任務得到InThreadScope:Ninject Scope和System.Threading.Timer

kernel.Bind<IUnitOfWork>().To<myEntities>().InScope(ctx => HttpContext.Current ?? StandardScopeCallbacks.Thread(ctx)); 

但這樣一來,當我成立了一個定時器

Timer timer = new Timer(_ => DelayedDisconnect(chatUser.User.AuthorizationId), null, TimeSpan.FromSeconds(10), TimeSpan.FromMilliseconds(-1)); 

中的DbContext不與新的數據庫值刷新。

public void DelayedDisconnect(string authorizationId) 
    { 
     var myChatUser = GetChatUserByClaimedIdentifier(authorizationId); 

     if (!myChatUser.ChatClients.Any()) // old state (doesn't reflect database changes from 10 seconds ago). 

所以...如何調用一個新的Ninject「context」來反映當前狀態/ db值?

回答

1

你真的不應該在ASP.NET應用程序中運行後臺任務。寫一個服務來做到這一點。 http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx

通過使用Windows服務,它變得非常簡單。設置一個定時器,請求執行內核中所有工作的SomeProcessor。現在,您可以使用NamedScope擴展,並定義了處理器對於像UOW

kernel.Bind<SomeProcessor>().ToSelf().DefinesNamedScope("Processor"); 
kernel.Bind<IUoW>().To<UoW>().InNamedScope("Processor"); 
+0

感謝雷莫某些對象的快速反應範圍。但在這種情況下,它不是一個經常性的獨立任務......它實際上是一個單一的延遲任務,當客戶端關閉瀏覽器窗口(使用SignalR)時,它將從Web應用程序中調用。你仍然認爲windows服務最適合這個嗎?在那種情況下,我將如何從Web應用程序調用服務? – 2012-07-12 12:26:49

+0

另請參閱http://stackoverflow.com/a/11772577/11635 – 2012-08-02 13:03:12