42

バッジの実装について考えてみましたが(ここにあるStack Overflowのバッジと同じように)、Windowsサービスなしでは難しいと思いますが、可能であればそれを避けたいと思います。

私はいくつかの例を実装する計画を思いつきました:

  • Audobiographer:プロファイルのすべてのフィールドに入力されているかどうかを確認します。
  • コメント投稿者:コメントを作成するときは、コメントの数が10に等しいかどうかを確認し、10に等しい場合はバッジを授与します。
  • 良い答え:投票するときは、投票スコアが25以上かどうかを確認してください。

これをデータベースにどのように実装できますか?それとも別の方法が良いでしょうか?

4

4 に答える 4

41

Stackoverflowに似た実装は、チームが時々ドロップする情報に基づいて、実際には説明したよりもはるかに単純です。

データベースには、誰が何を持っているかを追跡するためのペアのコレクションを保存するだけですBadgeIDUserIDまた、いくつかのバッジに複数の賞を与えるためのカウントまたはrowID)。

アプリケーションには、バッジタイプごとにワーカーオブジェクトがあります。オブジェクトはキャッシュ内にあり、キャッシュの有効期限が切れると、ワーカーはバッジを取得するユーザーを決定して更新を行うための独自のロジックを実行し、キャッシュに自分自身を再挿入します。

public abstract class BadgeJob
{
    protected BadgeJob()
    {
        //start cycling on initialization
        Insert();
    }

    //override to provide specific badge logic
    protected abstract void AwardBadges();

    //how long to wait between iterations
    protected abstract TimeSpan Interval { get; }

    private void Callback(string key, object value, CacheItemRemovedReason reason)
    {
        if (reason == CacheItemRemovedReason.Expired)
        {
            this.AwardBadges();
            this.Insert();
        }
    }

    private void Insert()
    {
        HttpRuntime.Cache.Add(this.GetType().ToString(),
            this,
            null,
            Cache.NoAbsoluteExpiration,
            this.Interval,
            CacheItemPriority.Normal,
            this.Callback);
    }
}

そして具体的な実装:

public class CommenterBadge : BadgeJob
{
    public CommenterBadge() : base() { }

    protected override void AwardBadges()
    {
        //select all users who have more than x comments 
        //and dont have the commenter badge
        //add badges
    }

    //run every 10 minutes
    protected override TimeSpan Interval
    {
        get { return new TimeSpan(0,10,0); }
    }
}
于 2010-07-01T23:52:35.257 に答える
4

ジョブズ。それが鍵です。あなたが言及した基準をチェックするために設定された間隔で実行されるプロセス外のジョブ。レベルを設定するために外部リソースが必要でない限り、Windowsサービスは必要ないと思います。実際、StackOverflowは計算にもジョブを使用していると思います。

于 2010-07-01T23:50:48.857 に答える
0

トリガーを使用して、更新または挿入時に確認し、条件が満たされている場合はバッジを追加できます。それはそれを処理するだろうかなり少ないようです。3、2、1でトリガーバッシングを開始します。

于 2010-07-01T23:51:44.003 に答える
0

コメントはデータベース内に保存する必要がありますか?次に、これを行うには2つの主な方法があると思います。

1)ユーザーがログインすると、コメントの数が表示されます。カウントに時間がかかる可能性があるため、これは明らかに望ましいアプローチではありません

2)ユーザーがコメントを投稿するときに、カウントを実行して使用の詳細とともにカウントを保存するか、コメントが追加されたときに実行されるトリガーを実行することができます。次に、トリガーは新しく作成されたコメントの詳細を取得し、ユーザーIDを取得し、カウントを取得して、ユーザーに対してある種のテーブルに保存します。

あなたのプログラムはSQLサーバーがその処理を実行するのを待たずに戻ることができるので、私はトリガーのアイデアが好きです。

于 2010-07-01T23:52:04.680 に答える