Laden...
T
T-Virus myCSharp.de - Experte
Entwickler noobie :D Nordhausen, Nörten-Hardenberg Dabei seit 17.04.2008 2.203 Beiträge

Forenbeiträge von T-Virus Ingesamt 2.203 Beiträge

01.12.2023 - 12:23 Uhr

Die Meldung sagt im Endeffekt, dass dein Control AddEmployeeButton bereits ein Unterelement eines anderen Controls ist.
Entsprechend musst du AddEmployeeButton erst entfernen und dann dem MainGrid wieder hinzufügen.
Ob das aber so sauber gelöst ist, würde ich erstmal bezweifeln.
Dann du musst dann auch wieder die Umkehrung des Ganzen umsetzen.
Ich habe da meine Zweifel, dass dies durch Code Behind sauber gelöst wird.
Ggf. müsste man dies über Styles umbrechen lassen können.

T-Virus

30.11.2023 - 13:22 Uhr

Da es bei dem Thema um eine Umstellung von lokaler APF Anwendung zu Cloud DB geht, muss man davon ausgehen, dass es hier einen Mehrbenutzerzugriff gibt.
Ich bezweifle, dass er für jede Installation eine eigene Datenbank einrichten wird/will.
Auch wird es nicht pro Gerät einen Benutzer geben.
Die Verwaltung + Kosten dürfte dann bei vielen Benutzern Kostenrahmen sprengen.
Entsprechend ergibt sich schon aus dem urspünglichen Vorhaben der Mehrbenutzer Zugriff.

Ansonsten hattest du übrigens selbst VPN in den Ring geworfen.
Das du dann keine zwei Antworten noch die Frage stellst, wer davon redet, ist auch eine wundersame Art das Thema zu leiten.

Der Lösungsansatz sowohl mit VPN sowie SSH führt aber zu dem gleichen Problemen, wie ich es oben schon angemerkt habe.
Auch dort kannst du den Datenabfluss überhaupt nicht kontrollieren.
Sobald jemand den Rechner karpert, kannst du genau 0 gegen einen Datenabfluss machen.
Da sich in dieser Situation auch noch alle den gleichen Zugang teilen müssten, wäre unmöglich irgendwas sinnvolles zu protokollieren.
Du lieferst also ohne eine Api vor der DAtenbank die DAten in jeder Form den Leuten mit Zugriff aus.

Eine Api bringt dann auch weitere Vorteile, die dir der rohe DB Zugriff nicht bieten kann.
Z.B. kann man in einer Api noch zusätzliche Authetifizierung sowie Authorisierung umsetzen.
Gerade Authorisierung kann u.U. durch eine Lizenzmodell bestimmte Zugriffe blockieren, was mit direkten Zugriff nicht möglich ist.
Ebenfalls sind Caching, Logging und weitere Möglichkeiten erst mit einer Api sauber machbar.

T-Virus

29.11.2023 - 14:01 Uhr

Wenn du bisher nur mit der DB auf dem gleichern Server gearbeitet hast, dann ist jetzt Zeitpunkt auf eine Api umzulernen.
Gute Ansätze dafür gibt es z.B. mit Microsofts Web Api mit Json als Format.
Entsprechende Anleitungen und Lernbeispiele gibt es auch in der Doku von Microsoft.

Doku:
https://learn.microsoft.com/de-de/aspnet/core/fundamentals/apis?view=aspnetcore-7.0
https://learn.microsoft.com/de-de/aspnet/core/tutorials/first-web-api?view=aspnetcore-7.0&tabs=visual-studio

Nachtrag:

@pollito
Den VPN Ansatz würde ich schon aus Kontrollgründen nie verwenden.
Wenn jemand Zugriff auf das VPN bekommt, was schon durch einen Rechner eine Benutzer passieren kann, dann wäre der Datenabfluss nicht kontrollierbar.
Da man dann durch das VPN in falscher Sicherheit gewiegt ist, macht sich kaum einer die Mühe mehr als Benutzer/Passwort zur DB zu konfigurieren.
Durch eine Api, ist der Zugang zur Datenbank sauber gesichert.
VPN zur DB ist also kein Ersatz für eine Api!

T-Virus

20.11.2023 - 16:06 Uhr

Der Code ist alles andere als lesbar und ohne Hintergrundwissen zum Aufbau der Datei nicht ganz klar.
Der Hintergrund scheint zu sein, dass es sich dabei um eine Job Liste für das Spiel Euro Truck Simulator 2 (ETS2) handelt.

Es wäre vermutlich einfacher, wenn du den Code umstrukturierst als am jetzigen festzuhalten.
Wenn der Aufbau der Job Einträge gleich ist, was dein StringBuilder Ansatz suggeriert, wäre es vermutlich sauberer eine eigene Klasse für die Jobs sowie zum lesen/schreiben der Liste jeweils eine Reader/Writer Klasse anzulegen.
Der Reader kann dir im einfachsten Fall aus der Datei die Jobs als Liste liefern, der Aufbau sollte im einfachsten Fall für alle Jobs gleich sein.
Der Writer kann diese Liste anch Anpassung dann sauber zurück schreiben.
Damit wäre dein Code sauber aufgeteilt und sollte nur gültige Jobs lesen/schreiben.

