1

如何在 Timer 任务上调用新的 Ninject 上下文?很难将 ninject 范围配置为 unitofwork。如果我设置为 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“上下文”来反映当前状态/数据库值?

4

1 回答 1

0

您真的不应该在 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");
于 2012-07-12T07:07:02.323 回答