Ninject范围和System.Threading.Timer(Ninject Scope and

2019-10-16 23:49发布

如何调用一个计时器任务新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“背景”,以反映当前的状态/分贝值?

Answer 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");


文章来源: Ninject Scope and System.Threading.Timer