Implementazione del modello di comando nell'applicazione Web

2

Sto cercando di implementare lo schema di comando in un'applicazione web (asp.net c #) ... Poiché i comandi sono in formato testo dal client, qual è il modo migliore per tradurre la stringa in un oggetto comando? Dovrei usare la riflessione? Attualmente presumo solo che il comando fornito corrisponda al nome del file di un controllo utente. Questo è un po 'un trucco.

Piuttosto che avere un'istruzione select case che dice se string="Dashboard", quindi chiama Dashboard.Execute (), c'è un pattern per lavorare con i comandi che hanno origine come stringhe?

    
posta KingOfHypocrites 04.04.2012 - 18:48
fonte

3 risposte

5

Potresti usare una tabella hash per mappare dalle stringhe di input ai metodi Execute.

    
risposta data 04.04.2012 - 18:53
fonte
5

Il modo migliore per farlo in qualsiasi app è utilizzare un contenitore IoC. Quindi il tuo modello di comando è simile a:

public static class CommandLineActionFactory
{
    public static ICommandLineAction GetAction(string actionName)
    {
        if (actionName == null) throw new ArgumentNullException(nameof(actionName));
        ICommandLineAction ret = ObjectFactory.TryGetInstance<ICommandLineAction>(actionName);
        if (ret == null)
        {
            throw new ArgumentOutOfRangeException(nameof(actionName), $"Action '{actionName}' does not exist.");
        }
        return ret;
    }
}

[il codice proviene da un'app della riga di comando ma il modello funziona per il web]

L'enorme vantaggio qui è che puoi sfruttare il contenitore IoC per istanziare i gestori, incluse le patch nelle loro dipendenze. Apre anche la porta alle acrobazie come l'aggiunta runtime di plugin.

    
risposta data 04.04.2012 - 19:00
fonte
0

Questo è uno schema di comando scritto per django 1.4

Può essere usato nel seguente modo:

    p = DesignPattern()
    imps = Implementation.objects.filter(project='Example')
    DesignPatterImplementationsM2MBind(p, imps) 

File model.py di applicazione Django:

    class AbstractM2MBindCommand(AbstractCommand):
        """
        Realizes behaviour design pattern 'Command'
        """
        model = None
        model_m2m_field = None

        MAX_COMMA_SEPARATED_LENGTH = 1024

        bound_objects = models.CommaSeparatedIntegerField(max_length=MAX_COMMA_SEPARATED_LENGTH, null=True, blank=True, default=None)
        bound_objects_long = models.TextField(null=True, blank=True, default=None)

        class Meta:
            abstract = True

        @classmethod
        def do(cls, model_instance, queryset_to_link):
            #assert isinstance(queryset_to_link, QuerySet)
            setattr(model_instance, cls.model_m2m_field, queryset_to_link)

            ids =  [u'%d' % item.pk for item in queryset_to_link]

            model_instance.save()

            fk_field = camel_to_underscore_convert(cls.model.__name__)

            cmd = cls()
            cmd.direction = cls.FORWARD
            joined_ids = u','.join(ids)
            if len(joined_ids) > cls.MAX_COMMA_SEPARATED_LENGTH:
                cmd.bound_objects_long = joined_ids
                cmd.bound_objects = None
            else:
                cmd.bound_objects_long = None
                cmd.bound_objects = u','.join(ids)
            setattr(cmd, fk_field, model_instance)
            cmd.save()


        @classmethod
        def undo(cls, command_id):
            pass

         @classmethod
         def redo(cls, command_id):
             pass 


    class DesignPatterImplementationsBindCommand(AbstractM2MBindCommand):
        model = DesignPattern
        model_m2m_field = 'implementations'

        design_pattern = models.ForeignKey(DesignPattern)
    
risposta data 19.01.2013 - 23:53
fonte

Leggi altre domande sui tag