Wenn es sich nicht zufällig bei dem Format der Dateien um JSON handelt, könntest du sogar direkt über De/Serialisierung arbeiten z.B. mit System.Text.Json
Dann kannst du dir die Reader/Writer Klassen sparen, gibt es dann Quasi an Bord.

Nachtrag:
Könntest du eine Beispieldatei liefern bzw. eien Ausschnitt mit mehreren Jobs pasten?
Dann könnte man u.U. das Format ableiten, aber sieht sehr nach JSON aus.

T-Virus

20.11.2023 - 14:53 Uhr

Wenn du den Content der gesamten Datei in der Liste hast, ist es am einfachsten die Datei komplett neu zuschreiben.
Dann kannst du einfach mit File.WriteAllLines arbeiten und die Liste dann schreiben lassen.
Wäre die einfachere Lösung als selbst die passenden Zeilen ermitteln und zu schreiben.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.io.file.writealllines?view=net-8.0#system-io-file-writealllines(system-string-system-collections-generic-ienumerable((system-string)))

T-Virus

03.11.2023 - 20:10 Uhr

Wozu willst du noch Windows XP als Zielplatform berücksichtigen?
Windows XP ist seit vielen Jahren ohne support, da würde ich keine 5 Min. für eigenen Software Support verschwenden.

async/await gibt es ebenfalls seit mehreren Jahren.
Wenn man nicht gerade mit uralten und nicht mehr supporteten .NET Versionen arbeitet, kommt man schon durch aktuelle Libs damit in Kontakt.
Entsprechend ist es heute recht schwierig sich um async/await zu drücken.

Abt hat dir alle wichtigen Mittel gegeben.

Wenn dir auf "Arbeit" weder Zeit zum debuggen noch in einfaches lesen der Doku gesteckt werden darf, dann ist dein Arbeitgeben kein Softwareentwickler oder IT Dienstleister.
Falls doch, dann kein ernstzunehmender.
Das gehört zu den grundlegenden Aufgaben einen Software Entwickler.

Wenn es hier um ein privates Projekt geht, dann solltest du dies auch in deiner Freizeit entwickeln.
Auf Arbeit muss man sich nunmal um die Arbeit kümmern, da ist kein Platz für private Projekte.

T-Virs

01.11.2023 - 19:41 Uhr

Anstelle von zwei Listen solltest du schauen ob ggf. eine andere Datenstruktur nicht besser wäre.
Z.B. bei einer reinen Prüfung ob Artikelnummern vorhanden sind, wäre HashSet<T> schneller als eine Liste.

Bei Listen muss immer umständlich über alle Einträge bis zu einem Treffer gesucht werden, was abhängig von der Menge  der Einträge und der komplexität der Suche enorm Zeit fressen kann.
Dann brauchst du nur das HashSet<string> und nur eine Schleife um die äußeren Artikel zu prüfen.

public class Artikel
{
    public string NR { get; set; }
    public bool Skip{ get; set; }
    public string Artikel { get; set; }
}

List<Artikel> artikelListe = new List<Artikel>();
HashSet<string> nummern = new HashSet<string>();

// Hier musst du deine Artikel einladen und das HashSet mit den Nummern füllen
// Die Schleife könntest du auch mit Linq vereinfachen, lasse ich hier aber aus für das einfachere Verständnis!

foreach(Artike artikel in artikelListe)
{
    if (!nummern.Contains(artikel.NR))
        artikel.Skip = true;
}

T-Virus

26.10.2023 - 08:37 Uhr

Dir fehlt einfach das große i vor dem Klassennamen.
Du bekommst hier von der Methode ein Interface vom Typ IFusedLocationProviderClient zurück.
Dies kann nicht implizit in einen konkreten Typen umgebogen werden.
Hier solltest du auch gegen das Interface arbeiten, nicht gegen konkrete Klassen.

Code:

IFusedLocationProviderClient   fusedLocationProviderClient = LocationServices.GetFusedLocationProviderClient(this);

Nachtrag:
Vermutlich hast du ein Java Beispiel genommen und einfach versucht 1:1 auf C# umzubiegen.
Bei Java werden Interfaces ohne führendes großes i geschrieben.

Deshalb gibt es z.B. Interfaces wie List<T>, Collection<T> etc.
Bei C# wären die Pendanten IList<T> oder ICollection<T> etc.

T-Virus

19.10.2023 - 15:14 Uhr

Als aller letzte Option bleibt dir noch per XmlTextReader die XML Datei selbst zu parsen.
Ist zwar etwas aufwändiger, dann kannst du deinen Fall aber umsetzen.
Zum schreiben kannst du dann auch wieder den XmlTextWriter verwenden.

T-Virus

18.10.2023 - 10:18 Uhr

Mir ist nicht ganz klar was du machen willst.
Willst du die Bytes des BOM mit auslesen?
Dann müsstest du als Kodierung Utf8Encoding selbst instanzieren und mitgeben.
Dort kannst du dann im Konstruktor mitgeben ob die BOM Bytes mitgelesen werden sollen.
Macht aber kaum Sinn die zu lesen, da diese dann auch selbst beim verarbeiten aussieben müsstest, was .NET hier schon für dich macht.
Beim schreiben der Daten, kannst du dann Utf8Encoding wieder mit passenden Parametern mitgeben damit die BOM Bytes wieder geschrieben werden.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.text.utf8encoding?view=net-7.0

