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

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von JimStark
Thema: C# Skript zur Laufzeit laden und Methode aus Skript aufrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Siehe Zitat. Wenn ich mir ein Shellskript für den Buildaufruf schreibe ist es so gut wie kein Mehraufwand gegenüber dem bloßen Editieren der cs Datei mehr.

Thema: C# Skript zur Laufzeit laden und Methode aus Skript aufrufen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von Wax
Die Skript Variante erschien mir Anfangs attraktiv, da so die anderen Entwickler für Anpassungen nicht immer erst eine Plug-in DLL kompilieren müssten, sondern den Skript-Code "mal eben" anpassen und sofort laufen lassen könnten.

Zumindest bei .NET Core ist es doch auch kein großes rumgetue mehr mit dem CLI.

Thema: Wie kann ich ein S/MIME Zertifikate selbst erstellen?
Am im Forum: Smalltalk

DNSSEC Unterstützung. Bzw. kann ich keinen Eintrag mit dem SMIMEA-Typ erstellen

Thema: Wie kann ich ein S/MIME Zertifikate selbst erstellen?
Am im Forum: Smalltalk

Okay vielen Dank für die Info! Hat mir sehr geholfen.

Mein Hoster unterstützt es natürlich nicht :D

Thema: Wie kann ich ein S/MIME Zertifikate selbst erstellen?
Am im Forum: Smalltalk

Zitat von Abt

SMIME hat im Gegensatz zu anderen Zertifikatstypen die Besonderheit, dass man keine eigentliche Root CA benötigt, sondern den Public Key vom Signierungszertifikat im DNS hinterlegen kann, die sogenannten SMIMEA Records (=> DNSSEC).
Der Client holt sich daher anhand der DNS Informationen alles was er braucht, um die Signatur validieren zu können.

Vielen Dank für deine Antwort!
Das heißt ich erstelle mir z.B. in Powershell ein Self-Signed-Certificate.
Den public key hinterlege ich mir im DNS wie von dir beschrieben, vorausgesetzt mein Hoster unterstützt DNSSEC.
Dann checkt Outlook vom Empfänger per Abfrage ob das Zertifikat valid ist? (Also entspricht Class 1 oder?!)

Also wie hier: SMIMEA - Type 53?

Thema: Coding Styles Horror
Am im Forum: Smalltalk

Ich habe neulich auch was interessantes entdeckt. Ist zwar kein C# aber naja
Vielleicht kennt der ein oder andere das Computerspiel Airline Tycoon aus den früheren 2000ern. Da ist mittlerweile der Quelltext verfügbar.

Hier eine Funktion ob ein spezielles Feature vorhanden ist bzw. ob die Bots bestimmte Features nutzen dürfen:


//--------------------------------------------------------------------------------------------
//Unterstützen die Roboter im aktuellen die Level ein bestimmtes Feature:question:
//--------------------------------------------------------------------------------------------
bool RobotUse (SLONG FeatureId)
{
   SLONG Level;

   //Die verschiedenen Levelstrukturen in eine Reihe bringen:
   if (Sim.Difficulty≥DIFF_TUTORIAL && Sim.Difficulty≤DIFF_FINAL) Level = Sim.Difficulty;
   else if (Sim.Difficulty==DIFF_FREEGAME || Sim.Difficulty==DIFF_FREEGAMEMAP) Level = 6;
   else if (Sim.Difficulty≥DIFF_ADDON01 && Sim.Difficulty≤DIFF_ADDON10) Level = Sim.Difficulty-DIFF_ADDON01+7;
   else if (Sim.Difficulty≥DIFF_ATFS01 && Sim.Difficulty≤DIFF_ATFS10) Level = Sim.Difficulty-DIFF_ATFS01+7+10;

   //Tabelle ermitteln für welche Level ein Feature ermittelt wird:
   const char *pFeatureDesc;
   switch (FeatureId)
   {
      //0-5 : Level im Basisspiel
      // F  : Freies Spiel
      //0-9 : Level in Addon / FlighSecurity
      //
      //"-." : Disabled
      //"xX" : Enabled
      //"!"  : Enabled, but wasn't enabled in AT 1.0
      //"?"  : Enabled, but isn't enabled in AT First Class
      //                                            Basisspiel       Addon        FlightSecu      
      //                                                012345   F   0123456789   0123456789 
      case ROBOT_USE_SABOTAGE         : pFeatureDesc = "-XXXXX" "X" "XXXXXXXXXX" "-XXXXXXXXX"; break;
      case ROBOT_USE_FRACHT           : pFeatureDesc = "------" "X" "-XXXXXXXXX" "XXXXXXXXXX"; break;
      case ROBOT_USE_WERBUNG          : pFeatureDesc = "---XXX" "!" "XXXXXXXXXX" "-XX-X-XXXX"; break;
      case ROBOT_USE_AUFSICHT         : pFeatureDesc = "----XX" "!" "----------" "----------"; break;
      case ROBOT_USE_NASA             : pFeatureDesc = "-----X" "." "---------X" "----------"; break;
....
      case ROBOT_USE_MAX20PERCENT     : pFeatureDesc = "XXXXXX" "!" "XXXXXXXXXX" "XXXXX-XXXX"; break;
      case ROBOT_USE_TANKS            : pFeatureDesc = "------" "." "----------" "--------XX"; break;
      case ROBOT_USE_DESIGNER         : pFeatureDesc = "------" "?" "----------" "---XX-XX--"; break;
      case ROBOT_USE_DESIGNER_BUY     : pFeatureDesc = "------" "." "----------" "----X--X--"; break;

      default:
         TeakLibW_Exception (FNL, ExcNever);
   }

   return (pFeatureDesc[Level]!='-' && pFeatureDesc[Level]!='.') && (!bFirstClass || pFeatureDesc[Level]!='?');
}


