remarks example cref c# sql-server-2005 asp.net-mvc-2 badge

example - remarks c#



¿Cómo implementar insignias? (4)

Los comentarios deben ser almacenados dentro de la base de datos ¿verdad? Entonces creo que hay dos formas principales de hacer esto.

1) cuando un usuario inicia sesión obtiene un recuento de los comentarios. Obviamente, este no es el enfoque deseado, ya que el conteo podría llevar mucho tiempo.

2) cuando un usuario publica un comentario, puede hacer un recuento y almacenar el recuento con los detalles de uso o puede hacer un disparador que se ejecuta cuando se agrega un comentario. el activador luego obtendría los detalles del comentario recién creado, tomaría la identificación del usuario, obtendría un conteo y almacenaría eso contra el usuario en una tabla de algún tipo.

Me gusta la idea de un activador ya que su programa puede regresar sin esperar a que el servidor SQL haga su trabajo.

He pensado en implementar insignias (como las que se encuentran aquí en Stack Overflow) y creo que sería difícil sin los servicios de Windows, pero me gustaría evitar eso si es posible.

Se me ocurrió un plan para implementar algunos ejemplos:

  • Audobiographer: verifique si todos los campos en el perfil están completos.
  • Comentarista: Cuando haga un comentario, verifique si el número de comentarios es igual a 10, si es así, otorgue la insignia.
  • Buena respuesta: Al votar, verifique si la puntuación de los votos es 25 o más alta.

¿Cómo podría implementarse esto en la base de datos? ¿O sería otra manera mejor?


Puede usar los activadores y verificar la actualización o inserción, luego, si se cumplen sus condiciones, agregue una insignia. Eso lo manejaría bastante parecería menos. Comenzar el disparo basping en 3, 2, 1 ...


Trabajos. Esa es la clave. Trabajos fuera de proceso que se ejecutan a intervalos establecidos para verificar los criterios que menciona. No creo que necesites tener un servicio de Windows a menos que requiera algunos recursos externos para establecer los niveles. De hecho, creo que también utiliza trabajos para sus cálculos.


Una implementación similar a es en realidad mucho más simple de lo que has descrito, basada en los bits de información que el equipo soltó de vez en cuando.

En la base de datos, simplemente almacena una colección de pares BadgeID - BadgeID para rastrear quién tiene qué (y un conteo o un ID de fila para permitir múltiples premios para algunas insignias).

En la aplicación, hay un objeto de trabajo para cada tipo de credencial. El objeto está en el caché, y cuando el caché caduca, el trabajador ejecuta su propia lógica para determinar quién debe obtener el distintivo y las actualizaciones, y luego se vuelve a insertar en el 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 implementació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); } } }