T-Virus

16.10.2023 - 09:41 Uhr

Die Methode UseSqlServer bekommt hier den ConnectionString.
Dieser wird im Beispiel scheinbar aus den ConnectionStrings aus der appsettings.json übernommen.
Im ConnectionString stehen dann für die Verbindung alle Informationen, wie Datenbank/Server/Benutzer/Passwort und Einstellungen z.B. für Verbindungspooling.

Link:
https://learn.microsoft.com/de-de/ef/core/dbcontext-configuration/

Deine zweite Frage stehe ich nicht ganz.
Was genau willst du mit dem Model der View (machen)?

T-Virus

14.10.2023 - 14:42 Uhr

@Th69
Stimmt, ist aber nicht verkehrt auch den zu haben 😃
Die Doku zu ASP .NET ist dort auch verlinkt unter "Entwickeln von .NET-Apps"/"Erstellen von Web-Apps mit ASP.NET Core"
Damit findet man auch aif die Unterseite für ASP .NET.

T-Virus

14.10.2023 - 12:49 Uhr

Dann dürften dir die beiden Links enorm helfen.
Schau dir aber auf jeden Fall auch ADO .NET noch an, damit du auch ein Verständnis für die Abläufe bei OR Mappern wie eben Entity Framework bekommst.

T-Virus

14.10.2023 - 12:24 Uhr

Tut mir leid dich enttäuschen zu müssen, aber den Code werden wir dir hier nicht schreiben.
Dafür gibt es massig Anleitungen sowie die offizielle Dokumentation.
Stichwort sind hier ADO .NET, OR Mapper und Entity Framework.
Beim Thema ASP .NET gibt es auch von Microsoft selbst eine Doku, die alles dazu abhändelt.

Link:
https://learn.microsoft.com/de-de/dotnet/
https://learn.microsoft.com/de-de/ef/core/

T-Virus

11.10.2023 - 22:15 Uhr

Wenn du gefühlt 5 Themen auf machst, die im Grunde immer die gleichen Fragen stellen und du sämtliche Links und Hinweise ignorierst, dann kann man dir auch nicht mehr helfen.

Das Forum ist auch nicht dazu da dir als persönlicher Lehrer zur Seite zu stehen.
Die meisten hier haben sich diese Erfahrung durch Jahre langes einarebiten mit lesen, Videos schauen und probieren beigebracht.
Wenn man diese Ansätze aber links liegen lässt und imer wieder von anderen Lösungen erwartet ohne selbst was zu machen/lernen, braucht man sich nicht wudern wenn man die gleichen Antworten und Hinweise bekommt.

Anbei kannst du dir auch gerne einen anderen Spielplatz suchen.
Es gibt bestimmt genug Leute, die ihre freie Zeit damit verschwenden wollen, unwilligen die gleichen Antworten und Hinweise auf die gleichen Fragen zu geben.
Ich habe jeden Falls keinen Lust darauf, die deine nächsten 5 Fragen zum Thema Mergen von DLLs zu beantworten.
Link zur Doku. findest du ebenfalls bei google 😉

T-Virus

11.10.2023 - 21:24 Uhr

C++ hat keinen direkten Pendant für decimal.
Das hättest du auch kur bei googel suchen können.

Link:
https://stackoverflow.com/questions/64565151/whats-the-c-equivalent-of-cs-decimal-type

Ansonsten verstehe ich auch den zweiten Teil nicht.
Was willst du wie/wohin mergen?
Klint im Kern wieder nach der gleichen Frage aus deinem anderen Thread, den Abt dir schon beantwortet hat.

Link:
https://mycsharp.de/forum/threads/125490/ist-virtualisierung-ein-guter-schutz-fuer-csharp-code?page=1#forumpost-3840453

T-Virus

05.10.2023 - 12:27 Uhr

Ich bin nicht wirklich sicher ob du dazu was finden wirst.
Zum einen ist die Anforderung hier recht spezifisch aber auch teilweise sehr schwammig, was kaum jemand in der Form als eigene Lib umsetzen dürfte.
Falls du nur wenige Objekte hast, würde ich das einfach direkt über Linq abfrühstücken.

Die Filterungen kannst du auch ohne Reflection umsetzen.
Dazu kannst du dir auch entsprechende Extension Methoden anlegen und z.B. ganz Dumm per switch dann die Filter setzen.
Den Reflection Ansatz würde ich nur machen, wenn die Anzahl der Klassen + Properties hoch wäre und einzelne Filter Methoden zu Aufwädnig wären.

T-Virus

05.10.2023 - 12:23 Uhr

@M.L.
Mit zu hoch meint Ralle77 vermutlich, die ganzen Konzepte die ihm entgegen geworfen wurden.
Ich halte z.B. WPF mit MVVM alleine schon für den absolut falschen Weg um jemanden in die Software Entwicklung zu bringen.
Allein WPF mit MVVM erfordert schon ein sehr gutes Verständnis von OOP und auch einigen Design Patterns wie Command, Oberserver etc.
Dies ist gerade für einen absoluten Anfänger einfach eine zu hohe Hürde.

