Laden...
L
ltrader myCSharp.de - Member
Entwickler Mannheim Dabei seit 09.06.2008 60 Beiträge
Benutzerbeschreibung

Forenbeiträge von ltrader Ingesamt 60 Beiträge

05.03.2013 - 16:00 Uhr

Hallo herbivore

vielen Dank für die Infos! Ich schaue mir das mal an.
Ich möchte hier endlich mal mehr zu mehr Klarheit beitragen..

Viele Grüße

04.03.2013 - 16:07 Uhr

Hallo,

bei uns im Team führt das Thema der Koonstellationen
CLR Version / C# Compiler Version / .NET Framework Version / C# Version etwas zur Verwirrung und da ich hier gerne etwas mehr Klarheit schaffen würde bin ich auf der Suche nach einer einfachen Matrix, die das übersichtlich zeigt. Leider habe ich nichts adäquates gefunden.

Hat da ggf. jemand von euch einen Link zu einer geeigneten Matrix oder ähnlichem?

Viele Grüße
ltrader

11.07.2012 - 19:54 Uhr

Hallo,
das mit dem Delegate.Target ist ein guter Wink, das hatte ich noch nicht probiert.

[..] per Reflection auch von außerhalb der Klasse, ABER das ist in meinen Augen großer Mist.

Grundsätzlich ist das klar und ich habe auch nicht vor das im "normalen" Anwendungsfluss zu implementieren. Ich denke da vielmehr an einen Ansatz, der es mir ermöglicht mit deklarativen Elementen am Code der Anwendung Informationen zu loggen, der es erlaubt den Anwendungsfluss später automatisiert wieder auszuführen. Wichtig ist mir die in der Literatur oft als "Crosscuting concerns" von der eigentlichen Anwendungslogik zu trennen.

Um das zu erreichen bin ich auf der Suche nach geeigneten Werkzeugen

Grüße
ltader

08.07.2012 - 16:25 Uhr

Hallo,

gibt es eine Möglichkeit zur Laufzeit z.B. mit Hilfe von Reflection die sender Instanz eines bestimmten Event Handlers herauszufinden?
Ich meine damit nicht während der Ausführung des Handlers, wo man ja ohnehin Zugriff hat.

Um die Handler Methode ggf. "künstlich" - also nicht durch den Event - auszuführen und dies entsprechend mit sinnvollen Parametern zu tun müsste ich zu diesem Zeitpunkt an der Stelle wo ich den Aufruf tätige über die entsprechende Information verfügen.

Also soetwas wie: Merke dir die Sender Instanz eines Events zum Zeitpunkt der Event Registrierung oder so..

Kennt ihr hier Wege?

Viele Grüße
P.

13.03.2010 - 14:54 Uhr

Ich fürchte damit ist mir nicht geholfen - vielleicht habe ich mich auch nicht optimal ausgedrückt.

Was ich benötige ist eine Möglichkeit innerhalb der Instanz des Attributes eine Referenz auf das entsprechende Objekt oder MemberInfo Objekt zu ergattern.

Intention ist es innerhalb des Attributes mitzubekommen wenn die entsprechende Methode auf die as Attribut angewendet wird aufgerufen wird. So könnte ich deklatativ

  1. ein Logging betreiben
  2. Informationen auswerten, die den Aufruf der Methode betreffen.

Eine Alternative könnte sein, eine Art Listener an das entsprechende MethodInfo Objekt zu hängen, aber wie und ob das geht weiss ich nicht..

Grüße

13.03.2010 - 13:44 Uhr

Hallo,

Wenn ich ein CustomAttrbute schreibe und dieses auf eine Klasse oder Methode anwende kann ich wunderbar per Reflection die MemberInfos auslesen, auf die das Attribut angewendet wurde.

Besteht auch die Möglichkeit vom Code des Attributes aus Zugriff auf das MemberInfo Objekt zu bekommen, auf das eine Instanz des Attributes angewendet wurde? Wenn ja wie stelle ich das an?

Viele Grüße
ltrader

06.07.2009 - 10:48 Uhr

Hi Florian,
ich schau mir die tools mal an, danke dir.
Irgendwie brauche ich aber noch die richtig zündende Idee..

Viele Grüße und danke

03.07.2009 - 16:51 Uhr

Hallo,

In einer Anwendung werden bei deren Ausführung Teile des GUI Status mit der Intention in ein XML Dokument persistiert, zu einem späteren auf die gleiche Weise bei gleichem Anwendungs Flow erneut ein XML Dokument zu erstellen.

Das Ziel ist es, auf diese Weise durch ein Diff der beiden XML Files festzustellen, ob sich zwischentzeitlich Fehler in der Anwendung eingeschlichen haben.

Ein einfaches Diff mit einem Tool wie Windiff zu erstellen ist nicht schwer. Spätestens wenn aber (gewollte) Änderungen an der Anwendung zu einer Differenz führen hat man mit diesem Vorgehen ein Problem.