Die Lösung fande ich irgendwie sehr interessant Generell ist da der halb deutsche Quelltext sehr lustig zu lesen.

Siehe:
AirlineTycoon/src/Player.cpp

Thema: Wie kann ich ein S/MIME Zertifikate selbst erstellen?
Am im Forum: Smalltalk

Hey,
ich denke einige kennen sich in diesem Themengebiet recht gut aus deswegen mal eine etwas andere Frage:
Als Vorbeugung vor Scamern und für sensiblere Daten möchte ich gerne für uns E-Mail Zertifikate erstellen und nutzen, damit wir Mails signieren und ggf. verschlüsseln können.
Jetzt kann ich ja bei verschiedenen Anbietern welche für einzelne Mailadressen/Abteilungsadressen erstellen und validieren lassen und z.B. einfach in Outlook importieren.
Ich kenne aber viele Unternehmen die selbst Zertifikate ausstellen. Wie funktioniert das dann und mit der Gültigkeit? Ich schätze ich brauche eine Art Rootzertifikat damit ich als Aussteller zertifiziert bin oder? Welche Infrastruktur brauche ich dafür und wieviel kostet sowas ca.? Und ab wann rentiert sich sowas überhaupt?

Viele Grüße!

Thema: myCSharp wechselt die Plattform
Am im Forum: Ankündigungen

Aus Interesse, WBB oder auch phpBB ist doch eine vollständige Forensoftware. Wie kann das Front-End dann geich bleiben? Das Theme ans neue Backend anpassen oder wie? Ist das nicht viel mehr Aufwand als gleich ein ganz neues zu machen?

Thema: Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?
Am im Forum: GUI: WPF und XAML

Ja, der braucht aber auch ein DateTime. Mit dem extra Feld geht es jetzt.

Thema: Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?
Am im Forum: GUI: WPF und XAML

Zitat von Gasimodo
Wenn mich nun nicht alles täuscht dann wird da mit UTC gerechnet und die Textbox gibt dir dann Ortszeit an, deswegen die 2h Unterschied.

Ja genau daran lag es! Ich habe es jetzt über ein weiteres Feld im ViewModel gelöst anstelle des Convertes. Damit geht es. Danke euch beiden!


        private DateTimeOffset _Date;

        public DateTimeOffset Date
        {
            get { return _Date; }
            set { _Date = value;
                OnPropertyChanged(nameof(Date));
            }
        }

        public DateTime DateLocal
        {
            get
            {
                return Date.UtcDateTime;
            }
            set
            {
                Date = DateTime.SpecifyKind(value, DateTimeKind.Utc);
            }
        }

Thema: Warum wird das Datum im UI richtig angezeigt aber beim Speichern ist das Datum - 1 Tag?
Am im Forum: GUI: WPF und XAML

Hi,

ich habe folgendes Problem:


// ViewModel:
        private DateTimeOffset _Date;

        public DateTimeOffset Date
        {
            get { return _Date; }
            set { _Date = value;
                OnPropertyChanged(nameof(Date));
            }
        }

// WPF:
      <TextBox Text="{Binding Date, StringFormat=d}" />

