如何在Timer任务上调用新的Ninject上下文? 很难将ninject范围配置到单元工作。如果我设置为InRequestScope(),则它不适用于非请求任务。所以我设置如下,以便我可以获得InThreadScope任务:
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值?
答案 0 :(得分: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");