XmlDiff beispielsweise ist in der Lage Teile wie Präfixe oder Namespaces vom Vergleich auszunehmen.

Mein Dilemma ist allerdings dass meine Anforderung darüber hinaus geht:
Ideal wäre es einzelne Elemente/Attribute vom Diff Process ein-/ausschliessen zu können.

Eine Möglichkeit:
Zuerst überprüfe ich auf string gleichheit. Wenn das Ergebnis true zurück gibt: Wunderbar.
Wenn nicht könnte ich gegen ein XSD Schema validieren welches ich speziell für diesen Zweck erstellen könnte.
Das Problem dieses Ansatzes: Bei Schema Validierung habe ich soweit ich weiss keine Möglichkeit herauszufinden in wieweit die Werte der Elemente/Attribute übereinstimmen.
Das wäre allerdings nötig nach der derfolgreichen xsd validierung um herauszufinden ob meine Heuristik True oder False zurückgibt.

Hat jemand von euch eine Idee, wie man diese Problematik sinnvoll angehen könnte? Wisst ihr ob hierzu vielleicht schon Tools7APIs für diese Aufgaben zur Verfügung stehen?

Grüße und Danke für jede Idee!

15.06.2009 - 09:31 Uhr

Hallo ihr beiden!

Danke für eure Tipps, ich werde mir mal ein Sample bauen, dass die entsprechenden Möglichkeiten durchprobiert.

Grüße und danke!

12.06.2009 - 19:10 Uhr

Hallo,

auf automatisierte Weise laden wir unter bestimmten Umständen Typen zur Laufzeit. Um an den Typen zu kommen greifen wir auf die Assembly, die u.a. auf folgende Weise im XML definiert ist:

"MyAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b12a5c561934e089"

Jetzt stellt sich mir die Frage, was ich tun kann um eine TypeLoadException zu verhindern wenn die entsprechende Assembly durch eine mit einer neueren Version ausgetauscht wurde.

Soweit ich weiss gibt es die Möglichkeit einen Abschnitt in der app.config - Elemente dependentAssembly - bindingRedirect - zu definieren der ein Mapping mit definiert.

Gibt es eine Möglichkeit, auf diese Konfiguration zu verzichten?

Sodass z.B.
"MyAssemblyName, Version=1.1.0.0, Culture=neutral, PublicKeyToken=b12a5c561934e089"
geladen wird wenn
"MyAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b12a5c561934e089"
definiert ist, aber anstelle dieser erstere gefunden wird?

Danke im Voraus für jeden Hinweis 😃

Viele Grüße

11.02.2009 - 14:43 Uhr

Ja, ich habe die dlls in das Installationsverzeichnis geschoben.
Reicht in meinem Falle auch.

Grüße, ltrader

03.02.2009 - 16:56 Uhr

Ja, da habe ich auch gesehen, dass man die Voraussetzungen anscheinend mit dem SDK schafft.

das macht wohl u.a. die SDKVars.bat verfügbar welches wiederum auszuführen ist um die Visual Studio Tools ausführbar zu machen..

Ich hatte gehofft mit Hilfe eines primitiven xcopy C:\WINDOWS\assembly.....
oder ähnlichem mit sehr einfachen Mitteln um die Installation herumzukommen.

Kann zwar sein, dass das ziemlich ekelig aussieht, ich möchte momentan aber damit auch keine Bäume ausreißen oder irgendwelche Maßstäbe oder How Tos erstellen.
Funktionieren muss es..

03.02.2009 - 15:18 Uhr

Hello LaTino,

danke für deine rasche Antwort 😃

Es handelt sich in meinem Szenario nicht für eine in breitem Umfang anzuwendende Installationsroutine.

Ich habe die Notwendigkeit möglichst einfach eine Installationsroutine oder ein Script für die Installation unserer Anwendung - im Development Prozess - zu erstellen, sodass die Anwendung ohne größeren Aufwand bei unseren Testern auf deren Maschinen installiert werden kann. Deshalb möchte ich mir aus pragmatischen Gründen ein tieferes Eintauchen in diese Prozesse - z.B. windows installer - wenn irgendwie möglich sparen. Ich denke, es wäre mit Kanonen auf Spatzen geschossen.

Grüße, ltrader

03.02.2009 - 14:58 Uhr

Hallo,

für ein Installationsskript benötige ich einige .dlls im GAC registriert.
Normalerweise mache ich das mit dem gacutil.exe tool, dass mit der Visual Studio installation mitgeliefert wird.

Leider ist die Wahrscheinlichkeit, dass auf der entsprechenden Maschine Visual Studio installiert ist recht gering.

Eine Framework 3.0 Version ist allerdings vorhanden.
Wie bekomme ich eurer Meinung nach unter diesen Umständen am einfachsten und schnellsten meine .dlls in den Global Assembly Cache installiert, ohne unnötigen Aufwand betreiben zu müssen?