Von daher würde ich eher den Ansatz einer Konsolenanwendung oder ggf. Winforms empfehlen.
Dort kann man sich dann mit den Konzepten der Sprachen und cp. vertraut machen ohne sich um MVVM, Architektur etc. Gedanken zu machen.
Ebenfalls kann man für kleine Tests auch die dotnet Fiddle verwenden um Online etwas rumzutesten.

T-Virus

29.09.2023 - 08:00 Uhr

Warum bastelt du überhaupt am Transaktionsprotokoll rum?
Damit kannst du dir u.U. den SQL Server zerschießen.
Beachte den Hinweis im Link.

Wenn dir der Speicherplatz auf C ausgeht, dann häng eine eigene Platte ein und verlagere den Pfad des Transaktionsprotokoll über den SQL Server dort hin.
Die Systemplatte würde ich auch nicht für den SQL Server für die Daten oder Transaktionslog verwenden, da beide je nach Auslastun stark anwachsen können.

Du könntest bei deinem Server auch das Transaktionslog auf Minimal stellen, dann dürfte es auch nicht so schnell wachsen.
Ebenfalls sollte man das Shrinken des Logs auch nicht regelmäßig z.B. als Wartungsaufgabe laufen lassen.
Dies kann einen negativen Impact auf den SQL Server haben!
Siehe dazu den zweiten Link.

Link:
https://learn.microsoft.com/de-de/sql/relational-databases/logs/the-transaction-log-sql-server?view=sql-server-2017

https://learn.microsoft.com/de-de/sql/relational-databases/logs/manage-the-size-of-the-transaction-log-file?view=sql-server-2017

T-Virus

19.09.2023 - 19:20 Uhr

DLL + Netzlaufwerk ist schon fatal falsche Richtung.
Anwendungen oder DLLs sollte man schon aus Sicherheitsgründen nicht über Netzwerklaufwerke laden/einbinden.

Wenn deine Anwendung nur eine Shell ist, die eigentliche Logik aber in den DLLs liegt, dann muss keine Neuinstallation erfolgen.
Hier würde ein einfacher Updater reichen, der dann nur die DLLs updaten muss.
Ist im groben und ganzen der gangbarere Weg als über Netzlaufwerke.

Dadurch sparst du dir auch den Krampfhaften Ansatz per Reflection zumaufrufen deines Codes.
Kannst du dann ganz normal wie oben im Link gezeigt umsetzen.

Nachtrag:
Falls dein Fall mehr in Richtung Plugin System geht, wegen der Einbindung der DLLs per klick, dann
In der Doku gibt es dazu auch ein Beispiel, wie man es umsetzen kann.

https://learn.microsoft.com/de-de/dotnet/core/tutorials/creating-app-with-plugin-support

T-Virus

19.09.2023 - 17:12 Uhr

Warum fügst du die DLL nicht als Referenz in dein Projekt ein und arbeitest dann direkt gegen die Klassen?
Dein jetziger Ansatz via Reflextion ist hier doch eigentlich unnötig.
Schau dir ggf. mal die Doku zu dem Thema an, da wirst du eigentlich fündig.

Doku:
https://learn.microsoft.com/de-de/dotnet/standard/class-libraries

https://learn.microsoft.com/de-de/dotnet/core/tutorials/library-with-visual-studio?pivots=dotnet-7-0

T-Virus

19.09.2023 - 13:08 Uhr

Wenn ihr z.B. wegen Kompatibilität nicht den TCP Part wegsägen könnt, würde ich einen TCP Server vor den Service schalten.
Der Kunde arbeitet dann wie bisher gegen einen TCP server und der TCP Server kommuniziert dann mit dem eigentlichen Service.
Dadurch kann der Kunde wie bisher gegen einen TCP Endpunkt arbeitet, der dann gegen die eigentliche Schnittstelle in Form des Service arbeitet.

Nachtrag:
Abts Antwort fasst es auch gut zusammen.
Hab in den letzten Jahren auch den Wechsel hin zu Microservices und wieder weg beobachtet.
Hier müsst ihr natürlich vorab prüfen ob diese bei euch zielführend wären.
Z.B. muss man auch immer die einzelnen Latenzen, die sich durch die Microservices ergeben, bedenken.
Ebenfalls müsstet ihr prüfen ob das Konzept der Microservices hier einen Mehrwert bietet wie z.B. Skalierung oder Ausfallsicherheit duch Verteilung der Services auf mehrere Systeme.

T-Virus

18.09.2023 - 12:51 Uhr

Und genau das meinte ich damit, dass du dir ein passendes Datenmodell anlegen solltest.
Dann kannst das ganze auch erst sinnvoll und mit den vorgesehen Techniken umsetzen.
Hättest du doch gleich drauf kommen können oder?

Nachtrag:
Das entspricht dann auch dem Konzept der Projektion wenn man gegen Relationalen Datenbanken arbeitet.

T-Virus

18.09.2023 - 09:29 Uhr

Und was spricht dagegen, dir ein eignes Modell für die View anzulegen anstelle mit deinen Entitäten zuarbeiten?
Dann hättest du auch gleich die Eigenschaft mit dem Namen und kannst danach sortieren.
Aktuell müsstest du ja zwangsweise genau den Weg mit einer vorsortierten Datenquelle gehen, wenn du kein passendes Datenmodell für die Anzeige verwendest.

