2010-07-21 9 views
8

Estoy planeando un sistema de logros para un sitio ASP.NET MVC. Quiero que las "reglas" de logro se almacenen en una base de datos, para que sea más fácil agregar nuevos logros y un lugar central para administrar las reglas existentes. Los usuarios no tendrán acceso para cambiar las reglas.¿Cómo construir un conjunto de reglas basado en DB para el sistema de logro de la aplicación web?

Cuando un usuario realiza una acción que potencialmente podría ganar un logro, las reglas db se consultará y si hay coincidencias, les dan los logros (almacenados en una tabla de consulta, (ID de usuario, achievementId, dateAwarded).

por el momento tengo la intención de poner los "disparadores" en ciertas acciones en el controlador, pero el código que hace el trabajo habrá en el modelo.

¿hay esquema de base de datos estándar para un sistema de logros que lleva a cabo esto no es necesario reinventar la rueda si no es necesario. Si no, ¿qué tipo de problemas crees que aparecerían, qué buscar?

Respuesta

9

Puede encontrar this answer útil.

Hablando por experiencia, construir un motor de reglas basado en bases de datos para reaccionar ante las acciones de los usuarios es un ejercicio muy lento, propenso a errores y doloroso.

En su lugar, puede escribir cualquier número de clases individuales, cada una responsable de saber cómo otorgar un logro en particular. Utilice una clase base o interfaz para darles todo un contrato común:

public abstract class AchievementAwarder 
{ 
    //override to provide specific badge logic 
    public abstract void Award(); 
} 

Puede foreach sobre cada AchievementAwarder y llame Award() con una programación periódica. Por ejemplo, usted podría tener un "100 visitas" logro:

public class 100VisitsAwarder : AchievementAwarder 
{ 
    public override void Award() 
    { 
     //get a visit count from the db for all users 
     //award achievements 
    } 
} 

Esto resuelve dos problemas:

  1. órdenes de magnitud más simple de ella, pero mucho más flexible, que un motor de reglas basadas en la base de datos . Como puede ver, las unidades individuales son extremadamente pequeñas y fáciles de cambiar sin afectar al sistema más grande.

  2. Se puede ejecutar de forma asincrónica, por lo que para los logros que requieren un poco de trabajo pesado para determinar si se deben otorgar, las actividades normales del usuario no se ven afectadas por el motor de logros.

+0

@Rex M - Eso suena genial! Para el ejemplo que le dio sería un tipo de búsqueda de cron job. ¿Cómo recomendaría engancharse en las acciones que los usuarios toman? Por ejemplo, publican una nueva "cosa" y es la centésima, así que deles un logro. También suponga que podría haber cualquier cantidad de logros para publicar una nueva "cosa". – Chaddeus

+2

@C. Lo siento por la respuesta tardía: para responder a su pregunta, como dijo, esto funciona mejor como un trabajo cron o, en la otra respuesta a la que he vinculado, un objeto de caché autoinstruible inicializado al inicio de la aplicación. Su mejor apuesta, por simplicidad y rendimiento, es evitar conectarlo directamente a las acciones del usuario siempre que sea posible. en muchos casos, es mucho mejor vivir con unos minutos de retraso entre la acción que te empujó al límite y el premio otorgado. –

+0

@ Rex M - gracias ... ¿cómo lo hace Foursquare? No lo uso, pero cuando un usuario desbloquea una insignia, ¿lo obtienen de inmediato? ¿O es otorgado más tarde cuando el trabajo cron rueda? ¡Definitivamente me gusta la idea de mantener el rendimiento del sitio! Acabo de cargar la página de inicio en .48 seg.: D – Chaddeus

Cuestiones relacionadas