Grüße, ltrader

16.01.2009 - 11:15 Uhr

Hallo,

zur Unterscheidung genannter Verzeichnisse habe ich u.a.
http://www.dotnetspider.com/forum/ViewForum.aspx?ForumId=31716
gefunden.

Weiss jemand von Euch, wo genau das Thema in der MSDN behandelt wird?

Grüße, ltrader

17.12.2008 - 13:55 Uhr

Hallo ihr zwei,

genau der parallele Zugriff sollte das Problem sein..
Sicher. Die Lösung die ihr aufzeigt liegt mir jetzt auf der Hand. Manchmal sieht man den Wald vor lauter Bäumen nicht 😉

Ich probiere das mal. Sollte ja hinhauen..

Grüße und danke , ltrader

16.12.2008 - 18:15 Uhr

Hallo herbivore,

folgendermassen greife ich beim Lesen auf das File zu:


 using (FileStream lStream = new FileStream(iConfigPath,FileMode.Open,FileAccess.Read))
{


}

Ich ging davon aus, dass das mit Hilfe von using aufgerufenen Dispose()
Die Ressource wieder freigibt.

Das Schreiben mache ich über einen StreamWriter



 using (StreamWriter lStreamWriter = new StreamWriter(lTempPath))


wobei ich ein Stück weiter unten as File folgendermassen kopiere:


 File.Move(lTempPath, lCurrencPath);

Ich wüsste nicht, was hier augenscheinlich verkehrt sein könnte..

Gruß, ltrader

16.12.2008 - 16:17 Uhr

Hallo,

folgendes Szenario:
In einer Consolen Anwendung die durch einen Scheduled Task getriggert wird,
schreibe ich in regelmässigen Abständen ein XML file auf Platte.

Parallel dazu greift eine ASP.NET Anwendung gelegentlich auf dieses File zu.

Das Problem ist nun - scheint mir auch irgendwo plausibel - dass durch den Lesezugriff der ASP.NET Anwendung das File wohl blockiert ist; d.h. ich kann im nächsten Zyklus des Scheduled Task das File nicht überschreiben.

Welche Möglichkeiten seht ihr hier, dieses Problem zu umschiffen?
Gibt es eine sinnvolle Möglichkeit das File explizit freizugeben? Die Zugriffe sind alle unter Verwendung eines using(...) gewrappt.

Grüße, ltrader

15.12.2008 - 09:36 Uhr

Hallo,

Vor folgendem Problem stehe ich:
Auf einem Rechner habe ich einen IIS installiert, unter c:\inettpub\wwwroot eine asp.net Anwendung (MyApp) mit einer default.aspx angelegt und das Verzeichnis MyApp mit einer Webfreigabe versehen.

Von derselben Maschine aus komme ich wunderbar durch Eingabe von http://localhost/default.aspx auf die Seite.

Den Aufruf habe ich nun von einem anderen Rechner in derselben Domäne aus probiert: http://rechername/default.aspx
"The page cannot be displayed"

Ich komme nicht darauf, was ich vergessen haben könnte. Sicher gibts dafür eine einfache Erklärung!?

Gruß, ltrader

07.11.2008 - 10:21 Uhr

na das sieht doch schonmal recht gut aus!
Leider habe ich nicht, wie in Java, Open Source bzw. Freeware finden können auf dem Gebiet.

Viele Grüße

06.11.2008 - 10:57 Uhr

Hallo,

ich hatte mich - bisher erfolglos - auf die Suche nach einer Möglichkeit gemacht in VS2008 Professional entwickelten Code auf Code Coverage im Hinblick auf usere Unit Tests zu untersuchen.

Soweit ich weiss ist dies von Seiten Microsoft nur im Feature Umfang des Team System enthalten.

Meine Frage nun: Kennt jemand von euch einen Weg das - von mir aus auch auf rudimentäre Weise ohne schön aufbereitetes GUI - ohne die Team Suite hinzubekommen? Gibt es da evtl. Commandline tools o.ä. dafür?

Viele Grüße

25.10.2008 - 16:37 Uhr

hmm, da wir leider aus Firmenpolicy Gründen keinen Team Foundation nutzen dürfen, scheint TeamCity damit in ein K.O. reinzulaufen fürchte ich.

Hat jemand Erfahrung mit CCNet und TeamCity? Vor- und Nachteile?
Wie (zeit-)aufwändig ist soetwas unter genannten Anforderungen für einen "Anfänger" aufzusetzen?

24.10.2008 - 17:42 Uhr

Hallo,

für unser Entwickler Team planen wir eine gemeinsame Infrastruktur, in die wir unsere schon in Betrieb befindliche Source Kontrolle (Perforce) und unsere MsTest Unit Tests einbinden und überwachen können. Continous Integration wäre nicht verkehrt denke ich.

