Domanda

la domanda forse è composita, permettetemi di ampliarla:

  • esiste a progettista (stub/framework/meta-designer) per creare regole basate su AND/OR basate sulle proprietà bool pubbliche degli oggetti .NET?Salvato come qualsiasi DSL/Boo/...produzione.
  • è possibile compilare il Uscita DSL in C# espressioni?

Il nostro problema principale è il divario tra la documentazione e il codice.Il nostro prodotto si basa su centinaia di regole definite dall'utente e vogliamo velocizzare le richieste di modifica.

Se siamo in grado di fornire agli utenti un semplice designer e di acquisire l'output, dopo averlo tradotto/compilato in codice C#/IL avremo un ciclo di richiesta di modifica rapido.

So che il nostro problema è specifico, ma qualsiasi "mattone nel muro" è il benvenuto!

Esempio:

Una classe C#, oggetto di:

public class TestA
{
     public bool B {...}
     public bool C {...}
}

Nel designer, dovremmo essere in grado di creare

  • qualsiasi tipo di designer grafico (es.menu a discesa per selezionare le proprietà pubbliche)

Uscita in DSL:

If TestA.B AND TestA.C Then Return True;

Uscita in C#:

if (testA.B && testA.C) { return true; }

Aggiornamento n. 1

Sarei felice con un linguaggio DSL che supporti l'uso di classi .NET di tipo statico.Voglio dire, se l'utente può controllare il codice ("Uscita in DSL" nell'esempio), non abbiamo bisogno del designer.

Aggiornamento n.2

Basandomi sul suggerimento, ho fissato gli alberi di espressione.Dopo pochi giorni mi sono imbattuto in DLinq: non sono mai stato un grande fan di DLinq ma in questo caso si adatta molto bene al dominio del problema.

  • Facile da analizzare (A > 2 E B < 4) O C = 5 in alberi di espressione
  • Facile creare espressioni del genere
  • Molto facile da serializzare/deserializzare
  • La GUI basata su FlowLayoutPanel funziona bene come "costruttore di espressioni"
È stato utile?

Soluzione

Potresti costruire qualcosa di simile da solo.

Puoi ottenere un elenco di tutte le proprietà pubbliche per una classe usando Type.GetMembers()

Tuttavia, invece di generare codice C#, utilizzerei gli alberi delle espressioni.

In questo modo non è necessario coinvolgere il compilatore C# quando gli utenti modificano le regole.Puoi invece archiviare le regole in un database, caricarle in fase di esecuzione e quindi utilizzare il metodo Expression.Compile() per creare un delegato che puoi richiamare per eseguire il codice.

Aggiornamento:

Nei commenti qualcuno ha chiesto "Qual è la differenza tra Expression Tress e linguaggi specifici del dominio?"

Ecco la risposta:

Gli alberi delle espressioni e i linguaggi specifici del dominio sono cose ortogonali.

Gli tress di espressione sono solo un'API per rappresentare le espressioni C#, che possono essere comodamente convertite in un delegato dinamicamente in fase di esecuzione.

Un DSL, o linguaggio specifico del dominio, è un linguaggio di programmazione progettato per risolvere una classe ristretta di problemi.

Sono, essenzialmente, cose completamente diverse.

Se lo desideri, puoi utilizzare gli alberi delle espressioni come parte di un'implementazione DSL.Linq li usa per quello scopo.

Nel tuo caso, tuttavia, non hai bisogno di una DSL.Ciò di cui hai bisogno è un'interfaccia utente che generi regole (simile al modo in cui funziona Outlook) e quindi un modo per eseguire tali regole.

La creazione dell'interfaccia utente è semplicemente il normale sviluppo dell'interfaccia utente.

Gli alberi delle espressioni sono ciò che è possibile utilizzare per implementare le regole.

Altri suggerimenti

È un fatto poco noto che la finestra di progettazione per Windows Workflow Foundation e il relativo motore di regole in particolare possono essere ospitati in un'applicazione Windows Form separata da Visual Studio.Allo stesso modo, le regole create in questo modo possono essere valutate indipendentemente da un flusso di lavoro effettivo.

Vedere Guida agli scenari WF:Ri-hosting di Workflow Designer E Esercitazione:Ospitare il WF Designer.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top