Anbei verwendest du hier XML Dateien auch als Ersatz für eine Relationale Datenbank.
Hier könntest du auch leicht auf Sqlite als lokale Datebnbank umsteigen, aber das ist ein anderes Thema.

T-Virus

17.09.2023 - 21:12 Uhr

Im einfachsten Fall in dem du einfach die richtige Porperty angibt.
Wenn du keine dafür hast, dann leg doch eine an.
Warum brauchst du überhaupt eine extra Methode dafür?
Klingt nämlich nach einem fehlerhaften Datenmodell.

T-virus

13.09.2023 - 15:54 Uhr

@Alftor
Ah ok, übersehen das die Assembly WindowsBase ist.
Seltsam, dass Microsoft hier von der Namenskonvention abgewichen ist.
Dann sollte es eigentlich passen, wenn die Referenz und der richtige Namespace als using drin sind.

T-Virus

13.09.2023 - 15:50 Uhr

Okay, mein Fehler.
KeyEventArgs gibt es auch in WinForms, dann aber mit dem KeyCode.

Ansonsten sieht der Code soweit richtig aus.
Keine Ahnung was es mit WindowsBase zu tun hat, wenn die Doku selbst auf System.Windows.Input.Key verweist.
Entsprechend kannst du das WindowsBase using entfernen.

T-Virus

13.09.2023 - 15:22 Uhr

Die Referenz allein reicht ja nicht.
Du brauchst auch das using im Code dafür.
Bisher ist dein Code ziemlich mager und deshalb nicht erkennbar ob du das drin hast.

Nachtrag:
Das Problem dürfte sein, dass du mit Winforms arbeitest.
Key wird dir in dem Event bei KeyEventArgs auch als Fehler markiert.
Dort musst du gegen KeyCode arbeiten, was dann aber das Keys Enum verwendet.

Link:
https://learn.microsoft.com/de-de/dotnet/api/system.windows.forms.keys?view=windowsdesktop-7.0

T-Virus

05.09.2023 - 13:42 Uhr

Ohne irgendwelche Informationen kann dir dabei keiner helfen.
Lies mal deinen Beitrag und stell dir die Frage, wie jemand ohne Wissen über deine Anwendung was dazu schreiben soll.
Ohne grundlegende Informationen was du für Einstellungen hast, wo die herkommen und wo die ggf. wieder gespeichert werden soll, hat man keine Informationen.

Bitte liefere die mal nach, sonst wird es schwer hier irgendwas brauchbares sagen zu können.

T-Virus

30.08.2023 - 15:17 Uhr

Mit Strings solltest du da nicht arbeiten.
Wenn du deine Einträge im Enum mal umbenennst, funktionieren diese nicht mehr bzw. hast du plötzlich unbekannte Werte in der DB.

Im Endeffekt sieht das aber nach einem Enum ohne Flags aus.
In dem Fall reicht die Speicherung der Werte in einer Spalte.
Da diese nicht dynamisch, also z.B. durch Benutzer angelegt/verwaltet werden, reicht hier eine int Spalte für den Wert.

T-Virus

30.08.2023 - 14:37 Uhr

Die Beschreibung sagt aktuell nicht viel aus bzw. ist diese nicht verständlich.
Über was für Werte sprechen wir hier?
Wenn du in deinem Code einfach Enums hast, dann kannst du die Werte einfach in einer int Spalte speichern.

Wenn die Werte dann auch Verknüpft sind, dann hast du ein Enum mit Flags Markierung.
Dabei werden die Werte im Code auf Bit Ebene Verknüpft und landen in einem Feld.
Beim auslesen muss dann nur der Int wieder in das Enum umgewandelt werden.

Oder meinst du mit festen Werten, dass diese in einer anderen Tabelle hinterlegt und in einer zweiten referenziert werden?
Dann musst du, wie von dir schon bemerkt, über eine ID auf die erste Tabelle verweisen.
Hier wäre eine klarere Beschreibung hilfreicher.

T-Virus

27.08.2023 - 19:55 Uhr

Zu deiner Frage ob man das machen kann, kann man generell immer ja sagen.
Ist auch im einfachsten Fall alles machbar.

Python ist eine Skriptsprache, da gibt es keine .exe Datei.
Viel mehr führst du dort das .py Skript dann über die python Runtime aus.

Bei C# ist es aber nicht anders, auch dort ist die .exe nur eine .NET Anwendung, keine native .exe
Diese wird dann über .NET ausgeführt.

Es gibt für C# unmengen an Tutorials.
Wenn du mit der offizielen Doku nicht arbeiten kannst, dann müsstest du schauen ob du selbst passende Bücher findest.
Ob diese für dich taugen, musst du dann selbst prüfen.

Ich habe einige .NET und C# Bücher hier liegen.
Leider sind die meisten noch für .NET Framework.
Nur ein Buch für .NET 6 wäre in Deutsch, was mir bekannt ist.

Link:
https://www.amazon.de/NET-Grundlagen-Profiwissen-Rezepte/dp/3446469303

T-Virus

24.08.2023 - 22:44 Uhr