Mehr oder weniger zwangsläufig stößt man in diesem Zusammenhang auf
CruiseControl.NET. Bisher habe ich keinerlei Erfahrungen, wie man ein solches System aufsetzt. Was schätzt ihr, wie lange soetwas ca. dauert, bis man das soweit hat, dass zumindest das Perforce und der Continous Build dort eingeklinkt ist?

Kennt jemand von euch "bessere" bzw, weniger aufwändige alternativen?

Viele Grüße

17.10.2008 - 09:06 Uhr

änlich versuche ich es gemeinhin auch zu machen - dass ich die Klassen/Objekte von denen mein System Under Test abhängig ist, durch Test Doubles ersetze. Damit vermeidet man eben die Problematik, dass Gedeih und Verderb des Tests von Pdoduktivkomponenten abhängig ist, die ihrerseits mit ihrem Verhalten Einfluss auf den Test haben.

08.10.2008 - 16:09 Uhr

Hallo norman_timo,

vielen Dank, ich probiere das mal!

Grüße

07.10.2008 - 16:55 Uhr

Hallo,

vor einiger Zeit meine ich irgendwo die Möglichkeit gefunden zu haben das Template, genauer gesagt die eingebrachten using Direktiven am Kopf einer .cs Datei einstellen/konfigurieren zu können.

Weiss jemand von euch, wo ich diese Möglichkeit im Visual Studio 2008 bzw in dessen File System findet?

Beste Grüße

04.10.2008 - 14:35 Uhr

kurzer Nachtrag:
Vielleicht denke ich auch einfach zu kompliziert und es reicht zum automatisierten Testen, wenn ich auf den CurrentThread einfach eine entsprechend neue CultureInfo Instanz setze. Das sollte ja auf die App die gleiche Wirkung haben, wie wenn ich Windows global die regional settings ändere.

Gruß, ltrader

04.10.2008 - 14:28 Uhr

Hallo herbivore,

Den zweiten Teil kann ich beantworten: String.Format arbeitet standardmäßig mit den Einstellungen in "Regional and Language Options".

dachte ich auch, macht ja auch Sinn. Die Bestätigung dass das so ist hilft mir aber. Danke dir.

ist dein Problem, Excel dazu zu bekommen, die Werte richtig zu formatieren oder willst du die Werte in C# richtig formatieren (damit Excel sie versteht)?

Eine Kombination aus beidem ist wichtig um zu gewährleisten, dass das Resultat passt. Dem User ist natürlich wichtig, dass die Formatierungen im Frontend (Excel) stimmen. Was hinter den Kulissen geschieht ist für ihn nebensächlich 😉

Die Sache ist soweit implementiert, dass das Formatieren passen müsste. Um es zu testen werde ich auf meiner Maschine mal sämtliche Ländereinstellungen durchprobieren und die Soll Formatierungen mit den Inst Formatierungen vergleichen. Um das ganze dann automatisiert - regressiontest fähig - zu machen, werde ich mal sehen ob ich in meinem Unit Test die regional settings mit Hilfe von .NET ändern kann. So kann ich dann nach jedem Ändern den format string meiner Funktion abfragen und mit dem Soll wert vergleichen.

Was ich noch herausfinden muss ist, wie man die Regional Settings mit C# ändert. Spontan dachte ich da an System.Environment, das scheint aber so nicht zu gehen.

Viele Grüße

02.10.2008 - 17:57 Uhr

Hallo,

unsere Applikation liest Datums- und Dezimalwerte aus dem Backend aus und stellt sie in einem Excel sheet dar.

Jetzt stehe ich vor der Frage wie ich am Besten sicherstelle, dass die Darstellung der Werte im Excel Sheet in Bezug auf die im Windows XP/Vista unter „Regional and Language Options“ eingestellten Locales – Dezimalseparatoren, Tausender Trennzeichen, Stunden: Minuten:Sekunden –dargestellt werden.
Leider benimmt sich Excel da manchmal etwas eigensinnig.

Kennt ihr eine Möglichkeit in .NET den Formatierungsstring abhängig von den eingestellten Region Settings auszulesen und sinnvoll für das Formatieren der in Excel anzuzeigenden Werte zu nutzen?

Würdet ihr anders vorgehen?

Entscheidend ist, dass die Formatierung der Werte in Excel identisch mit den unter Regional Settings als Beispiel angezeigten Werten ist.

Grüße

22.09.2008 - 10:04 Uhr

Ah verstehe. Mit Rhino Mocks habe ich mich ansatzweise mal auseinandergesetzt. Ich selber bin aber zu dem Entschluss gekommen, Mocking nur dann einzusetzen wenn es nicht anders geht. Das Ganze wird dann immer recht schnell komplex und vor allem macht man implizit Annahmen über das Verahlten des Codes, nicht nur über dessen Resultate. (Behavior verification).

Viele Grüße, ltrader