Das Datum wird mir in der Textbox korrekt angezeigt (DD.MM.YYYY).
Wenn ich das nun ändere (03.01.2020 in 02.01.2020) und abspeichere, wird das Datum -1 Tag genommen (01.01.2020). Ich denke das liegt daran dass die Stunde standardmäßig Null ist und an der internen Konvertierung von DateTime in DateTimeOffset durch das StringFormat(?).

Entferne ich das StringFormat erscheint mir das Datum als z.B. "01.01.2018 22:00 +00:00". Wenn ich jetzt das Datum ändere und übernehme stimmt es.
Hat da jemand einen Tipp damit das trotzdem funktioniert? Also das ich das kurze Datumsformat behalten kann?

Thema: [erledigt] Wie programmiere ich einen performanten Bruteforce-Algorithmus?
Am im Forum: Rund um die Programmierung

Zitat von Jonas007
Jedoch möchte ich jetzt einen guten Brute Force Sortieralgorithmus schreiben, welcher nicht zufällig mischt, sondern nacheinander alle Möglichkeiten, die es gibt probiert.

Das kannst du mit ein paar Schleifen selber zusammen bauen oder vielleicht hilft das: Enumerable.Zip Methode

Thema: Wie entwickelt man eine MMVM Anwendung, wenn Tasks abhängig von Tasks sind?
Am im Forum: Grundlagen von C#

Zitat von Papst
Für dich erscheint es aber so, dass das warten auf eine async Methode (await) dazu führt, dass diese im Hintergrund ausgeführt wird und der Verarbeitungsschritt dann an den Rückgabepunkt zurückspringt.
Insofern ist es wunderbar möglich await's untereinander zu schreiben.

In diesem Beispiel, bei AddCustomerToDb: Wenn der Task "AddCustomerToDb" abgearbeitet ist, springt die Ausführung wieder zu dieser Zeile und die variable customer steht zur verfügung. Danach wird "AddCustomerAddress" abgearbeitet.
Also für den Programmierer kein Unterschied zu sequentieller Programmierung.


public async Task Test(){
   var customer = await GetCustomer(...);
   await AddCustomer(customer); // führt zu CustomerHasChanged = true
   await AndereFunktion(...);
   model.Name = "...";
   syncMethode(...);
   CustomerHasChanged = false;
}

Angenommen ich habe eine Methode wie in dem Beispiel. Verstehe ich das richtig dass nicht garantiert wird dass die Methoden in dieser Reihenfolger ausgeführt werden wenn keine Abhängigkeiten bestehen? Also in meiner Anwedung habe ich das Problem, ich arbeite mehrere Tasks mit await ab. Danach setzte ich CustomerHasChanged = false. Der ist dann aber true, was irgendwie bedeutet dass die Tasks noch laufen (führen zu CustomerHasChanged=true), das setzen aber schon abgearbeitet ist.

Thema: Wie entwickelt man eine MMVM Anwendung, wenn Tasks abhängig von Tasks sind?
Am im Forum: Grundlagen von C#

Super, vielen Dank! Genau was ich gesucht habe.

Ich verstehe da aber den Syntax nicht ganz oder wie das genau funktioniert:



public async Task AddCustomer()
{
  var customer = await AddCustomerToDb(); //Task<Customer>
  await AddCustomerAddress(customer, address); // Task 
  await AddCustomerToProject(customer, 1); // Task
}

//vs.