Bei DI geht es gewiss darum, dass sich die konsumierenden Klassen nicht um die Erzeugnung der Objekte kümmern müssen.
Dies ist ein wichtiger Aspekt um die Klasse selbst nicht mit konkreten Details zu belasten, was auch nicht die Zuständigkeit einer Klasse sein sollte und u.U. nicht mal machbar wäre.

Dein Code ist hier etwas zu einfach gehalten, zeigt aber den Kerngedanken von DI vereinfacht.
Hier ist es immer ratsam, gilt auch ohne DI, dass man gegen die Interfaces arbeiten sollte.
Dadurch vermeidet man eine strafe Kopplung zu konkreten Implementierungen.
Dies kann zwar u.U. gewünscht sein, sollte aber i.d.R. vermieden werden.
Gerade wenn man dann eine andere Implementierung braucht, müsste man den Code klonen und umschreiben, was unnötig und unsinnig ist.
Wenn du dich mit der Doku und .NET 7+ befasst, kommt man um das Thema nicht mal mehr drum herum.

Doku:
https://learn.microsoft.com/de-de/dotnet/core/extensions/dependency-injection

Ich bin gerade selbst dabei einige ältere aber wichtige ASP .NET Projekte die noch auf SOAP und WCF basierte Dienste anbieten nach .NET 7 und Docker zu migrieren.
Dort kommt man um DI nicht mal drum herum, was sogar sehr positiv ist.

Dies nimmt mir viel Arbeit ab, da ich die Erstellung von bestimmten Schlüsselobjekten an Microsofts Extension für DI verlagere.
Dadurch muss ich nur vorgeben wie die Objekte der jeweiligen Klassen erstellt werden (Singleton, Transient, Scoped).
Somit kann man auch sehr genau steuern ob es eben je nach Situation nur ein Objekt (Singleton), pro Request (Scoped) oder sogar pro benötigte Instanz (Transient) ein Objekt gibt.
Dadurch gibt man die Kontrolle zur Erzeugung der jeweiligen Instanzen auch aus der Hand bzw. verlagert diese aus den jeweiligen Klassen.

Das Thema kann bestimmt Abt und co. besser beschreiben 😃
Die sind da tiefer drin als ich.

T-Virus

24.08.2023 - 14:58 Uhr

@Abt
Meinst du nicht einen Full Table Scan?

Ansonsten brauchst du passende Indexe um die Daten optimal zu laden.
Gerade wenn die Datenmenge groß ist, spielt ein Index eine wichtige Rolle.
Natürlich sollte dieser zusammen mit der Abfrage passen.
Im Idealfall kannst du auch einen Index bauen, der dir alle Daten liefert.
Dadurch muss die Tabelle nicht angefasst werden, was aber nicht immer möglich ist.
Je komplexer die Abfragen werden und umso mehr Spalten/Tabellen bei der Abfrage dazu kommmen umso schwerer wird es hier nur mit Indexen zu arbeiten.

Alternativ wären auch materialisierte Views was, wenn sich die Daten selten ändern.
Dann musst du die View nur aktualisieren, wenn sich die Daten ändern.
Hier musst du aber prüfen was in Kombination mit deiner Anforderung am besten läuft.

T-Virus

24.08.2023 - 11:58 Uhr

Pauschal wirst du vermutlich keine passende bzw. die beste Antwort kriegen.
Du musst hier selbst prüfen welcher Ansatz das passende Ergebnis liefert.
Wenn du die Daten aus zwei Tabellen zusammenführen musst, wäre der UNION ALL Ansatz schon eine möglichkeit.

Ansonsten könntest du, wie in deinem zweiten Ansatz, die Daten per Join ermitteln und dann selbst Dedublizieren.
Dann brauchst du ggf. mehr Code um die Daten passend für dein Ergebnis aufzubereiten, dies kann u.U. aber auch besser sein.
Was der beste Ansatz ist musst du selbst prüfen/messen, da können wir dir nicht wirklich helfen.
Da spielen auch viele Faktoren eine Rolle wie z.B. Aufbau der Tabellen, Indexe usw.
Was für dich dann vertretbar ist und auch das korrekte Ergebnis liefert, musst du dann im Endeffekt selbst prüfen.

T-Virus

21.08.2023 - 10:10 Uhr

@M.L.
Wäre auch eine Möglichkeit.
Leider konnte ich bisher nicht rauslesen von was für einem Programm wir reden.
Wenn es eine UI Anwendung ist, wäre Docker raus.
Ist es aber nur ein Programm um Daten aufzubereiten o.ä. dann würde ich Docker auch einplanen.

T-Virus

21.08.2023 - 10:08 Uhr

So wie es aussieht, musst du wohl ein Test Projekt bereitstellen.
Hoffentlich ist das einfach machbar, dann kann es ggf. schnell gefixt werden 😃
Hatte zwar auch mal im Source geschaut, bin aber leider damit nicht sonderlich vertraut.
Wie portieren bei uns gerade auch einen Client von WPF zu Maui, da halte ich bei solchen Themen auch die Augen offen.

T-Virus

12.08.2023 - 09:48 Uhr

Eigentlich ist das Thema gut dokumentiert.
Schau mal ob du dort alles korrekt gemacht hast.