P.S: Mal sehen ob ich doch etwas mehr noch über den Host Adapter finden kann.

21.09.2008 - 12:29 Uhr

schade, dass hier auch niemand von Euch Ideen zu dem Thema hat. Das hatte ich fast befürchtet. Im Netz und in einschlägiger Literatur hatte ich bisher auch nicht besonders viel Aufschlussreiches finden können.

Leider werde ich in den nächsten Wochen kaum darum herum kommen, einen Host Adapter für VSTO (Visual Studio Tools for Office) zu bauen befürchte ich.

Sollte doch jemand von Euch über irgendwelche Infos zum Thema stolpern, bin ich ein dankbarer Abnehmer 😉

Viele Grüße

@spike24:

(ich == Mock-Profi in Firma) Klingt sehr interessant für mich! Würde auch die Bezeichnung Testentwickler passen? Das genau ist meine neue Aufgabe im Unternehmen

19.09.2008 - 08:55 Uhr

@FZelle: Du hast vollkommen recht; ich werde das mal versuchen zu konkretisieren

Ja, leider scheint die Sache mit den HostAdapter n nur sehr rudimentär dokumentiert zu sein.
Definiert ist der HostAdapter in der MSDN unter Overview of Host Adapters folgendermassen: „A host adapter is a software component that lets you run tests in a specific environment“. Den Testing Host festlegen kann man im Visual Studio nach Doppelklick auf die *.testrunconfig Datei im Bereich Hosts.

Konkreter Fall bei mir: Als Test Entwickler möchte ich den Entwicklern die Möglichkeit bieten, unser VSTO (Visual Studio Tools For Office) Projekt – zumindest Teile davon - direkt im Excel Prozess testen zu können. Wenn es mir gelingt, die Unit Tests, die wir im Visual Studio schreiben, direkt im Excel Prozess auszuführen, ist das meines Erachtens nach ein Testen unter „realistischeren“ Bedingungen, als wenn wir den standard Prozess nutzen. Ausserdem bin ich nicht sicher, in wieweit z.B. VSTO excelspezifische Funktionalität – Erstellen der Excel Application Instanz – im VS testing Standardprozess möglich ist.
Viele Grüße

17.09.2008 - 21:22 Uhr

genau. folgendes:
MSDN: Overview of Host Adapters
nur leider finde ich ist die Sache nicht besonders gut dokumentiert vor allem im Hinblick darauf, wie ich meine Unit Tests im VSTO Prozess ausführen kann.
Sicherlich ist ein HostAdapter hierzu der richtige Ansatz. Wie aber klinke ich mich an den anderen Prozess ohne Remoting benutzen zu müssen?
Vielleicht hat ja der Eine oder Andere von euch auf diesem Gebiet schon Erfahrungen?

Viele Grüße

17.09.2008 - 16:07 Uhr

Hallo,

aktuell bin ich dabei zu versuchen einen funktionierenden HostAdapter für eine Test Umgebung anzulegen. Hat jemand von euch damit schon Erfahrungen sammeln können?

Grüße, ltrader

06.08.2008 - 10:36 Uhr

Hi,

die Stichworte Castle, Spring, NInject.. sind sehr interessant; über Castle habe ich schonmal irgendwo etwas angelesen. Werde ich mal als Anlass / Anhaltspunk nehmen, mich näher mit Dipendency Injection / DI Container zu befassen.

Was mich aber auch interessiert:
Habt ihr einschlägige Erfahrungen mit Test Driven Development und/oder Unit Testing? Hierbei fehlts mir nähmlich noch und ich werde mich da beruflich in den nächsten Monaten sehr stark hineinknien müssen. Auch wenn mich mir schon Einiges in Form von Theorie habe aneignen können so ist doch die Praxis das, was letztendlich zählt.

Gruß, ltrader

05.08.2008 - 17:47 Uhr

Hi FZelle,

genau dieses Stichwort, oder allgemeiner Test Double (nach Gerard Meszaros die Übermenge auf Mock, Spy, Stub, Dummy und Fake - er definiert hier durchaus Unterschiede);

Du meinst Mocks

ist die Ursache für meine Notwendigkeit.

Sind (fast) immer beim Unittesten mit dabei.

Fast immer würde ich nicht sagen; bei Behavior Verification wohl immer (Mocks und Spies typischer Weise - laut Meszaros), ansonsten Stubs wenn nur "Indirect Input" benötigt wird. Wenn man mit State Verification allein auskommt, braucht man oft keine Test Doubles.

Wie aber schleuse ich diese am Besten / sinnvollsten / elegantesten mit ein?

Gruß

05.08.2008 - 15:56 Uhr

Hallo,

@FZelle:

Dann hast Du aber bis jetzt immer die falschen Stellen gelesen,
oder die Richtigen stellen falsch Verstanden.

