1

タイマータスクで新しい 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 に答える