Laden...

dynamische Code evaluierung

Erstellt von mfe vor 2 Jahren Letzter Beitrag vor 2 Jahren 393 Views
M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 2 Jahren
dynamische Code evaluierung

Hi,

ich möchte eine Konfiguration möglichst dynamisch und flexibel halten (Diese soll einen konkreten Typ konfigurierbar machen - hier Car). Dazu wird die Konfiguration in einer DB gehalten und dann auf dem Client heruntergeladen und später ausgeführt. Derzeit ist dies alles statisch und soll nun eben flexibler werden. Später soll man die Konfiguration über ein Webinterface bearbeiten können.

Ich hätte zuerst folgenden Lösungsansatz verfolgt: In die Konfig ein Predicate<Car> geben und den Predicate in der DB Serialisieren.


new Predicate<Car>

Leider ist das Serialisieren mit dem BinarySerializer von delegates deprecated. Während der Recherche ist mir noch DLR untergekommen. Gibt es vlt. noch eine weitere Technik die mir hier weiterhelfen könnte? Hätten ihr Tipps für mein Vorhaben? Danke im Voraus.


    class Car
    {
        public int Doors { get; set; }
        public string Typ { get; set; }

        ...
    }

3.825 Beiträge seit 2006
vor 2 Jahren

Es gibt Anwendungen wo eine variable Struktur in json serialisiert wird und dann in einer Datenbank gespeichert wird.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 2 Jahren

Es gibt Anwendungen wo eine variable Struktur in json serialisiert wird und dann in einer Datenbank gespeichert wird.

Grüße Bernd

Die Struktur des Typen bleibt immer gleich. Ich bräuchte aber so etwas wie eine Funktion die true oder false zurückgibt (die als Parameter den Typ Car übergeben bekommt). Für jede Konfiguration schaut dann die Funktion anderst aus. Als z.B. so etwas:


//konfig liste vom backend
konfig=new List<Konfig> ()
{
      new Konfig() { new Predicate<Car>(s => s.Doors == 1)},
      new Konfig() { new Predicate<Car>(s => s.Typ == "2")},
      new Konfig() { new Predicate<Car>(s =>
            {
                Regex regex = new Regex(".");
                return regex.IsMatch(s.Typ);
            });
      ....
}
//evaluierung welche cars aufgrund der konfig hinzugefügt werden dürfen

            List<Car> cars = GetCars();
            foreach (var car in cars)
            {
                foreach (var konfig in konfig)
                {
                    if(konfig.Predicate.Invoke(car)) //predicate gibt true oder false zurück
                    {
                        yield return car;
                    }
                }
            }


Ich schau mir jetzt noch https://github.com/microsoft/ClearScript an, schaut auch intressant aus.

309 Beiträge seit 2020
vor 2 Jahren

Könntest du auch Microsoft.Extensions.Configuration nutzen und wenn nötig einen Provider bauen:

Implementieren eines benutzerdefinierten Konfigurationsanbieters in .NET

Die Beispiel-App veranschaulicht, wie ein Standardkonfigurationsanbieter erstellt wird, der Schlüssel-Wert-Paare für die Konfiguration über Entity Framework (EF) Core aus einer Datenbank liest.

2.078 Beiträge seit 2012
vor 2 Jahren

Microsoft.Extensions.Configuration

Das macht das ganze mit JSON, XML, INI, what ever.
Gibt's glaub auch für die DB, dann aber nicht von Mircosoft, ein eigener DB-Provider wäre aber nicht so riesig schwer.
Damit arbeitest Du dann mit IConfiguration und das arbeitet mit Strings.

Zusätzlich gibt's noch Microsoft.Extensions.Configuration.Binder und Microsoft.Extensions.Options (mit Microsoft.Extensions.Options.ConfigurationExtensions)
Ersteres bietet die Möglichkeit, die Konfiguration auf Objekte zu mappen und Letzteres liefert eine Options-Pattern-Implementierung mit automatische Anbindung an die Konfiguration..

Die Konfiguration solltest Du in Form einer simplen Key/Value-Tabelle speicherst, zusätzlich so Infos wie eine Beschreibung oder der Typ. Bedenke aber, dass der Key auch zum Configuration-Prinzip aus den Frameworks passen muss, schwer ist das aber nicht.
Das kannst Du dann leicht anzeigen und bearbeiten, das Configuration-Framework liefert dann den Zugriff innerhalb des Programms und kann ggf. auf Objekte gemappt werden.

PS:
JimStark war wohl schneller

16.807 Beiträge seit 2008
vor 2 Jahren

Schließe mich den Vorrednern an: setz lieber auf Standards.

DLR ist auch nen prinzipiell böses Konstrukt und wurde eigentlich nur geschaffen um dynamsiche Sprachen wie zb Python oder Ruby in die .NET Welt zu bekommen, die da zB IronRuby heissen.
Würde ich für sowas gaaaanz sicher nich verwenden 🙂

Gibt's glaub auch für die DB, dann aber nicht von Mircosoft

Prinzipiell schon, verwendet zB EF unter der Haube.

2.078 Beiträge seit 2012
vor 2 Jahren

Was Du mit den Predicates machen willst, geht langfristig in die Hose.
Es gibt/gab zwar ein Framework, das eine LambdaExpression als String de/serialisiert, das könntest Du dann speichern, aber wie gesagt: Das geht in die Hose ^^

Besser wäre aber, Du denkst um und beschränkst dich auf das, was mit der Datenbank geht.
Z.B. eine Art Mapping, welcher Config-Eintrag mit welchem Key/Value geprüft werden soll oder ob der Wert ein Regex-Pattern ist und so weiter.

Prinzipiell schon, verwendet zB EF unter der Haube.

Hast Du einen Namen oder Link oder eine Quelle?
Hier steht kein Provider dafür.
Oder gibt's das nicht als eigenes Packages, sondern nur intern in EFCore?
So ein DB-Provider ist eigentlich das Einzige, was ich da noch vermissen würde.

16.807 Beiträge seit 2008
vor 2 Jahren

Ich meine das Azure Team hat einen Config Provider für CosmosDB erstellt; finde ihn aber gerade auch nicht.
MSSQL ist mir was offizielles unbekannt.

Das Microsoft Feature Flag Framework unterstützt jedoch als Quelle das Entity Framework.
Das ist nicht sooo mega unterschiedlich zum Configuration Framework (natürlich mit einem anderen Zweck).

M
mfe Themenstarter:in
177 Beiträge seit 2009
vor 2 Jahren

Was Du mit den Predicates machen willst, geht langfristig in die Hose.
Es gibt/gab zwar ein Framework, das eine LambdaExpression als String de/serialisiert, das könntest Du dann speichern, aber wie gesagt: Das geht in die Hose ^^

Du meinst https://github.com/esskar/Serialize.Linq oder?

PS: Wie gesagt es geht nicht darum wie, die Konfig abgespeichert wird (ob DB oder in Azure App Configuration spielt ja für die eigentliche Anforderung keine Rolle)