Die Sache habe ich vor Jahren mal gelesen gehabt und bin im Zusammenhang mit Design for testibility wieder drauf gestossen.
Sicher hast du Recht und es fehlt mir in diesem Bezug der Tiefgang. Ich lese das nochmal genauer nach. Was du schreibst klingt einleuchtend.

@JuyJuka:
Im Hinblick auf den Code den du als falsch anbringst machts mal Sinn über "Law of Demeter" zu lesen. Ziemlich interessant und passt hier glaube ich.

Was ich eigentlich brauche ist einen sinnvollen, möglichst einfachen und praktikablen Ansatz, einem Objekt - dass ich testen möchte (SUT) Instanzen bestimmter Klassen anzubieten, deren direkte Implementierung das SUT nichts angeht.

Viele Grüße

04.08.2008 - 17:43 Uhr

Hallo,

seit einiger Zeit bin ich recht intensiv dabei, mich mit dem Thema Unit Testing und Design for testibility auseinanderzusetzen.

In diesem Zusammenhang kommen mir immer wieder die Stichworte Dependency Injection bzw. Dependency Lookup unter. Hiermit soll erreicht werden, dass man einzelne Komponenten möglichst lose koppelt.

Sicher eine tolle Sache soweit, nur habe ich beim praktischen Umsetzen das Gefühl, dass ich hierdurch an vielen Stellen vermehrt Objekt Instanzen durchreiche - da ich diese ja großteils nicht mehr direkt in den Komponenten erstelle.

In wieweit ist es eurer Meinung nach zwangsläufig ein Zeichen für schlechtes Design, wenn man an vielen Stellen Objekte durch mehrere Instanzen durchreicht?

Ich habe nicht das Gefühl, dass ich unter Verwendung von Dependency Injection in meinem Fall davon absehen kann.

Dependency Lookup (e.g. Factory Pattern ) wäre denke ich eine Alternative hierzu. Die Idee gefällt mir aber nicht, da ich dann wohl gezwungen wäre den konkreten zu verwendenden Typen an zumindest einer Stelle zu konfigurieren.

Oder ist das ein ganz abwegiger Ansatz und sollte ich evtl. Prototyping in Erwägung ziehen?

Gruß, ltrader

25.07.2008 - 10:42 Uhr

Hallo herbivore,

hiermit IMHO hast Du völlig Recht:

Eigentlich ist es ja sogar so, dass ein Objekt nicht wissen soll und schon gar nichts davon abhängig machen soll, welche Objekte seine Events abonniert haben.

Vor allem im Hinblick auf die

"bösen Überraschungen".

Mein Anliegen hat volgenden Hintergrund:
Ich muss mir eine Strategie einfallen lassen, wie ich eine Anwendung schreiben kann, deren Aufgabe es ist als eine Art Recorder in Bezug auf eine andere Anwendung zu fungieren. Ein bestimmter Abschnitt einer Anwendungsausführung muss also mit meiner Anwendung aufzeichenbar und wieder abspielbar sein und ich muss zugeben, ich habe noch keinen blassen Schimmer, wie ich das am Besten angehe.

Ich denke nur, Reflection, Attribute und Serialisierung sind da wahrscheinlich wichtige Stichworte für mich.

Gruß, ltrader

24.07.2008 - 17:37 Uhr

Den Thread "SerializationException wegen Observer" habe ich jetzt gelesen.
Wirklich sehr interessant..
Dass die Frage, in welchen Fällen es Sinn machen könnte die Objekte, die an einem EventHandler hängen mitzuserialisieren ist aber glaube ich nicht abschliessend geklärt, oder?

Würde es nicht in dem Fall Sinn machen, wenn man z.B. den Status einer ganzen Applikation oder eines großen Teiles derselben auf Platte zwischenspeichern möchte? Wie seht Ihr das?

Gruß ltrader

24.07.2008 - 17:22 Uhr

Hallo herbivore,

zu 1.: Sehr interessant! Wusste ich nicht! Werde gleich versuchen da etwas mehr drüber rauszufinden.
zu 2.: Stimmt tatsächlich. Die Objekte habe ich serialisierbar gemacht und. Das klappt tatsächlich.
Wie genau definierst du

..Objekte beim Deserialisieren neu erzeugt und stimmen daher nicht mehr mit den ggf. noch bestehenden Originalobjekten..

..Einfach wenn das nicht überschriebene Equals bzgl der Objekte False liefert?

24.07.2008 - 16:33 Uhr

Hallo,

ich habe mir ein kleines Sample gebastelt, welches eine

  • Instanz einer Klasse erstellt
  • Unterschiedliche Werte in dem Objekt speichert (ihm also quasi einen Zustand verpasst)
  • Einige EventHandler anhängt
  • Die Klasse mit Hilfe eines BinaryFormatters serialisiert und mit einem FileStream auf die Platte legt.

