6

私は現在eコマースサイトで作業していますが、実装方法がよくわからない機能が1つあります。ほとんどの場合、カートに商品を追加して購入するだけです。これがおそらく最も簡単なワークフローです。私が求めているのは少し異なりますが、製品の購入に時間制限がある場合はどうなりますか?一部のサイトでは、製品を購入するための正確な時間制限があります(Soccer Managerなど)。これらのサイトでは、製品を永久に保持することはできません。15分の制限があり、その期間内に購入しない場合、アイテムはカートから解放されます。(そしておそらく他の誰かがそれに飛びつくでしょう)

さて、ASP.NET MVCプログラマーとして、この機能を実装したいと思いますが、私が言ったように、それを行う方法がわかりません。カートにアイテムを追加するときは、時間を保持する必要があり(ItemAddedAtなど)、そのアイテムをx分でリリースする必要があるため、その製品をリリースするにはx分後に何かを実行する必要があります。グローバルに考えると、サービスが必要だと思います。アイテムを追加するときは、このサービスにサブスクライブする必要があり、サービスはバックグラウンドでタイマー/ジョブを実行します。私が知らない/経験がないのは、この部分、ASP.NET MVCプロジェクトでそれを行う方法、サンプルプロジェクト、記事、ライブラリなどがありますか?

もちろん、私のロジックがこの問題に適しているかどうかはわかりません。可能であれば、いくつかのソースコードを使用するためのガイダンスが必要です。

4

2 に答える 2

4

AFAIKには、MVCプロジェクト内でタスクを宣言/プログラムする標準的な方法はありません。目的を達成するための推奨される方法は、ソリューション内に新しいコンソールアプリケーションプロジェクトを作成し、Windowsタスクスケジューラを使用してX分ごとに実行し、カートでX分を超えた製品をリリースすることです。

これを機能させるには、(すべてのモデルにアクセスするために)新しいプロジェクトからMVCプロジェクトを参照する必要があります。さらに、クラスライブラリプロジェクトを作成し、そこにモデル/データベースクラスを移動して、から参照する必要があります。 MVCおよびコンソールプロジェクト。


そうは言っても、MVCプロジェクトでプログラムされたタスクを取得するために使用できる小さな「ハック」が実際にあります。次のコードを使用できます。

HttpContext.Current.Cache.Add("Task", "1", null, 
            DateTime.MaxValue, TimeSpan.FromMinutes(5), 
            CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts));

たとえば、Global.asaxから呼び出すことができるその行は、「タスク」エントリをキャッシュに追加します。保存された値(「1」)は重要ではありません。重要なのは、キャッシュエントリが5分で期限切れになり、期限切れになると、「CheckCarts」メソッド(Global.asaxで定義されているか、実行したクラスで定義されている)を呼び出すことです。このコード)。

public void CheckCarts(string key, object value, CacheItemRemovedReason reason) {
     // Insert your code here to check for expired carts
     (...)

     // We add the entry again to the cache, so that this method will be called again in 5 minutes.
     HttpContext.Current.Cache.Add("Task", "1", null, 
            DateTime.MaxValue, TimeSpan.FromMinutes(5), 
            CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts));
}

キャッシュの有効期限が切れると、CheckCartsメソッドが呼び出され、コードは必要な処理をすべて実行し、最後にキャッシュに自分自身を追加して、さらに5分後に呼び出されます。

于 2012-04-30T09:14:55.080 に答える
3

このシナリオは、signalRを悲鳴を上げるだけです。それはあなたが簡単な方法であなたが求めていることをすることを可能にするでしょう。

カート内のアイテムに有効期限がある場合、アイテムの有効期限が切れているかどうかを表示することができます。持っている場合は、そのアイテムの削除コードを実行して、UIを更新できます。

于 2012-04-30T13:56:39.250 に答える