Laden...

Prüfen ob Klasse/Unterklasse und Methode existiert (via String).

Erstellt von Froschkoenig84 vor 6 Jahren Letzter Beitrag vor 6 Jahren 6.587 Views
F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren
Prüfen ob Klasse/Unterklasse und Methode existiert (via String).

Hallo. 😃

Ich möchte eigentlich nur prüfen, ob eine Methode (ControllerClass->ActionMethode) existiert.

var MethodTest = C.EVENTS.Test();

        Type Class = Type.GetType("C.EVENTS");
        System.Reflection.MethodInfo Method = Class.GetMethod("Test");
        Bool MethodExists = (Method != null);

Also die Methode Test() existiert tatsächlich innerhalb der Klassen C.EVENTS und gibt dort testweise statisch ein TRUE zurück.

Ich frage nun also via Type und MethodInfo die Existenz ab, bekomme aber einen Fehler, mit dem ich irgendwie nix anfangen kann. 😕

Also ist es irgendwie möglich zu prüfen, ob eine Klasse oder innerhalb dieser eine Methode existiert? Also via Name (String). 😕 Muss doch gehen.

3.003 Beiträge seit 2006
vor 6 Jahren

Reflection ist selten eine gute Idee, in ASP.NET noch seltener, weil der IIS die Laufzeitumgebung kontrolliert und du nie wissen kannst, welche Bibliothek sich gerade wo befindet (ja, die werden da fröhlich in temporäre Verzeichnisse kopiert, ein Nebeneffekt des on-the-fly-compilings).

In deinem Fall liefert GetType("C.EVENTS") vermutlich NULL.

EDIT: Wenn du sicherstellen willst, dass eine Methode vorhanden ist, definier ein Interface und lass die Klasse das implementieren. Gute alte OOP.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,

was liefert:


        Type Class = Type.GetType("C.EVENTS");

?

Würde es auch erklären, die Null-Exception.