Anschliessend deserialisiere ich das Ganze wieder. Klappt was die Daten anbelangt tadellos. Zwei Fragen hierzu, da ich damit bisher nur sporadisch Umgang hatte:

  • Mir fällt auf, dass beim Deserialisieren der Konstruktor nicht aufgerufen wird. Auch nicht der Default Konstruktor. Daraus schliesse ich, dass ich hierüber keine Initialisierung bzgl. des deserialisierten Objektes erwarten kann.
  • Alle angehängten EventHandler Referenzen sind verloren. Gibts hierzu einen "Ausweg"?

Sicher gibts für o.g. Verhalten ganz einleuchtende Erklärungen, die mir einleuchten wenn Ihr mir auf die Sprünge helft.

Habt Ihr gute Ressourcen / Links, die sich mit dem Thema Speichern von Zuständen bzw. Reflection befassen?

Viele Grüße

18.07.2008 - 15:39 Uhr

Hi Peter,

bin gerade bei einem anderen Ansatz, der recht vielversprechend aussieht.
Ich schreibe ein CompositeControl, dass einen Repeater als Member inkludiert, welcher mir meine ItemTemplats rendert.

HeaderTemplate und FooterTemplate Handling baue ich direkt im CompositeContrl ein. Das sieht recht vielversprechend aus bisher. Mal sehen..

Gruß

18.07.2008 - 11:57 Uhr

Zwei Schritte zurückgegangen und auch dann als Problem nachvollziehbar:

Gegeben ist eine Repeater Instanz mit HeaderTemplate und FooterTemplate wie folgt:



    <asp:Repeater ID="repeater1" runat="server">
    		<HeaderTemplate>
					<asp:DropDownList ID="ddl" runat="server"
										AutoPostBack="true">
						<asp:ListItem Text="header 1" Value="1"></asp:ListItem>
						<asp:ListItem Text="header 2" Value="2"></asp:ListItem>
					</asp:DropDownList>
					<asp:Button ID="btnCommand" runat="server" Text="btnCommand" />
					</br>
			</HeaderTemplate>
			<ItemTemplate>
				    <asp:DropDownList ID="rdbtnList" runat="server"
							    AutoPostBack="true">
								  <asp:ListItem Text="item 1" Value="1"></asp:ListItem>
									<asp:ListItem Text="item 2" Value="2"></asp:ListItem>
								</asp:DropDownList>
			</ItemTemplate>
    </asp:Repeater>

Der Codebehind sieht folgendermassen aus:



public partial class RepeaterPage : System.Web.UI.Page
{
	protected void Page_Load(object sender, EventArgs e)
	{

		repeater1.ItemCommand += new RepeaterCommandEventHandler(repeater1_ItemCommand);

		ArrayList data = new ArrayList();

		for (int i = 0; i < 10; i++)
		{
			data.Add("Item " + i);
		}


		if (!this.Page.IsPostBack)
		{
			repeater1.DataSource = data;
			repeater1.DataBind();
		}
	}

	private void repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
	{
		ArrayList data = new ArrayList();

		for (int i = 0; i < 5; i++)
		{
			data.Add("Item " + i);
		}
		repeater1.DataSource = data;
		repeater1.DataBind();
	}
}


Da ich im ItemCommand einen veränderten DataSource zuweise komme ich hier wohl um einen DataBind() Aufruf nicht drumherum.

Der Punkt ist der, dass keines der in den Templates enthaltenes Controls seinen State erhält sobald ich DataBind() aufrufe.

Seht Ihr Möglichkeiten, wie man diesen Punkt in einem eigens geschriebenen Control umschiffen kann?

Zweck der Sache ist es ein Control zu erstellen, welches von uns allgemein als Basisklasse dafür verwendet werden kann, Templates in ascx Form von extern zu laden. Im typischen Falle wird es hier nötig sein Buttons bzw. DropDowns im Header für Filterzwecke inzubringen, die über ein Autopostback den Filterkriterien entsprechende Daten an das Control binden.
Im ItemTemplate wird es in bestimmten Fällen auch nötig sein buttons o.ä. einzubinden, die ein PostBack auslösen.

Macht sowas eurer Meinung nach überhaupt Sinn oder sollte man hier eures Erachtens nach einen ganz anderen Ansatz fahren?

Gruß, ltrader

18.07.2008 - 11:16 Uhr

Hi Peter,

_controlTemplate ist vom Typ Control und repräsentiert das in OnInist geladene .ascx File, dass als Template geladen wird:




protected override void OnInit(EventArgs e)
		{
			base.OnInit(e);
			_controlTemplate = Page.LoadControl("~/Templates/TemplatedListTemplate.ascx");
			this.Controls.Add(_controlTemplate);
			_mainTemplate = _controlTemplate.FindControl("mainTemplate") as MainTemplate;
			this.Controls.Add(_mainTemplate);
		}


Ein Testprojekt habe ich mir erstellt, wo man recht gut erkennen kann, dass die Controls im Template den State nicht halten, so man einen DataBind() ausführt.