Doku:
https://learn.microsoft.com/de-de/aspnet/core/fundamentals/environments?view=aspnetcore-7.0

T-Virus

12.08.2023 - 07:42 Uhr

Gibt eine neue Version von moq, man beachte die Versionsnummer 😕
Langsam fühlt sich das ganze fast wie trollen an.

Release Notes:
https://github.com/moq/moq/releases/tag/v4.20.69

T-Virus

10.08.2023 - 18:32 Uhr

@Abt
Alles klar, bin auf Twitter/X nicht mehr aktiv bzw. logge mich nicht mehr an.
Da Elon die Ansicht stark beschnitten hat, konnte ich es nicht sehen.
Aber danke für den Hinweis!

T-Virus

10.08.2023 - 18:22 Uhr

Komisch, ich sehe folgende Meldung.

Scheinbar hat er schnell den Text geändert...

I'm sorry if I haven't been as active today as yesterday with the feedback, but it's the first time I had to unify two repos. Ended up cherry-picking every commit from the core impl. on top of the SposorLink public repo. There's surely a few stupid things here and there

T-Virus

10.08.2023 - 18:02 Uhr

Kleine Wende am Nachmittag, wenn auch keine große.
Kzu hat scheinbar SponsorLink als Open Source veröffentlicht.
Ist m.M.n. zu spät und dürfte dem Dammbruch nichts mehr entgegenwirken.

https://github.com/moq/moq/issues/1384
https://github.com/devlooped/SponsorLink

@Abt
Ja, da bin ich bei dir.
Ich finde es auch fraglich, dass man hier noch mit Sponsoring die Tat belohnt.
Es wurde oft genug darauf hingewiesen, dass hier ein Bruch des GDPR vorliegt und selbst ein Ersatz wie eine Guid hier keine saubere Lösung wäre.
Ich schau da noch eine Weile drauf aber das Schiff ist im großen und ganzen abgefahren.

T-Virus

10.08.2023 - 15:35 Uhr

Ja, das ist leider alles sehr unschön.
Bisher ist da auch nichts von Einsicht von Kzu zu sehen.

Leider zeigt es auch die Schwächen des Gesamtsystems.
Hier hat NuGet im Grunde die gleichen Probleme wie Node.js und andere Paketquellen ohne zusätzliche Maintainer die die Pakete vor der Freigabe nochmal gegenprüfen.
Wenn der Code und die Pakete durch die ganze Kette laufen können ohne diese genaustens zu prüfen, dann kann man darüber leider sehr viel Schaden anrichten.
Leider zeigt sich in diesem Fall, dass man dabei nicht mal Vertrauen in die eigentlichen Paketbetreuer bzw. den ursprünglichen Entwickler haben kann.
Was natürlich sehr schade ist, da man diesen Leuten auch sein Vertrauen bisher gerne geschenkt hat.
Ich habe mit Moq selbst bisher nur in einem Projekt gearbeitet, fand das Konzept und die Umsetzung damit aber sehr gelungen.

Ich sehe hier auch den Versuch seitens Kzu die Situation um OSS hier als Ausrede für diese Aktion vorzuschieben.
Bzw. eine schlechte Planung was den finanziellen Aspekt seiner Arbeit an geht.
Wenn man Software Entwicklung mit einer offenen Lizenz durchführt, dann kann man leider nicht erwarten das jeder Geld dafür springen lässt.
Hier muss man sich m.M.n. möglichst vorher überlegen ob man finanziell auf der Arbeit aufbauen will und dann durch entsprechende Konzepte und Ansätze einen finanzielle Unterbau aufstellen.
Hier reicht es eben nicht auf Sponsoren aller Art zu warten und hoffen.
Beispiele für solche Ansätze wären kommerzielle Erweiterungen für Moq o.ä.

Die meisten nehmen freie Software heute einfach als gegeben hin ohne an die Entwickler dahinter zu denken.
Hier bräuchte es ein Gesamtkonzept um solche Projekte allgemein besser zu fördern.
Ähnlich der Linux Foundation zur Sicherung der Entwicklung von Linux und Projekten rund um Linux.
Natürlich kann man dann auch nicht alle Entwickler damit abdecken aber es würde die Situation bei passenden Gemeinschaften etwas verbessern.

Ansonsten bleibt nur der Weg direkt zur Umstellung auf ein komerzielles Produkt bzw. Lizenz.
Dies wurde auch im github Issue bei Microsoft vorgeschlagen um eben damit Geld zu verdienen.
Wäre zwar für die Masse der Projekte schade, da Moq an sich eine gute Lib ist/war.
Aber es wäre alle mal besser gewesen als git Emails mit obfuscated Code abzuschnorcheln.

Ich bin etwas pessimistich was Mopq angeht.
Ich glaube nicht, dass nach der Aktion Moq noch eine große Zukunft hat.
Mich würde es auch nicht wundern, wenn das Projekt Heute moder Morgen dicht gemacht wird.
Nach der Aktion und die ganzen Projekten die jetzt abspringen, dürfte sich das in den nächsten Tagen und Wochen auch bei Kzu bemerkbar machen.

