2010-07-21 7 views
8

Je prévois un système de réalisation pour un site ASP.NET MVC. Je veux que les «règles» de réussite soient stockées dans une base de données - pour être plus facile d'ajouter de nouvelles réalisations et un endroit central pour gérer les règles existantes. Les utilisateurs n'auront aucun accès pour modifier les règles.Comment créer un ensemble de règles basé sur une base de données pour le système de réalisation d'applications Web?

Lorsqu'un utilisateur effectue une action qui pourrait potentiellement gagner une réussite, les règles de db seront interrogés et s'il y a des matches, leur donner les réalisations (stockées dans une table de consultation, (userId, achievementId, dateAwarded).

Actuellement, je prévois de mettre les "déclencheurs" sur certaines actions dans le contrôleur, mais le code qui fait le travail sera dans le modèle

Existe-t-il un schéma DB standard pour un système de réalisation qui accomplit Il n'est pas nécessaire de réinventer la roue si ce n'est pas nécessaire, sinon, quels types de problèmes pensez-vous qu'il apparaîtrait, que faut-il faire attention?

Répondre

9

Vous pouvez trouver this answer utile. D'après l'expérience, construire un moteur de règles basé sur une base de données pour réagir aux actions de l'utilisateur est un exercice très fastidieux, source d'erreurs et douloureux. Au lieu de cela, vous pouvez écrire n'importe quel nombre de classes individuelles, chacune étant chargée de savoir comment attribuer une réussite particulière. Utilisez une classe de base ou de l'interface pour leur donner tout un contrat commun:

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

Vous pouvez foreach sur chaque AchievementAwarder et appeler Award() sur un calendrier récurrent. Par exemple, vous pourriez avoir un « 100 visites » réalisation:

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

Cela résout deux problèmes:

  1. Il ordonne de de grandeur plus simple, mais beaucoup plus souple, qu'une des règles basées sur la base de données moteur . Comme vous pouvez le voir, les unités individuelles sont extrêmement petites et faciles à changer sans affecter le plus grand système.

  2. Il peut s'exécuter de manière asynchrone. Par conséquent, pour les réalisations qui nécessitent un effort important pour déterminer si elles doivent être attribuées, les activités normales de l'utilisateur ne sont pas affectées par le moteur de performances.

+0

@Rex M - Ça sonne bien! Pour l'exemple que vous avez donné il serait un type de recherche de travail cron. Comment recommanderiez-vous l'accrochage dans les actions que les utilisateurs prennent? Par exemple, ils affichent une nouvelle «chose» et c'est la 100e, alors donnez-leur une réussite. Supposez également qu'il pourrait y avoir un certain nombre de réalisations pour poster une nouvelle "chose". – Chaddeus

+2

@Chad désolé pour la réponse tardive - pour répondre à votre question, comme vous l'avez dit, cela fonctionne mieux comme un travail cron ou, dans l'autre réponse, un objet cache auto-insérant initialisé au démarrage de l'application. Votre meilleur pari tout autour, pour la simplicité et la performance, est d'éviter de le connecter directement aux actions de l'utilisateur du tout lorsque cela est possible. Dans de nombreux cas, il est préférable de vivre avec quelques minutes de retard entre l'action qui vous a poussé à la limite et la récompense accordée. –

+0

@ Rex M - merci ... comment Foursquare le fait-il? Je ne l'utilise pas, mais quand un utilisateur débloque un badge, l'obtient-il immédiatement? Ou est-il attribué plus tard quand le travail de cron tourne autour? J'ai vraiment aimé l'idée de garder le site performant! J'ai juste obtenu la page d'accueil pour charger en 48 secondes.: D – Chaddeus

Questions connexes