2012-07-12 58 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