Nachtrag:
AWS scheint schon Konsequenzen zu ziehen und will aus den ehemaligen Sponsoren entfernt werden.
Soweit ich dies lesen konnte war AWS einer der wenigen die auch finanziell einmalig eingesprungen sind.
Sollte für Kzu eigentlich ein deutliches Signal sein.

Pull Request:
https://github.com/moq/moq/pull/1381

T-Virus

09.08.2023 - 19:03 Uhr

So wie sich seine Aussagen lesen, wird da auch keine Entschuldigung deswegen kommen.
Ist zwar Schade aber er selbst hat sich dazu entschieden.
Jetzt muss er mit den Konsequenzen leben.
Seine Reputation und die von Moq dürften jetzt gegen 0 gehen.
Alternativen stehen in den Startlöchern.

Link:
https://github.com/dotnet/runtime/issues/90222#issuecomment-1671736796

T-Virus

09.08.2023 - 15:03 Uhr

Bin nicht sicher ob es hier passt, falls nicht bitte verschieben.
Die viel verwendete Lib moq hat in der neusten Version ab 4.20 SponsorLink eingebaut.
Diese scheint mit Obfuskated Code via git die Benutzer Emails abzufragen, zu hashen und zu verschicken.
Ist alles sehr dubios und vom Entwickler von moq selbst initiiert.

Issue auf Github dazu:
https://github.com/moq/moq/issues/1372

Wer also moq verwendet, sollte das Thema im Auge behalten.
Ggf. sollte man auch auf Alternativen ausweichen.
Das Thema schlägt bereits hohe Wellen und m.M. nach auch zu recht.

Nick Chapsas dazu:
https://www.youtube.com/watch?v=A06nNjBKV7I

T-Virus

09.08.2023 - 09:19 Uhr

Die Null Prüfung kommt dadurch, dass der erste if Block erst den Typ auf Person prüft.
Durch das ! vor den Klammern, wird dann das Ergebnis umgekehrt.
Entsprechend würde er dort nur über das if springen, wenn das übergeben Objekt vom Typ Person ist.
Null und andere Typen entsprechen dann nicht dem Typ Person, entsprechend  würde er in diesen Fällen auch in das if springen!

Der zweite if Block ist gleichwertig zum ersten,dieser Syntax wird aber erst in einer neueren C# Version unterstützt.
Der erste if Block war quasi der "alte" Weg um die Negierung umzusetzen.
Durch die Einfügung von is not würde das dann sauberer gelöst.

Nachtrag:
Hier noch der Link zur Doku:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/operators/is

T-Virus

07.08.2023 - 13:03 Uhr

Ist alles dokumentiert, wenn man danach sucht und sich mal einliest.
Das ist übrigens nicht das erste mal, dass man dir den Hinweis auf die Doku gibt und dass du die Grundlagen lernen solltest.
Es macht ehrlich gesagt keinen Spaß und ist unnötig Mühe dir in jedem Thread von dir, das gleiche zu schreiben.
Bitte nimm es dir zu Herzen und lies die Doku oder ein Buch oder mach ein Tutorial.
Das Grundlagen Forum ist nicht dazu gedacht, dir alle Fragen zu den Grundlagen oder zur Anwendung sämtlicher .NET Klassen zu beantworten.
Dafür gibt es ausreichend Quellen (Doku, StackOverflow etc.)

Doku:
https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1.clear?view=net-7.0

T-Virus

03.08.2023 - 16:02 Uhr

Deine Abfrage sollte mit == Prüfen.
Ein einzelnes = ist eine Zuweisung und hier vermutlich falsch.
Oder ist der Code nur beispielhaft runtergetippt?

Nachtrag:
Abt hat den Code schon mit dem Fehler getippt :p
Aber solltest du anpassen beim übernehmen.

T-Virus

31.07.2023 - 20:45 Uhr

Was genau ist hier das Problem?
Wollt ihr nur eine UI haben, dann wäre MAUI ein Weg weitere müsstet ihr ggf. evaluieren.

.NET Framework ist die alte Welt, hier sollte man schon seit längerem mit der Migration anfangen.
.NET Standard erleichtert euch dies auch ein gutes Stück weit, falls man den Code unter beiden Welten braucht.
Wenn ihr keinen harten Abhängigkeiten die nur für .NET Framework laufen, dann spricht auch nichts gegen einen kompletten Umstieg auf .NET 6/7/8+.

Wir sind gerade selbst dabei eine Web Anwendung auf .NET 7 zu migrieren und direkt per Docker auch noch als Container zu verteil.
Damit lösen wir uns auch von unserem einzigen Mono Web.
Ist in dem Fall aber auch einfach, da die Anwendung "nur" aus einem Service, einer Handvoll Tasks und einer Java Anwendung besteht.

Wie Abt aber schon schreibt, würde ich den Ansatz mit einem Web Server In App wieder verwerfen.
Spätestens wenn es in die App Stores z.B. bei Apple geht, wird die App nach einer genauen Prüfung vermutlich abgelehnt.
Dort sind die Vorgaben sehr strikt und solche Lösungen auch nicht gern gesehen.

Nachtrag:
Laut Stackoverflow kann ein Http Server max. 10 Min. laufen.

Link:
https://stackoverflow.com/questions/20698287/create-an-ios-app-that-runs-as-web-server-in-background

T-Virus