public async Task AddCustomer()
{
   return Task.Run( () => {...}; // Task zurück
}



Den zweiten Fall verstehe ich, da gebe ich einen Task zurück. Wenn ich die MS Docs richtig verstanden habe ist "await xyz()" auch vom Typ Task. Wie funktioniert das intern das da was returned wird, auch wenns mehrere Tasks gibt bzw wenn ein übergeordneter Task draus gemacht wird...?

Thema: Wie entwickelt man eine MMVM Anwendung, wenn Tasks abhängig von Tasks sind?
Am im Forum: Grundlagen von C#

Hi Leute,

bisher dachte ich die sauberste und einfachste Benutzung von Tasks in WPF ist z.B.:


// Beispiel Command an Button gebunden:
public async void AddCustomerExecute(){
   await AddCustomer(...);
...
}

Also dass die Oberfläche weiterläuft und auf die Beendigung wartet. Ich verstehe nur nicht ganz wie man die Anwendung am besten entwirft wenn Tasks abhängig von Tasks sind.

Beispiel:


public async void AddCustomerExecute(){
   await AddCustomeViewModel(...);
...
}

public Task AddCustomerViewModel(...){
// in dieser Funktion werden mehrere Tasks ausgeführt.
// async ohne Task sollte es so aussehen:
var result = await GetResults(...);
...
await AddCustomerToDb(...);
}

// Diese Funktion ist vorgegeben:
public Task AddCustomerToDb(...){
}

Wie gestalte ich nun die AddCustomerViewModel() Funktion, da ich ja z.B. in einem Task.Run( () => {...}) kein await nutzen kann? Mit Wait() und Result,.. ?

Ich hoffe man versteht was ich meine Und wo ist eigentlich Abt?

Thema: Python Skript/ Module in C# integrieren
Am im Forum: Grundlagen von C#

Man könnte das ganze auch über gRPC verbinden. Dann hätte man eine einheitliche Schnittstelle. Könnte aber sein dass das für euch etwas übertrieben ist, da ich denke dass dein Projekt was zusammengeschustertes für einen Arbeitsplatz ist

Thema: Wie kann ich via DataBinding Daten von Textfeldern und Buttons in ein DGV eintragen?
Am im Forum: GUI: WPF und XAML

Was erwartest du jetzt? Dass jemand deine komplette Anwendung analyisiert? :D
Dir fehlen massiv Kenntnisse in C#-Grundlagen und WPF.
Ich würde mich erstmal da dran machen: [Artikel] MVVM und DataBinding

Thema: Erstellung einer "Tabelle" mit Pakettarifinformationen für Abfrage
Am im Forum: Grundlagen von C#

Wo ist jetzt genau das Problem?

Sowas zum Beispiel?


public class Sendung
{
     public double Gewicht { get; set;}
     public int Zone { get; set;}
     public double Preis { get; set;}
}


Damit erstellts du dir eine Liste (List<Sendung>) und suchst dir mit ner Linq Abfrage das passende raus. Die Liste kannst du dann auch serialisieren und abspeichern damit man sie ändern kann.

Thema: Wie kann ich mit SharpDevelop Projekte mit ActiveX Components kompilieren?
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Zitat von backspeck42
Soweit so gut - funktioniert auf der VM...aber nicht auf dem Rechner des Kunden. Da bricht das SDK-Setup ab (scheint Visual c++ redestribultibles nicht installieren zu können, da die schon drauf sind?).

Also ist dein Problem jetzt die Installation des SDK auf dem Kundenrechner? Bricht das ganze Setup ab?

Thema: Eine Klasse oder mehrere Klassen für ein WPF-Programm (Flugsimulator)?
Am im Forum: Grundlagen von C#

Zitat von stefanpc81
zur Drei-Schichten-Architektur:
"Die Präsentationsschicht übernimmt die Aus- und Eingabe der Daten": Stimmt in meinem Fall nur bedingt. Die Methode "Berechne0_5" könnte bspw. mitten im Flug feststellen, dass der rechte Treibstofftank leer wird und das rechte Triebwerk ausgeht. In diesem Fall würden im Monitor EICAS Warnmeldungen erzeugt (Canvas wird verwendet) und im gleichen Monitor ändert sich die Grafik der Drehzahl (BitmapImage wird verwendet). Der Autopilot (den ich bisher schon mit Javascript programmiert habe) ist ebenso eine Option im Hintergrund das Flugzeug zu steuern (x- und y-Achse), welches wiederum Änderungen im ND-Monitor zur Folge hat.

Das ist dann von dir Falsch entworfen, wenn du in deiner Logik etwas abhängig von der Präsentation machst. Das wäre so wie wenn du in irgendeiner komplexen Methode auf "Form1.txtPreis.Text" zugreifen würdest. Das sollte alles komplett in deiner Klasse stattfinden. Der Präsentationsschicht wird dann das zur Verfügung gestellt was sie braucht und umgekehrt.
Zitat
Nachdem innerhalb der Klassen soweit alles lief, wollte ich auf Felder einer anderen Klasse die public sind, zugreifen, was aber nicht geht ("in diesem Kontext nicht vorhanden"). Ich glaube immer mehr, dass ich in meinem Fall (fast) alles in eine Klasse schreiben sollte.

Das glaube ich nicht, vorallem wenn es so umfangreich ist.
Du kannst die Referenz einer Klasse einer anderen mitgeben und darauf zugreifen.

Pseudo-Beispiel:


public Simulator()
{
     auto = new Auto()
     werkstatt = new Werkstatt(auto)
}

Thema: Kann man Aufrufe im Konstruktor des ViewModels überspringen, wenn man im Designer ist?
Am im Forum: GUI: WPF und XAML

Zitat von Palladin007

Mein Vorschlag ist aber auch keine Logik in dem Sinne, sondern eine Art selbst gebautes Event-Binding, um das ViewModel über View-Änderungen zu informieren, ohne dass das ViewModel dabei von der View abhängig ist.
Wenn Du darauf verzichten willst, kannst Du aber auch die genannten Alternativen Behavior oder AttachedProperty nutzen, damit kannst Du sozusagen den Code "auslagern".
Es bleibt dann immer noch eine Art CodeBehind, aber es ist unabhängig von der konkreten View und kann wiederverwendet werden.

Danke für deine Tipps!

Verstehe ich das richtig, ich abonniere mir im MainViewModel z.B. OnServicesLoaded um dann darin z.B. die ViewModels der Objekte usw. initalisieren zu können? Das Event trigger ich dann von der App.xaml.cs wenn ich meine License-, Db-,... Services erstellt habe. Also damit ich Code im Konstruktor im ViewModel vermeide?

Thema: Eine Klasse oder mehrere Klassen für ein WPF-Programm (Flugsimulator)?
Am im Forum: Grundlagen von C#

Zitat von stefanpc81
Bisher dachte ich, dass alle Felder/Methoden mit "public" aus anderen Klassen zugegriffen werden kann. Dies funktioniert leider nicht so wie gedacht, wie ich über das Internet erfahren habe. Ob es in meinem Fall besser wäre dieses Programm mit einer einzigen Klasse zu bauen, ist meine Hauptfrage an euch.

Wieso funktioniert das nicht?

Ich weiß nicht was du vorhast, aber vielleicht wäre es besser z.B. eine Master Simulator-Klasse zu haben und darin unterschiedliche Unterklassen (Triebwerk, kp...). Dann kann jede Klasse den Zugriff auf andere Klassen bekommen, den sie brauchen.

Du solltest dir mal [Artikel] MVVM und DataBinding anschauen.

Thema: Kann man Aufrufe im Konstruktor des ViewModels überspringen, wenn man im Designer ist?
Am im Forum: GUI: WPF und XAML

Hm okay. Ich habe hier nur mal gelesen dass in der Codebehind am besten gar nichts stehen soll.

Wäre es dann sauberer in der Startup-Methode (z.B. Startup="Application_Startup") im app.xaml Code-Behind
meine Datenbankverbindung aufzubauen, MainWindow erstellen, VM übergeben, usw. Also ich verwalte meine "Services" derzeit alle im MainViewModel und übergebe die per DI an die anderen VMs.

Thema: Kann man Aufrufe im Konstruktor des ViewModels überspringen, wenn man im Designer ist?
Am im Forum: GUI: WPF und XAML

Okay sorry hat sich erledigt. Falls wer es braucht:https://stackoverflow.com/questions/3757646/how-do-i-stop-my-viewmodel-code-from-running-in-the-designer

Thema: Kann man Aufrufe im Konstruktor des ViewModels überspringen, wenn man im Designer ist?
Am im Forum: GUI: WPF und XAML

Hey,

ich gebe meinem Window im XAML Code das ViewModel.


    <Window.Resources>
        <ResourceDictionary>
            <local:MainViewModel x:Key="vm"/>
        </ResourceDictionary>
    </Window.Resources>

Das Problem ist jetzt, im Konstruktor kann es sein dass ein Dialog aufgerufen wird (mit ShowDialog(), also der wartet). Das passiert auch im Designer.

Gibt es da eine Möglichkeit wie z.B. sowas in der Art:


#if DESIGNER 
Also dass er den Teil überspringt wenn er im Designermodus ist. Mit Debug ist es mir zu umständlich da ich es auch dort testen muss.


Viele Grüße

Thema: Modularer Aufbau mit Datenbankzugriff
Am im Forum: Grundlagen von C#

Ja, in dem Beispiel nutze ich aber LiteDB, welches keine asynchronen Methoden zur Verfügung stellt. Das ist nur um den Interface gerecht zu werden.

Thema: WPF Lernen und gleichzeitig auf C# wechseln
Am im Forum: Smalltalk

Ich würde dir raten erstmal C# und .NET Grundlagen zu lernen und dann dich an WPF ran wagen.

Bzgl. Visual Basic: Gute und schlechte Nachrichten für Visual-Basic-.NET-Entwickler

Thema: Modularer Aufbau mit Datenbankzugriff
Am im Forum: Grundlagen von C#

Zitat von dannoe
Wenn es hier über sehr einfache Datenstrukturen (einfache Key-Value Paare) hinausgehen soll, dann müsstest du wahrscheinlich eine Schnittstelle bereitstellen, die es dem Plugin erlaubt Tabellen zu erstellen/modifizieren/löschen. Wenn die Schnittstelle von einem Plugin angesprochen wird, kannst du die Tabellennamen z.B. mit dem Pluginnamen als Präfix versehen. So hat das Plugin kein Zugriff auf deine eigenen Tabellen.

Ganz genau. Das Problem dabei ist, das Plugin benutzt ja dann evtl. Objekte die dem DB-Interface und dem jeweiligen Service noch nicht bekannt sind. Das müsste ich dann mit einem generischen Typen lösen. So ähnlich wie hier: How can I use a generic type with entity framework core? Das teste ich mal mit LiteDB ähnlich wie bei Abts Projekt Data.LiteDBRepository


// Nachtrag:
Es ging doch einfacher als gedacht. Falls jemand mal was ähnliches braucht:


// Interface:
        Task AddPluginData<T>(string PluginIdentifier, T data);

        Task<List<T>> GetPluginData<T>(string PluginIdentifier);

// Implementierung mit LiteDB
        public Task AddPluginData<T>(string PluginIdentifier, T data)
        {
            return Task.Run(() =>
            {
                // Collection holen:
                var col = _db.GetCollection<T>($"Plugin_{PluginIdentifier}");
                col.Insert(data);
            });
        }

        public Task<List<T>> GetPluginData<T>(string PluginIdentifier)
        {
            return Task<List<T>>.Run(() =>
            {
                // Collection holen:
                var col = _db.GetCollection<T>($"Plugin_{PluginIdentifier}");
                return col.Query().ToList();
            });
        }

// Aufruf 

           await av.AddPluginData<Person>("MY_PLUGIN",
                new Person()
                {
                    Name = "Max Mustermann",
                    Age = 32
                }
                );


            await av.AddPluginData<Person>("MY_PLUGIN",
                new Person()
                {
                    Name = "Hans Dampf",
                    Age = 39
                }
                );


            foreach(var person in await av.GetPluginData<Person>("MY_PLUGIN"))
            {
                Console.WriteLine($"{person.Name} {person.Age}");
            }

        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }


