Pregunta

He pensado un poco en la implementación de insignias (al igual que las insignias aquí en desbordamiento de pila) y creo que sería difícil sin servicios de Windows, pero me gustaría evitar que si es posible.

Se me ocurrió un plan para poner en práctica algunos ejemplos:

  • Audobiographer:. Comprobar si todos los campos del perfil se llenaron
  • Commentor:. Al hacer un comentario de verificación si el número de comentarios es igual a 10, de ser así otorgar el distintivo
  • Buena Respuesta:. Al votar a comprobar para ver si la puntuación voto es 25 o superior

¿Cómo pudo ser implementado en la base de datos? O de otra manera sería mejor?

¿Fue útil?

Solución

Una aplicación similares a Stackoverflow es en realidad mucho más simple que usted ha descrito, basado en bits de información se redujo por el equipo de vez en cuando.

En la base de datos, sólo tiene que almacenar una colección de pares BadgeID-UserID para rastrear lo que tiene (y un recuento o una rowID para permitir múltiples premios por algunas insignias).

En la aplicación, hay un objeto trabajador para cada tipo de credencial. El objeto está en la memoria caché, y cuando expira la memoria caché, el trabajador sigue su propia lógica para determinar quién debe recibir la insignia y hacer las actualizaciones, y luego se re-se inserta en la memoria caché:

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);
    }
}

Y una aplicación concreta:

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); }
    }
}

Otros consejos

Empleo. Esa es la clave. Fuera de procesar los trabajos que se ejecutan a intervalos establecidos para comprobar los criterios que usted menciona. No creo que siquiera necesita tener un servicio de Windows a menos que requiere algunos recursos externos para establecer los niveles. De hecho, creo Stackoverflow utiliza puestos de trabajo, así como para sus cálculos.

Se podría utilizar disparadores y comprobar al actualizar o insertar, a continuación, si sus condiciones se cumplen insignia complemento. Eso manejarlo bastante parecen menos. Comenzar el uso intensivo de activación en 3, 2, 1 ...

comentarios deben ser almacenados dentro de la base de datos de la derecha? entonces yo creo que hay dos formas principales de hacerlo.

1) cuando un usuario se conecta se obtiene un recuento de los comentarios. esto no es obvisously el enfoque deseado como el recuento podría tomar mucho tiempo

2) cuando un usuario publica un comentario que cualquiera podría hacer un recuento y luego almacenar la cuenta con los datos de uso o que podría hacer un disparador que se ejecuta cuando se añade un comentario. el gatillo sería entonces obtener los detalles de la observación de nueva creación, agarra el identificador de usuario, obtener un conteo y tienda que contra el usuario en una tabla de algún tipo.

Me gusta la idea de un disparador como su programa puede volver w / a la espera de SQL Server para hacer sus cosas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top