Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
dynamische Code evaluierung
mfe
myCSharp.de - Member



Dabei seit:
Beiträge: 183

Themenstarter:

dynamische Code evaluierung

beantworten | zitieren | melden

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; }

        ...
    }
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von mfe am .
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3795
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden


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
private Nachricht | Beiträge des Benutzers
mfe
myCSharp.de - Member



Dabei seit:
Beiträge: 183

Themenstarter:

beantworten | zitieren | melden

Zitat von BerndFfm

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.
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 297

beantworten | zitieren | melden

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

Implementieren eines benutzerdefinierten Konfigurationsanbieters in .NET
Zitat
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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von JimStark am .
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1545
Herkunft: Düsseldorf

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16222

beantworten | zitieren | melden

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 :-)
Zitat
Gibt's glaub auch für die DB, dann aber nicht von Mircosoft
Prinzipiell schon, verwendet zB EF unter der Haube.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1545
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.

Zitat von Abt
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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16222

beantworten | zitieren | melden

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).
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
mfe
myCSharp.de - Member



Dabei seit:
Beiträge: 183

Themenstarter:

beantworten | zitieren | melden

Zitat von Palladin007
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)
private Nachricht | Beiträge des Benutzers