Natürlich ist die Meldung von LaTino ernst zu nehmen!

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Okay, was wäre dann der Beste Weg. Ich erzeuge eine Instanz von meiner Klasse?
(Bin noch relativ neu in C#, ich weiß schon was eine Instanz ist, aber muss immer noch durch die Tutorials blättern, bis ich meinen Code zusammen hab. 😉 Komme eigentlich aus der PHP-Ecke, OOP ja, aber MixedVars und dynamische Klassennamen sind dort etwas einfacher gelöst.)

Bin jetzt erstmal im Wochenende, komme vielleicht am Sonntag dazu.

Aber Danke erstmal 😃
Ihr seid super.

16.807 Beiträge seit 2008
vor 6 Jahren

C# erfordert auch wirkliches Programmieren, PHP hingegen ist eher das Scripten.

Die OOP Grundlagen solltest Dir schon aneignen, dann ist das mit Interfaces eigentlich recht schnell gelöst.

3.003 Beiträge seit 2006
vor 6 Jahren

Abt hat natürlich Recht, du brauchst ein Verständnis für OOP uns solltest dir das auch schnellstmöglich aneignen. Als kleiner Anschubser:


interface ITestable
{
    bool Test(int parameter);
}

class ExampleClass : ITestable
{
    public bool Test(int parameter) => parameter > 0;
}

class AnotherClass : ITestable
{
    public bool Test(int parameter) => parameter % 2 == 0;
}

public static void Main()
{
    Random random = new Random();
    ITestable testCandidate = random.Next() % 2 == 0 ? (ITestable)new ExampleClass() : new AnotherClass();
    //so. jetzt weisst du nicht mehr, was genau testCandidate eigentlich ist.
    //aber eins weisst du: du kannst auf jeden Fall eine Methode Test(int) aufrufen:
    Console.WriteLine(testCandidate.Test(0));
}


in der OOP folgen die Klassen festen Strukturen. So musst du nicht mehr raten, was in einem Objekt steckt, sondern da du die Struktur, also den allgemeinen Bauplan des Objektes kennst, weisst du jederzeit, was du damit machen kannst. Hier im Beispiel weisst du zwar nicht, WAS das Ergebnis von Test(0) sein wird, aber du weisst, dass es existiert und du es nutzen kannst. Das ist für jemanden, der bisher nur mit schwach bis gar nicht typisierten Sprachen Umgang hatte, kein ganz so schnell greifbares Konzept, daher, wie gesagt: schnapp dir ein Buch (nichtmal zu C#, sondern zu OOP) und arbeite es durch ist der beste Rat, den du kriegen kannst.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

57 Beiträge seit 2012
vor 6 Jahren

Ich versteh den Sinn nicht:
?(
Du musst doch wissen, was du programmieren willst! Und VisualStudio zeigt dir in einem Klappfenster doch immer alle vorhandenen Methoden an

OO gibts seit Platon - hatte der auch C#?

16.807 Beiträge seit 2008
vor 6 Jahren

Visual Studio ersetzt aber kein OOP.

3.003 Beiträge seit 2006
vor 6 Jahren

Ich versteh den Sinn nicht:
?(
Du musst doch wissen, was du programmieren willst! Und VisualStudio zeigt dir in einem Klappfenster doch immer alle vorhandenen Methoden an

Das ist wahr. Und jetzt:


object myObject = GetObjectFromExternalSource();

var myTestableObject = myObject as ITestable;
if(myTestableObject != null) myTestableObject.Test(0);
else throw new InvalidOperationException("Nanu. Das Objekt ist nicht, was ich erwartet hatte.");

Es gibt eine Enwturfszeit, und eine Laufzeit. Nicht immer sind zur Laufzeit dieselben Informationen vorhanden wie zur Entwurfszeit. Und Visual Studio hilft nur dem Entwickler in der Entwurfszeit. EDIT: man kann sich in so einem Fall mit Reflection helfen, es geht aber eben auch eleganter und sicherer. Darum geht's in diesem Thread.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Nur um mal kurz klarzustellen. Ich beherrsche OOP. Deswegen weiß ich ja auch wie man eine Instanz erzeugt. Ich programmiere seit 1998 Java und C++. Ich bin nur nicht mit der neuen C#-Syntax und den vorgefertigten Methoden vertraut. Deswegen muss ich mi´ch durch die Doku kämpfen.

Was ich noch suche sind sinnvolle Ideen für

GetClassByName("Classname.SubClassName")

und

GetMethodByName("Classname.SubClassName.Method")

oder

ClassByNameExists("Classname.SubClassName")

und

MethodByNameExists("Classname.SubClassName.Method")

.

Und ein wenig Syntax konnte ich in den vergangen 6 Monaten bereits aneignen (aber eben nur autodidakt). Bin eben nur noch kein Profi.

T
461 Beiträge seit 2013
vor 6 Jahren

Eine andere Frage, warum diese Umstände, vielleicht gibt es eine einfachere Lösung?

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

4.931 Beiträge seit 2008
vor 6 Jahren

Die Subtypen müssen, wenn man Reflection benutzt, mittels Type.GetNestedType ermittelt werden:


Type classType = Type.GetType("C");
Type subclass = classType.GetNestedType("EVENTS");
// ...

(und auch hier jeweils auf "null" überprüfen!).

Aber die Frage der anderen ist berechtigt: welchen Anwendungsfall hast du, um überhaupt Reflection einsetzen zu müssen?

T
2.219 Beiträge seit 2008
vor 6 Jahren

@Th69
So wie ich es aus dem letzten Post verstehe, ist dies reiner Lernzweck.
Ohne einen konkreten Ansatz, halte ich dies aber für nicht zielführend.

Ich hatte bisher, in fast 10 Jahren mit C#, keinen Fall in dem ich per Reflection arbeiten musste um solche Prüfungen durchzuführen.
Dies ist auch selten Zielführend, da Reflections hier in diesem Fall durch OOP gelöst wird.
Wenn ich eine Klasse auf Methoden prüfen muss zur Laufzeit, dann kenne ich meistens den konkreten Typen nicht oder nicht genau.
Dieser Fall kommt dann aber nur vor, wenn ich "fremden" Code per Laufzeit einlade und dann damit arbeiten will.
Aber bisher hatte ich solch einen Fall nicht und könnte mir auch keinen konkreten Fall für solche eine Szenario vorstellen.

In dem Fall von Froschkoenig84 benutzt man aber Ableitungen um eben vorhandene Methoden sicher zustellen.
Ob diese dann wiederum implmeniert wurden, dass steht dann wieder auf einem anderen Blatt.
Aber in dem Fall sehe ich keinen direkten Nutzen für Reflections.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

3.003 Beiträge seit 2006
vor 6 Jahren

Auch scheint ihm der Unterschied von Subclass und Nested/embedded class nicht vertraut zu sein. @Froschkoenig, niemand hat bezweifelt, dass du schon programmiert hast. Das ist nach meiner Erfahrung genau das Problem:

  • Anfänger machen sich mit der Sprache vertraut, und weil C# eine ausgezeichnete Sprache ist, um OOP zu lernen, kommt das quasi nebenbei kostenlos. Reflection wird erst viel später entdeckt.

  • Leute aus dem Bereich PHP/C/Javascript hingegen versuchen ihre Erfahrungen mit den anderen Sprachen nach C# zu transportieren. Das geht nicht immer, also wird versucht, Unzulänglichkeiten mit Reflection zu lösen. Unglücklicherweise funktioniert das auch (erst einmal). Das Ergebnis ist aber kein guter Code und potenziell fehlerbehaftet. Und Fehler, die aus dem Einsatz von Reflection beruhen, lassen sich sehr, sehr schwer finden - das ist mit der größte Dreck, der einem unterkommen kann.

(Ich habe erst vor zwei Wochen einen Fehler aus einer alten ASP.NET-Anwendung suchen müssen, wo per Reflection aus den vorhandenen .dlls ein bestimmer Typ gesucht und instanziiert wurde, was zur Laufzeit in manchmal fehlgeschlagen ist, und manchmal nicht. War toll.)

Daher unser Bemühen, dich vor der dunklen Seite zu bewahren 😉. Im Prinzip reicht der Schnipsel von Th69, um einen nested type zu finden. Sollte es noch weiter verschachtelt sein (was auch schon wieder für Murks in der Architektur spräche), müsste man u.U. rekursiv ran.

Wie T-Virus schreibt: Probleme, die man per Reflection löst (mit ganz wenigen Ausnahmen), sind meistens mit etwas Aufwand sauber lösbar. Der Aufwand resultiert in weniger Problemen, die man später damit hat. Stell dir mal die Frage, was passiert, wenn jemand auf die Idee kommt, etwas zu refakturieren: die eingebettete Klasse rausziehen, und die Methode umbenennen. Das würde genauso kompilieren wie vorher, und erst in Rauch aufgehen, wenn man bei der Werksabnahme ist [1].

LaTino

[1] Wenn es mehrere Möglichkeiten gibt, wie etwas schief gehen kann, wird es auf die schlimmste Weise zum ungeeignetsten Zeitpunkt schief gehen. (Murphy)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Ganz simpel...

ich habe ein Controller-Action-Routing. Ich habe also meine Controller-Klassen und darin liegen die Action-Methoden, die ein weiteres Vorgehen abhandeln...

bspw.

*/events/list/
*/events/view/1/

Zunächst prüfe ich, ob ein Controller "events" existiert. Da ich Klassen immer groß schreibe, eben ToUpper()...
Dann prüfe ich, ob die Action "view" existiert und übergebe möglichst eine ID via Parameter.

Insofern beides existiert rufe ich also C.EVENTS.View(1) auf, um Models und Views entsprechend der Interaktion zu verhochzeiten.

Der Aufruf ist nicht schwierig, aber problematischer ist die Tatsache, dass ich in der Klasse C eben alle existierenden Controller auf den vom User angeforderten auf dessen Existenz prüfen möchte. Klar, könnte ich in der Klasse C auf einfach ein Objekt bzw. Attribut - bspw. eine List<string> - anlegen, in der ich dann alle möglichen Attribute statisch hinterlege und abfragen kann. Das gleiche dann entsprechend in den einzelnen Klassen/Objekten meiner Controller, wo ich dann ein statisches Listenelement hinterlege, in dem ich wiederum alle Action-Methoden der entsprechenden Controllerklasse statisch hinterlege.

Dann lassen die sich abfragen, aber... ich bin faul. Dah muss ich immer diese Liste erweitern, sobald ich neue Controller oder Actions erstelle oder ggf. umbenenne oder gar lösche.

T
2.219 Beiträge seit 2008
vor 6 Jahren

@Froschkoenig84
Wenn du den Controller selbst entwickelst, macht es auf deiner Seite keinen Sinn die Funktionen auf vorhanden sein zu prüfen.
Wenn du zu faul bist sauberen Code zu schreiben, dann wirst du in diesem Forum nicht wirklich glücklich auf lange Sicht.

Hier sind Entwickler, die ihr Geld mit C# verdienen.
Und wir erwarten sowohl Eigeninitiative und auch sauberen Code.
Was du vor hast ist von der Umsetzung her Unsinn und unsauberer Code.
Was genau willst du machen, wenn es diesen Controller oder die Methode mal nicht gibt?
Soll dann dein Client nicht mehr funktionieren oder welchen Zweck willst du damit erfüllen.
Wenn du dies direkt im Web machst, was ja scheinnbar der Fall zu sein scheint, dann weißt du doch ob dein Controller sowie die Methoden vorhanden sind.
Dann kannst du dir den Umweg per Request sparen und den Controller direkt im Code instanzieren und aufrufen.

So wie ich deine aktuelle Vorgehenweise verstehe, produzierst du hier unsinnigen Code der auch den Grundsätzen von sauberem Code klar wiederspricht.
Wenn du ernsthaft C# programmieren willst, dann nimm dir die Zeit und lerne und mache es auch richtig.
Auch wenn du mehr Code schreiben musst, dann musst du dies tun!
Das ist als Programmierer auch deine Aufgabe.
Faule Lösungen entsprechend auch in der Regel ihrer Faulen Qualität.
Code Smell ist hier schon ein Punkt, den du mit solchen Lösungen provozierst.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Nein, die Idee ist, im Falle der Nichtexistenz soll der Controller einfach einen 404-Content basteln, bzw. den entsprechenden 404 hinterlegen, alternativ kann es auch eine Weiterleitung zur Starteseite sein.

Bei den Controllern seh ich da auch wenig Probleme, da die Leute selten per Hand ausprobieren, ob es eventuelle noch andere gibt. Aber bei den Actions kommt das überraschend oft vor, dass die User versuchen aus events/view/1/ mal einfach events/edit/1/ zu machen. Was ich selbstverständlich verhindere, da ich bei den Actions immer zunächst die Nutzerberechtigungen prüfe.

Aber ich habe eben mehr als 12 Controller und jedesmal viele unterschiedliche Actions (teilweise 24 Actions) darunter. Demnach müsste ich immer statisch prüfen...

... ob

C.ListOfController.Contains(InputController)

... und dann ob

C.EVENTS.ListOfActions.Contains(InputAction)

und diese Listen hinterliegen dann wie gesagt als (Controler) List<string> in der Klasse C und weitere Listen als (Action) List<string> in den einzelenen Controller-Klassen.

Ich müsste diese Listen dann aber bei jeder Veränderung im Code, auch wieder anpassen, da es sich ja um statische Listen handelt.

16.807 Beiträge seit 2008
vor 6 Jahren

Ich lebe ja in der ASP.NET Welt, aber was Du da machen willst / machst hab ich in der Form noch nie gesehen und bin auch ehrlich gesagt nicht so wirklich schlau geworden, was überhaupt das Ziel ist.

Kann das sein, dass Du versuchst das Routing System von ASP.NET nachzubauen? Warum?
Oder soll das eine Art erweiterbares Pluginsystem mit Routen werden, für das es ebenfalls schon bessere Lösungen gibt?
ASP.NET hat das, was Du hier machst - soweit ich das verstehe - alles schon an Board.

Ohne Dir zu nahe treten zu wollen, sondern ehe im Sinne des Augen-Öffnens: das hier knallt hart gegen die Wand.
Warum nimmst Du nicht die ASP.NET Mechanismen?
Dein Code ist auch so überhaupt nicht testbar.

Es macht allgemein in einem Forum i.d.R. mehr sinn, wenn Du erst mal beschreibst, was Du vor hast, statt Dein Problem zu beschreiben. Ganz öft löst sich das Problem, in dem man einfach die entsprechend geeigneteren Umsetzungswege verwendet.
Hier tritt in meinen Augen nämlich ein Problem auf, das Du Dir selbst baust, weil Du nicht die Technologie-Mechanismen verwendest.

3.003 Beiträge seit 2006
vor 6 Jahren

Der Ansatz ist wirklich Schrott. Wieso bitte muss der Controller genauso heißen wie das, was in der Adresse steht? Schau dir mal das Routing in ASP.Net MVC an. Da das ziemlich genau das macht, was du auf Teufel komm raus selbst programmieren möchtest (nih-Syndrom, anyone?), wäre es wenigstens sinnvoll, sich einmal anzuschauen, wie das Problem richtig gelöst wird.

Sorry, aber ich bin kein Fan davon, alles selbst zu machen, weil man sich für schlauer hält. Du machst dir einen Aufwand mit einem sehr simplen Problem, dass schon zigmal gelöst wurde...stattdessen könntest du deine wertvolle Zeit in die Controller selbst stecken....

LaTino

EDIT: Abt war schneller. Ich lass es aber Mal so stehen.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Warum seid ihr eigentlich so aggressiv? Ich habe höflich gefragt und habe auch nichts gegen Vorschläge oder Tipps. Ich sagte bereits, dass ich erst seit kurzem in C# programmiere. Würde ich bereits seit 10 Jahren damit programmieren, hätte ich vermutlich bereits ganz andere Möglichkeiten gefunden. - Stattdessen werft ihr mir alle vor, was für ein Idiot ich bin und wie dämlich meine Konstruktionen sind. Es grenzt teilweise an Beleidigung, was ihr da von euch gebt.

Ich bin eigentlich ein sehr dankbarer Forennutzer. Aber ich verzichte hiermit auf weitere Hilfe von euch.

Ich habe mich bei meinem Controller-Action-Routing an der klassischen Vorlage beim ASP.NET MVC (+Routing) orientiert, das im VisualStudio bereits als Vorlage existiert. Aber meine Test haben ergeben, dass meine Lösung fast 19x schneller läuft, als die Vorgabe. Meine Controller können via Git sehr schnell separat angepasst werden, ohne dabei Merge-Crashs zu erzeugen.

Ich bin euch dankbar für den Hinweis und die Tipps, dass Reflections möglichst unterlassen werden sollten. Ich habe das inzwischen geprüft und festgestellt, dass diese unglaublich prozessortlastig in der Nutzung sind und habe außerdem in anderen Foren nachgelesen, in welchen Fällen sie zu Problemen und sehr wackligem Code führen. - Wie gesagt, dass habe ich in anderen Foren recherchiert. Auch wenn ich nur dank euch hier, überhaupt auf meine Keywords gekommen war, um danach zu suchen.

Es tut mir leid, dass ihr keinen C#-Experten vor euch hattet, der auch noch so unverschämt war, euch Super-C#-Entwickler (die ja alle ihr Geld damit verdienen) naive und simple Fragen zu stellen oder eventuell Vorstellungen zu haben, die eben jemand hat, der 20 Jahre lang PHP entwickelt hat und erst vor wenigen Monaten auf C# umgestiegen ist.

Ich entschuldige mich sehr demütigst.
Ich ziehe mich von euch Profis zurück.

5.657 Beiträge seit 2006
vor 6 Jahren

Hi Froschkoenig84,

du fühlst dich zu Unrecht angegriffen. Die Leute, die hier antworten, wollen dir helfen. Die Ablehnung bezieht sich auf deinen Code, nicht auf dich persönlich.

Zielführender wäre, mal zu erklären, was du eigentlich vor hast. Wenn ich es richtig verstehe, dann willst du tatsächlich das Routing von ASP.NET nachbauen, weil es dir zu langsam ist?

Weeks of programming can save you hours of planning

T
2.219 Beiträge seit 2008
vor 6 Jahren

@Froschkoenig84
Wir wollen dir nur nahe legen deinen Ansatz zu überdenken.
Mein Kommtar sollte dir in soweit auch klar machen, dass wir beim richtigen Verständnis deines Vorhabens dir auch besser hefen können.

Wir können dich natürlich nicht dazu zwingen, deinen Code zu verwerfen.
Aber die Erfahrung der Leute hier im Forum hat schon häufig gezeigt, dass solche Sonderlösungen so gut wie immer den falschen Weg gehen und auf lange Sicht knallen.
Entsprechend solltest du erklären, was dein Vorhaben bezwecken soll, damit man dir auch helfen kann.

Bisher ist keinem richtig klar, welches Ziel du mit deinem Code verfolgst.
Gerade hier liegt das Grundproblem, weshalb niemand dir den richtigen Ansatz bieten kann.
Du musst hier schon erklären was das Ziel ist.
Bisher haben wir deinen Ansatz zur Lösung eines Problems aber wissen nicht welches Problem du hast.
Bisher können wir dir nur von Reflections abraten aber dir keinen besseren Ansatz bieten.

Wie gesagt wird einfach nicht klar, warum du diesen Ansatz überhaupt brauchst.
Auch sind deine bisherigen Code Beispiele nicht hilfreich um den Code zu verstehen bzw. das Problem nachvollziehen zu können.
Ich weiß nicht wozu du in dem Web, in dem auch deine Controller liegen, du dann noch Events etc. abfragen willst.

Zur Programmierzeit kennst du diese und kannst direkt ohne unnötige Abfragen darauf zugreifen.
Dafür musst du dann nicht mal einen Request machen, da die Controller direkt instaniziert und verwendet werden können.

Ein eigenes Routing kannst du dir auch sparen.
Hier hat ASP .NET schon die richtigen Ansätze.
Diese neu zu erfinden, hat auch nur bedingt Vorteile.
Zwar sind die Requests ggf. erst einmal schnell, dafür verzichtest du aber auf die vorhandenen Möglichkeiten vom Building Routing.
Auch musst du dann deinen Code zukünftig selbst pflegen und entsprechend stehst du bei Problemen dann auch erst einmal allein da.
Ich versuche hier immer auf die regulären Ansätze zu setzen.
Wenn du schon den Code aus Performance Grünen neu schreiben musst, müsstest du schon deine gesamte Architektur und sogar die ausgewählte Platform(OS, Programmiersprache, Webserver etc.) in Frage stellen.
Den wenn es dir schon beim Routing um Performance geht, müsstest du ein Web in der größenordnung von Facebook planen.
Und das halte ich für etwas viel für einen kürzlichen Umstieg von PHP zu C#
Auch kann ich mir nicht vorstellen, dass das Routing hier so Performance kritisch sein dürfte.
Wir setzen z.B. gerade mit ASP .NET Core ein Angular 2 Web auf.
Dort liegt das Client Web getrennt von einem API Web.
Das API Web besteht hier nur aus den Controllern samt Funktionen.
Die API liefert/nimmt dann die ViewModel entgegen und bietet die Speichern/Laden Funktionen sowie Löschen.
Hier setzen wir bei der API komplett auf das Default Routing.
Hier das Rad neu zu erfinden hätte bei uns keinen Mehrwert und würde das ganze nur noch weiter verkomplizieren.

Wie gesagt, schreib einfach das gesamte Problem einmal auf und welche Lösungen du erwartest.
Erst dann kann man prüfen ob es ein Problem gibt/ist oder ob/wie man das Problem lösen kann.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.807 Beiträge seit 2008
vor 6 Jahren

Die Frage ist, wie Du Deine Tests umgesetzt hast.
Man kann einiges am Routing an der Performance raus holen. Die Routing Performance ist aber den letzten Punkt, den man in Sachen Geschwindigkeitsverbesserung einer Webanwendung anfassen solle.
Ein klassischer Fall von: premature optimization is the root of all evil

Sehr wahrscheinlich erfindest Du das Rad einfach (falsch) neu.
PS: keiner war hier aggressiv oder hat Deine Person infrage gestellt.
Im Gegenteil: die Leute haben sich Zeit genommen, Dich auf die richtigen Wege zu lenken.
Du kannst das jetzt produktiv annehmen, was das Sinn eines Forums ist - oder halt ignorieren und sagen: ich mach es wie ich will.

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Ich habe ein alternatives Routing gebaut mit C++ auf NGINX. Dahinter läuft der IIS für die klassische Website und ein Apache für den Controller, der meine AWS-S3-buckets verwalteten soll, sobald ich genug Gewinn mit dem Produkt einnehme und mir einen großen AWS-S3-Pool leisten kann. Dabei handelt es sich um einen vServer mit NGINX (für das Routing), ein weiterer vServer mit einem LAMPP (um die Amazon-S3-Buckets zu verwalten) und ein dedicated Root Server mit IIS für meine C#.NET-Anwendungen.

Ich bin ein Freund von stabilen und sicheren Anwendungen, ich komme nämlich ursprünglich aus der Banksoftware-Entwicklung, habe anschließend aber 12 Jahre nur mit PHP in einer kleinen Webagentur programmiert, bis ich vor etwa 2.5 Jahren vollständig mit allem abgebrochen habe und mir ein paar Bücher zu Ruby, Python, JSF/JW und ein paar andere gesucht hatte... unter anderem bin ich irgendwann bei C# hängengeblieben, da ich bereits ein wenig Ahnung von C++-Syntax hatte und ich die strengen Richtlinien nicht verurteile. (auch wenn mir DynVarNames und MixedVars schon hin und wieder fehlen)

Also habe ich meinen wirklich gut bezahlten Job gekündigt, um in einer kleinen Webschmiede zu ein wenig C#.NET zu lernen. Leider war ich bislang nur in kleinen Projekten mit winizigen Projekten über 3-4 Templates mit maximal 4-6 dynamischen Landingpages vertaut worden. Also quasi nur eine .NET-WebPage, keine wirklich großes WebProject. Dafür kann ich aber nix. Also begonn ich eine Idee auszuspinnen, mit der man mit wenig Investment viel Geld verdienen kann.

Also habe ich dieses Projekt so vorbereitet, dass es relativ günstig umzusetzen ist. Da ich im Büro aufgrund meiner kleineren, minderwertigen Projekte kaum Weiterbildung erfahre, muss ich mich eben selber weiterbilden, was wäre also naheliegender, als mein eigenes Projekt umzusetzen.

Ich dachte zunächst an ein klassisches MVC mit den Standard-DesignPattern. Dann hab ich mir die Vorlagen in VisualStudio angeschaut und die waren leider alle viel zu umständlich. PHP oder nicht, wenn ich eines gelernt habe, dann ist es das KISS. Ich bin kein Fan von Fertig-Prozeduren, die ich - wenn ich sie manuell nachbaue fast 5mal schneller bekomme. Außerdem sind immer mehr Entwickler dabei von MVC auf DCI umsteigen. Ich habe eine Mischform aus beiden DVCR, wobei das Routing vollständig aus dem Modell herausgetrennt wird. Da dieses eigentlich extrem schnell laufen muss.

Mein Hauptrouting ist natürlich auf C++ über NGINX gelöst. Aber ich benötige in C#.NET trotzdem ein verdammt schnelles Rückfall-Routing

CONTROLLER -> INDEX -> VALUE|VALUE|VALUE
...oder...
CONTROLLER -> INDEX -> VAR:VALUE,VALUE,VALUE | VAR:VALUE,VALUE, VALUE

Ich habe mir diverse Lösungen angeschaut. Aber ich finde nix, das so schnell läuft, wie das, was ich gerade aufbaue.

Sobald ich meine Testversion beta geht, bin ich gerne an eurer Kritik interessiert. Vielleicht kann ich bis dahin ein paar Programmierer gewinnen, die jung und frisch denken und von den klassischen Mustern abweichen. Außerdem benötige ich Programmierer, die ein wenig Interesse am Hacken haben und die Sicherheit meines Projektes prüfen. 😛

Bitte verzeiht mir, dass ich euch hier nix erzählen kann, zumindest keine Details über das Projekt. Ich taste mich gerne voran, aber manchmal falle ich auf die Nase... aber ich weiß mich wieder hochzurappeln. So schlecht bin ich nicht, aktuell nur etwas unerfahren, aber sehr unkonventionell. 😛

3.003 Beiträge seit 2006
vor 6 Jahren

Deine Infrastruktur ist so ausgereift, dass die Optimierung des Routings sich eher lohnt als eine Optimierung der Controller / sonstiger Infrastruktur (i.S.v. Zeit pro roundtrip)? Nach deinen Ausführungen möchte ich das mal bezweifeln. Dazu ließe sich noch sehr viel sagen, würde aber zu weit vom Thema weg führen und bei dir nur als Genörgle ankommen, weil du deine Meinung offenbar sowieso schon gefasst hast und von uns nur Bestätigung haben möchtest.

Ein simples statisches routing, wie du es willst, wäre vermutlich ohne Reflection einfach so erschlagen:


class Mapper : Dictionary<Func<object[], IActionResult>, string>
{
    static Mapper() 
    {
         Add(c.Events.Edit, "PUT /events/{id}");
         Add(c.Rules.Add, "POST /rules");
         Add(c.Example.Delete, "DELETE /example/{id}");
         Add(c.Events.GetSubCollection, "GET /events/{eventId}/collection");
    }

    public IActionResult ProcessRequest(string url)
    {
           var route = this.FirstOrDefault(p => IsMatch(p.Key, url)) ?? NotFoundRoute;
           return route.Value(GetParameters(url));
     }

     //IsMatch: true, wenn request-uri auf die hinterlegte route passt
     //getParameters: extrahiert die {parameter} aus der request-Uri
    //NotFoundRoute: (objects) => new NotFoundResult();
}

Ganz ohne Reflection. Ich halte das aber für eine ungenügende Implementierung für ein modernes Routing. Filter, query parameters, partial requests, Sortierung, Response format uswusf müsste man noch einbauen. Ob das Ergebnis dann immer noch so robust und schnell wie zB das Routing in Asp.NET Core ist, bezweifle ich mal.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

😉 Nein, aber ich verstehe worauf du hinaus willst. Ich habe kein RESTful, da mein NGINX - sobald es alle Ports durchlässt, leider 20% langsamer läuft. Ich fang nur :80 und :443 fürs später geplante SSL. 😃

Ich habe aber vor, später ein RESTful zu integrieren, vermutlich muss ich es in 1-2 Jahren sowieso neu bauen, denn noch sind meine Erfahrungen nicht so gut wie eure. 😃 Sobald ich besser werde, will ich dann auch umfassendere Systeme ausbauen. Bis dahin ist meine Infrastruktur deutlich größer. Geplant sind mehrere Cluster über die wichtigsten Markets verteilt. Aktuell wird mein Vorhaben (zumindest Idee) ganz gut bewertet und ich hab leider nur 1'000 EUR im Monat, die ich in meine Infrastruktur investieren kann. 😕 Also heißt es schnell online gehen, schnell Kunden und Geld verdienen und in 2 Jahren dann international ausbauen. 😃

Naiv - sagen die einen, aber ich hab ja nix zu verlieren. 😃 Ist ja nicht so, dass ich hunderttausende von EUR investiere. 😉 - Wenn alles klappt, suche ich dann ab 2020 ca. 4-6 C#.NET - Webentwickler. 😛

Und was meine Controller betrifft, die sind ziemlich sauber gebaut. - Und die Reflections unterlasse ich, hab ja schon gesagt, dass ihr mich davon überzeugt habt. Ich habe eine andere Möglichkeit gefunden, und die Controller prüfe ich via Switch-Case und spreche sie entsprechend so an. - Hab's getestet, läuft superschnell (100 Mio => 1'200ms). Und meine lokale Maschine ist nur ein I7-Laptop mit 256GB RAM, mein Server ist etwa 4x besser ausgestattet und es laufen wneiger Hintergrunddienste. 😉

Gerade trenne ich noch meinen MSSQL-Server ab, damit dieser ebenfalls auf einer separaten Maschine läuft. - Jetzt muss ich mir nur noch eine Lösung für MongoDB ausdenken. Ich habe keinen Anbieter gefunden der WinServer+MongoDb anbietet. Also ein weiterer vServer und dort dann irgendein LinuxServer den ich dann via Intranet anspreche. Hab intern 255 IPs. Wird schon klappen.

Mein Problem ist, dass ich aktuell 10 Baustellen gleichzeitig bearbeitet, anstatt mich auf meine Programmierung zu konzentrieren. Neben Backend, DBs, Frontend (Templates und JSON-HTTPResponses), Infrastruktur und der Hybrid-Mobile-App (Cordova), ... ist mein größtes Manko die Tatsache, dass ich noch nie Buchhaltung oder Wirtschaftsrecht hatte. 😕 Abr ich habe 2 befreundete Banker, die mir ein wenig unter die Arme greifen wollen. 😃

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

@LaTino
PS: Der Mapper gefällt mir aber. 😃 Ich denke darüber nach, ihn etwas verändert im Admin-Bereich zu verwenden. 😃

Vielen Dank für die Idee.

3.003 Beiträge seit 2006
vor 6 Jahren

Und geh bitte vom konzept ab, eine Mutterklasse (bei dir C) zu haben, und dort zig Klassen rein zu schachteln. So organisiert man das in C# nicht, das ist in anderen Sprachen nur ein Notbehelf. Verschachtelte Klassen sind in .net/C# eher selten (vgl. Single Responsibility)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

F
Froschkoenig84 Themenstarter:in
63 Beiträge seit 2015
vor 6 Jahren

Hat das irgendwelche Nachteile (Sicherheit, Geschwindigkeit, Stabilität), ich habe die sogar in unterschiedliche Dateien ausgelagert. 😕

Letztendlich ist es doch nur eine Form der Strukturierung. Ich sehe viele Hilfs- und Standardklassen, die genauso unterteilt sind.

16.807 Beiträge seit 2008
vor 6 Jahren

Nein.

Eine Klasse > eine Datei ist das korrekte vorgehen.

Verschachtelte Klassen haben in C# so gut wie nie eine Berechtigung.
Sie lassen sich auch - wie viele Deiner aktuellen Umsetzungen - nicht mocken und sind damit sehr teuer im Testen.