Gruss ltrader

17.07.2008 - 17:06 Uhr

Hi Peter,

das DataBind meines custom controls meine ich.

Die Templates lade ich mir von extern (.ascx)
und mache ein DataBind() im ItemCommand Event Handler
nachdem ich neue Items als DataSource gesetzt habe.

Die DataBind Implementierung sieht folgendermaßen aus:


	public override void DataBind()
		{
			// Controls with a data-source property perform their custom data binding
			// by overriding DataBind.

			// Evaluate any data-binding expressions on the control itself.
			base.OnDataBinding(EventArgs.Empty);
			TextBox txt;
			

			// Reset the control state.
			this.Controls.Clear();
			this.ClearChildViewState();

			//  Create the control hierarchy using the data source.
			this.CreateControlHierarchy(true);
			this.ChildControlsCreated = true;

			this.TrackViewState();
		}

Hier noch das darin aufgerufene CreateControlHierarchy(..)



		private void CreateControlHierarchy(bool useDataSource)
		{
			IEnumerable dataSource = null;
			int count = -1;

			if (useDataSource == false)
			{
				// ViewState must have a non-null value for ItemCount because this is checked 
				//  by CreateChildControls.
				count = (int) ViewState["ItemCount"];
				if (count != -1)
				{
					dataSource = new DummyDataSource(count);
				}
			}
			else
			{
				dataSource = this._dataSource;
			}

			if (dataSource != null)
			{
				Table table = new Table();
				Controls.Add(table);

				int selectedItemIndex = SelectedIndex;
				int index = 0;

				if (_mainTemplate.HeaderTemplate != null)
					this.CreateItem(table, -1, ListItemType.Header, useDataSource, null);

				count = 0;
				foreach (object dataItem in dataSource)
				{
					ListItemType itemType = ListItemType.Item;
					if (index == selectedItemIndex)
					{
						itemType = ListItemType.SelectedItem;
					}
					else if (index % 2 != 0)
					{
						itemType = ListItemType.AlternatingItem;
					}

					this.CreateItem(table, index, itemType, useDataSource, dataItem);
					count++;
					index++;
				}

				if (_mainTemplate.FooterTemplate != null)
					this.CreateItem(table, -1, ListItemType.Footer, useDataSource, null);
			}

			if (useDataSource)
			{
				// Save the number of items contained for use in round trips.
				ViewState["ItemCount"] = ((dataSource != null) ? count : -1);
			}
		}


Und hier noch das OnInit(..)





		protected override void OnInit(EventArgs e)
		{
			base.OnInit(e);
			_controlTemplate = Page.LoadControl("~/Templates/TemplatedListTemplate.ascx");
			this.Controls.Add(_controlTemplate);
			_mainTemplate = _controlTemplate.FindControl("mainTemplate") as MainTemplate;
			this.Controls.Add(_mainTemplate);
		}


16.07.2008 - 14:09 Uhr

Leider ergibt sich bei meinem Control immernoch folgendes Problem:

Wenn ich beispielsweise einen Button im ItemTemplate definiere
und eine Textbox im Header habe, so verwirft mir das Control den Wert in der TextBox sobald ich den Button klicke, und in dessen handler ein erneutes DataBind durchführe.

Das DataBind aber wohl definitiv dann nötig, wenn ich einen neuen DataSource an das Control binde.

In allen Beispielimplementierungen die ich bisher gefunden habe besteht dieses Poblem und ich habe bisher keinen Weg daran vorbei gefunden.

Hat jemand Ideen?

Gruß
ltrader

09.07.2008 - 19:17 Uhr

Klasse, scheint tatsächlich nötig zu sein so weit auszuholen wenn man da was zufriedenstellendes erreichen will.

Sieht hier schon recht gut aus.

@squadwuschel:
Folgender Link sollte helfen:
http://msdn.microsoft.com/en-us/library/aa720696(VS.71).aspx

in der Peripherie davon gibts ja auch Einiges Interessantes zu entdecken 😉

08.07.2008 - 16:01 Uhr

Also das mit den Templates / ITemplate habe ich mal probiert.
Ich denke, damit komme ich meinem Zweck schon recht nahe.

Was ich bisher noch nicht hinbekommen habe, ist die Implementierung meines Controls so zu erweitern, dass ich z.B. ein ItemTemplate deklarieren kann und für jedes Objekt in meinem DataSource hiervon genau eine Darstellung mit Datenbindung stattfindet. Ganz ähnlich also wie beim Repeater Control.

Hat von euch schon jemand Erfahrung damit, wie man sowas umsetzen kann ?

Viele Grüße

03.07.2008 - 16:48 Uhr

Hallo Peter,

über ITemplates habe ich schon gelesen bzw. habe vor geraumer Zeit mal damit ein Bisschen herumgespielt. Vermutlich könnte das die richtige Richtung sein.

Ich danke dir

Beste Grüße
ltrader