Kann man natürlich noch ausbauen (CRUD). Die Frage ist es ob es mit einem SQL-Server auch so einfach geht

Danke jedenfalls für eure Tipps!

Thema: Modularer Aufbau mit Datenbankzugriff
Am im Forum: Grundlagen von C#

Die Pluginfähigkeit ist nicht das Problem, das Datenbankdesign ist das Problem. Also dass ich im Interface auch Datenoperationen ausführen kann die ich nicht kenne. Was ich mir auch gedacht habe, in der oberen Tabelle einen JSON-String als Value zu speichern. Das wäre wahrscheinlich nicht gerade effizent, würde aber funktionieren

Thema: Modularer Aufbau mit Datenbankzugriff
Am im Forum: Grundlagen von C#

Hi,

ich habe ein lokales Programm mit dem auf eine Datenquelle (z.B. SQLite-Datenbank) zugreifen kann.
Den Datenzugriff gestalte ich über ein Interface (GetOrders(), AddOrder(),...) damit ich die Datenquelle wechseln kann.

Nun möchte ich gerne dass man Module dynamisch hinzufügen kann. Also eine Art Pluginsystem.

Wie designe ich das jetzt am besten, sodass die Module auch Datenbank Zugriff haben und selbst Daten schreiben und auslesen können?

Ich habe mir schon überlegt dass ich in der Datenbank eine Tabelle anlege für alle Module die dann z.B. so aussieht:

| Module-Name/ID | Key | Value |

Also dass jedem Modul ein Key-Value-Paar zur Verfügung steht. Damit könnte ich auch im bisherigen Interface/Service eine generische Funktion hinzufügen (GetModuleKeyValue(moduleID, key), SetModuleKeyValue(...)). Das wird wahrscheinlich sehr unsauber, da ja mit dem Schlüssel ziemlich viel Information beschrieben werden muss (z.B. "Order-23-LieferantenApiUrl",...)

Hat da jemand noch einen Tipp für mich oder bessere Lösungsvorschläge?