Laden...
Avatar #avatar-2966.gif
Stipo myCSharp.de - Member
Elektroinstallateur Lörrach Dabei seit 09.04.2007 699 Beiträge
Benutzerbeschreibung

Forenbeiträge von Stipo Ingesamt 699 Beiträge

02.02.2011 - 23:58 Uhr

Hallo DickesB,

eventuell kannst Du das ja mit dem internen Lock Tables vom MySQL lösen.

Grüße Stephan

01.02.2011 - 00:22 Uhr

Hallo dN!3L,

super Artikel, den Du da geschrieben hast 👍.
Und nachdem ich im letzten halben Jahr soviel wissen dazugelernt habe (hatte den Artikel mitte letzten Jahres schon einmal gelesen, und musste feststellen, das ich deinen ausführungen nicht ganz folgen kann.), kann ich dem Artikel nun auch sehr gut folgen, und konnte noch einige kleine Punkte dazulernen.

Ein riesen Dank von mir, für den super Artikel und die mühe die Du dir damit gegeben hast.

Grüße Stephan

30.01.2011 - 23:17 Uhr

Die Webserver Edition vom 2008er müsste auch Hostheader können.

Auf welcher Edition der IIS läuft, juckt den in keinsterweise.
HostHeader sind ja die Grundlage, wie man mehrere Domains über 1 IP ansprechen kann.

Grüße Stephan

29.01.2011 - 21:34 Uhr

Hallo,

kann es sein, das Du das ganze in einem Unterverzeichnis auf dem Server hochgeladen hast?

Denn die DLL Dateien müssen im Root unter /bin vorhanden sein, auch dann, wenn die Anwendung eigentlich in einem Unterverzeichnis ( http://www.domain.de/MyApp/default.aspx) laufen soll.

Ist jetzt nur eine vermutung.

Grüße Stephan

29.01.2011 - 20:33 Uhr

Hallo,

Ein weiterer Grund für STA bei der WPF ist die Darstellung auf dem Bildschirm. Erlauben UI-Komponenten den Zugriff aus mehreren Threads, kann beispielsweise während des Zeichnens auf dem Bildschirm eine Property geändert werden, was die Gefahr inkonsistenter Darstellungen birgt. Dieses Problem wird einfach umgangen, indem UI-Komponenten den Zugriff nur vom dem Thread aus erlauben, auf dem Sie erstellt wurden.

Nun dürfte auch klar sein, warum man UI-Elemente nur in dem STAThread erstellen darf.

Grüße Stephan

28.01.2011 - 17:48 Uhr

Hallo squadwuschel,

ergänzend zu tallas Post, dürfte das für Dich interessant sein Struckturen in WPF.

Erst wenn man den Unterschied von VisualTree zu LogicalTree versteht, wird man effektiv mit WPF umgehen können.
Und das kann ich nun mit recht behaupten, da ich gerade dabei bin, ein WPF Buch durchzuarbeiten.

Grüße Stephan

26.01.2011 - 23:58 Uhr

Hallo,

du kannst die Anzahl der letzten betroffenen Rows mit function row_count abfragen.

Grüße Stephan

25.01.2011 - 00:06 Uhr

Hallo DieterM,

gebe doch einfach den Value der Iteration in der Console aus.

Console.WriteLine(MC[i].Value);

Ohne zu testen, scheint mir der Index ( _ ) mit dem Du aus dem List<string> den Wert auslesen möchtest, um 1 größer zu sein, als der Index in der List<string>.

Somit macht die Fehlermeldung mit den ArgumentOutOfRangeException wieder sinn.
Das kann man aber sehr gut auch im Debugger sehen, wenn man sich mal das interne Array der List<T> mit dem aktuellen Index der for Schleife vergleicht.

Edit:
Sehe eben, das Blue_Dragon in seinem Beispiel Code, das genau so schon umgesetzt hatte. Schaue dir den Codeabschnitt mit der foreach mal an. Und vor allem eigne Dir die foreach-Schleife an, denn die macht manches einfacher.

Grüße Stephan

24.01.2011 - 20:31 Uhr

Hallo Taipi88,

allgemein sollte es ohne .htaccess in dem Verzeichnis ausreichen, wenn die Dateirechte ordentlich gesetzt sind. Htaccess wird meistens nur eingesetzt um damit ein Verzeichnis komplett durch ein Passwort zu schützen, was bei Dir ja keinen sinn macht.
Zumindest macht die htaccess von Dir kaum sinn, da du mit Order Deny, Allow erst alles sperrst, um danach wieder allen zugriff zu gewähren.
Da würde man als Beispiel dann nur einer Benutzergruppe zugriff gewähren.

Fehlermeldung:
Forbidden

Ist meistens ein indiez, das etwas mit den Dateirechten nicht stimmt chmod.
Hast Du mal geprüft, ob die Dateien zumindest Gruppen Leserechte haben.
Auch muss das Verzeichnis lese rechte besitzen.

Fehlermeldung:
Internal Server Error

Da wäre der eintrag der Error Log interessant. Ansonsten ist es so schwer zu sagen, was er da zu bemekern hat.

Also wirf die .htacces wieder raus, und schau ersteinmal die Datei und Verzeichnisrechte nach. Dann noch die Log befragen, ob die was zu meckern hat.

EDIT: Da ich meine Linux Kisten selbst verwalte ( ohne verwaltungstools, wie es bei 1&1 eingesetzt wird ) kann ich so nun auch schlecht sagen, was die da noch an vorgaben schon mit rein gebaut haben. Im schlimmsten Fall, kann sich deine .htaccess einstellung mit der Einstellung in der Domain Config stören.
Grüße Stephan

23.01.2011 - 23:59 Uhr

Hallo jogibear9988,

pack das nicht in ein Array, sondern in eine ObservableCollection<T>.

21.01.2011 - 23:38 Uhr

Hallo admec,

ich hatte damals eine komplette Solution Online gestellt.
Das was hier an Codeausschnitte zu sehen ist, sind wirklich nur ausschnitte.

Eigener TraceListener für RichTextBox ausgabe

Schau dir die Solution mal an. Ist zwar nicht gerade der beste Code ( stelle ich gerade selbst fest 😉 ) aber zum lernen brauchbar 🙂

Grüße Stephan

18.01.2011 - 21:10 Uhr

Hallo MarsStein,

man könnte ja auch eine DropDown Liste machen, wie das für "Faq / Artikel" schon realisiert wurde.

Wenn man dann die einträge darin noch nach dem Unterforum in der DB selectiert, und die DropDown dann nur in den Unterforen anzeigt, in denen dann eine Liste vorhanden wäre und man das noch optisch hervorherbt, hätte man schon fast die Eierlegende Wollmilchsau 😃

Vor allem, wäre der Topic dadurch einheitlich, und der User müsste dann nicht erst nicht benötigte Angaben löschen.

Grüße Stephan

16.01.2011 - 23:21 Uhr

Hallo MaWo80,

ich meine, du kannst das genau in dem umfang machen mit Bing Maps.
Im moment komme ich nur nicht genau drauf, wie das nochmal genau ging.
Es war nur so in der Art, das man unter Bing Maps sich eine Karte zusammen stellen kann, der dann auch eine Route eingezeichnet werden kann.
Dann kann man über das Windows Live SDK das in seine eigenen Anwendungen einbinden ( genau der Kartenausschnitt den man erstellt hatte).

Ich meine ich hab das bei Umbraco mal irgendwo gesehen. Finde im moment aber den Link nicht mehr.

Gruß Stephan

16.01.2011 - 23:08 Uhr

Hallo,

ich nehme mal stark an, das Du das myCmd Object nicht zerstörst zwischen den beiden aufrufen. Dann kannst Du natürlich kein 2. mal den Parameter definieren.

Pack die Methode mal in ein using rein. [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

Grüße Stephan

15.01.2011 - 20:37 Uhr

Hallo zero_x,

im grunde versuche ich derzeit nur die möglichkeit zu evaluieren, wie gut das AvalonDock mit MVVM zusammen arbeitet und was mich da an probleme treffen werden/könnten.

Da ich zum Thema WPF aber noch recht an der Wasseroberfläche schwimme, hab ich mir das WPF Buch bei Galileo Computing bestellt und nun vor mir liegen 😉.
Werde das Buch nun erst einmal durcharbeiten, das ich noch einen tieferen Einblick in WPF bekomme.

Aber die Begriffe, was du mir genannt hast, sind mir nicht unbekannt, und ich habe somit schon einen kleinen ansatz, worauf ich achten müsste.

@EFK381,
ich werde sicher noch meine Kommentare dann irgendwann dazu geben können. Sei es nun positiv wie negativ.

Grüße
Stephan

14.01.2011 - 21:16 Uhr

Hallo zusammen,

hat von euch schon einmal jemand das AvalonDock von Codeplex in einer WPF Anwendung mit dem MVVM Pattern umgesetzt?

Im moment finde ich da noch keinen ansatz, wie ich das mit MVVM umsetzen kann.
Schaue mir eben das Sample dazu an, und wie da das umgesetzt wurde. Nur kann ich darin noch nicht erkennen, wie ich das nun ins MVVM bringen kann.

Wenn jemand entscheidende Tips hat, dann bitte immer her damit.

Grüße Stephan

09.01.2011 - 19:53 Uhr

muss der Rechner neu getstartet werden

es reicht, wenn der Benutzer sich neu anmeldet. So hatte das bei mir bis jetzt immer funktioniert.

09.01.2011 - 19:41 Uhr

Hallo zusammen,

@zero_x
Ich hab mir die tag einige Framworks angesehen. Sicher hat jedes irgendwo seine vorzüge, wie dann auch nachteile. Bei Caliburn bin ich am schnellsten durchgestiegen, wie man das verwendet. Rob Eisenberg hielt auf der Mix einen langen vortrag wie man ein minimalistisches Framework bauen kann Build Your Own MVVM Framework. Muss gestehen das hat mich beeindruckt, und ich konnte dem ganzen sehr gut folgen. Auch hab ich mir mal den Code den er bei dem vortrag verwendet hat angesehen. Das war sehr aufschlussreich um das tiefer vestehen zu können.

@talla

Zitat:
Die Assemblys müssen dann aber den Bootstrapper kennen, um damit Abhängigkeiten auflösen zu können.

Naja, nicht wirklich. Ich kenn LightCore nicht, aber normalerweise würdest du ja nur ne externe XML Config haben um die Dependencies zu konfigurieren, aber keinesfalls sollte der Bootstrapper die anderes Assemblies als Referenz haben. Ansonsten ist da nicht viel getrennt. Weil wenn der Bootstrapper alle Assemblies referenziert und die einzelnen Assemblies den Bootsstrapper um Abhängigkeiten auflösen zu können, dann hast du über den Bootsstrapper ja ne Abhängigkeit eines einzelnen Assemblies von allen anderen.

Okay, wenn ich das mit XML configuriere, brauche ich keine abhängigkeiten zu den Assemblys. Nur bleibt dann noch eine andere frage. Ich muss dann ja irgendwo eine Instanz des Container rein packen, die dann alle assembly erreichen können. Sonst kann ja ein Repository zB kein Model referenzieren, wenn es ein neues leeres Model zurück liefern muss.
Wo packe ich die Referenz dann hin?

Diese Trennung hätt ich nicht zwangsweise gemacht. Wenn die eigentliche App die Views kennt halte ich das für in Ordnung. Ich hätte halt die MainView sozusagen fest angegeben und mir dann per DI das dazu passende ViewModel geben lassen und der Rest ergibt sich ja dann sozusagen 😉 Ich mein prinzipiell ist die Trennnung wie du sie hast natürlich gut möglich und erlaubt dir praktisch den gleichen Applikationsrumpf mit verschiedensten Applikationen zu benutzen, aber mir persönlich ist das den Aufwand nicht wert.

Das heist, ich kann den Bootstrapper, die Views und die App.xaml in der Haupt Assembly belassen? So verstehe ich das jetzt zumindest mal.

Zum MVVM Framework:
Dies hat doch schon einen eingebauten Mechanismus zur Dependency Injection. Da würd ich mich nach dem richten und kein zusätzliches eigenes benutzen (so liest sich das momentan bei dir). Da du noch nicht festgelegt zu sein scheinst - schau dir mal Cinch an, ebenfalls auf Codeplex zu finden. Das verwendet in V1 auch klassisch DI, aber ist in V2 vollkommen davon abgekommen und verwendet MEF. Das hat einen großen Vorteil: Man gibt den entsprechenden Programmteilen nur entsprechende Attribute und MEF setzt das Programm praktisch selber zusammen. Da muss man sich nicht mehr groß drum kümmern die Abhängigkeiten zu konfigurieren.

Ich muss ja auch die Models und Repository indizieren lassen können. Daher hab ich LightCore im Auge. Das ist leicht und kann doch alles, was man braucht.

Cinch hab ich mir auch mal angesehen, bin aber nicht sofort durchgestiegen. Was natürlich auch am Englisch liegen kann, da es schwerer zu lesen ist.

Ich denke ich hab aber das hauptsächliche jetzt verstanden, und werde mal beginnen das so umzusetzen.

Danke nochmals.

Grüße Stephan

09.01.2011 - 06:18 Uhr

Hallo zusammen,

ich hab im moment noch leichte verständnis probleme bei meiner Architektur.

Ich liste erstmal auf, welche Assembly ich habe und welchen zweck die erfüllen sollen:

  1. Main.exe ( Hat die App.cs )
  2. View.dll ( dort sind nur die Views drinne und gegen Interfaces programmiert)
  3. ViewModel ( auch gegen Interfaces programmiert )
  4. Model ( da sind die ganzen Datenklassen drinne (Interface))
  5. Repository ( Kapselt die zugriffe auf den WCF / EF4 / XML je nach Anwendung (Interface))
  6. Contracts ( hat alle Interfaces )
  7. Bootstrapper ( hat den IoC )
  8. MVVM Framework (Caliburn wird es denke ich werden) ( wird in Bootstrapper und ViewModel referenziert )
  9. LightCore ( wird in allen Assemblys referenziert )

Die Assemblys sollen sich ja gegenseitig nicht kennen.
Der Bootstrapper muss aber um den Container bauen zu können alle Assembly kennen, bis auf die App.exe . Die Assemblys müssen dann aber den Bootstrapper kennen, um damit abhängigkeiten auflösen zu können. Die Main.exe kennt nur den Bootstrapper und lässt sich die erste View auflösen und bekommt ein UIElement vom Bootstrapper zurück und fügt das dem RootVisual hinzu.

Ich hab mir das mal schematisch aufgezeichnet und mit pfeilen markiert, wie die Assembly sich gegenseitig kennen. Dabei kennt keine Assembly die sich schon aufrufende.

Sollte ich bis dahin schon auf dem falschen weg sein, korrigiert mich bitte.

Das würde mich bei meiner Entwicklung schon einen entscheidenden schritt weiter bringen, wenn ich wüsste, das dies so auf keine weiteren probleme stoßen wird, die eventuell erst wesentlich später bemerkt werden und dann die änderung recht umfangreich und zeitraubend wären.

Ich hab die letzten tage viel mit lesen verbracht. Das beinhaltet alles, was ich im Titel stehen habe, um da eine Basis bauen zu können, die solide genug sein sollte, damit eine umfangreichere Anwendung schreiben zu können.

Nun suche ich einfach ein bisschen rat, um das Chaos in meinem Kopf zu richten. Denn es ist für mich im moment noch ein kleines problem, zu wissen, ob mein ansatz der richtige ist, wenn man keine erfahrung mit solchen projekten besitzt.

Danke schon mal.

Grüße Stephan

09.01.2011 - 04:41 Uhr

Hallo Joetempes,

die Lösung steht in der MSDN 😃

Dieser Konstruktor ist für die Verwendung auf Computern vorgesehen, die Mitglied ausschließlich von Windows Server 2003-Domänen sind. Bei anderen Domänentypen wird eine Ausnahme ausgelöst. Diese Einschränkung besteht, da der Konstruktor die KERB_S4U_LOGON-Struktur verwendet. WindowsIdentity-Konstruktor (String)

Ich hab jetzt keine Ahnung, wie man das prüfen könnte, aber wenn Du im Code auf die Domain oder Windows Version prüfst, und dann die entsprechende Methode auswählst sollte das gehen.

Grüße Stephan

08.01.2011 - 21:20 Uhr

Ok. Also ich habe eine Logging Funktion die auch beim Start der Applikation einige Dinge aufzeichnet. Ist nun ein Request vorhanden - dann soll sie noch ein bisschen mehr aufzeichnen... ansonsten nicht.

Und genau da sind BeginRequest und EndRequest deine Freunde.
Du kannst bei BeginRequest zB das Logging Object in den HttpContext packen und hast dann auf jeder Page die möglichkeit da geziehlte Logging Befehle abzusetzen.

08.01.2011 - 21:14 Uhr

Nicht das wir uns falsch verstehen. Du möchtest in einem zustandslosen Context des IIS auf einen Request prüfen, ob eine externe Anfrage gestellt wurde und somit dann im Lifecycle ein Request stattfindet?

Aber dann ist BeginRequest genau dein freund dafür.

Nur verstehe ich dabei nicht, was du da prüfen möchtest. Entweder ist das ein Request, oder eben keiner. Wenn es ein Request ist, dann wird dir das Event gefeuert.

ASP.NET Page Life Cycle Overview

Grüße Stephan

08.01.2011 - 20:12 Uhr

Hallo xforfun,

das Application_start Event ist der falsche ort an dem Du einen Request prüfen kannst.
Application_start wird nur 1x ausgeführt, und zwar wenn die Anwendung startet. Das heist genau zu dem Zeitpunkt, wo der IIS die Anwendung in Speicher lädt.

Understanding the Global.asax

Dein vorhaben passt eher in Application_BeginRequest rein.

Grüße Stephan

08.01.2011 - 20:05 Uhr

Hallo lord_fritte,

zu beidem "ja" 😃
Noch ein Hinweiß, wenn Du den IIS7 oder höher verwendest, gibt es in der Web.config noch einen 2. Konfigurationsabschnitt, wo das Modul registriert werden muss.

Grüße Stephan

07.01.2011 - 20:25 Uhr

Hallo Curse4Life,

nimm Dir mal 11 Stunden Zeit, einen PC mit Lautsprecher und machs Dir gemütlich.
Dann würde ich Dir mal für den anfang die Webcast Serie empfehlen WCF und WF beleuchtet: Workflows und Service-Orientierung jenseits von 'Hello World'.
Danach ist Dir der Grundgedanke von WCF sicher schon geläufiger, was dann nach weiteren Wissensquellen schreien wird. Dort kannst Du dann mit einem guten Busch ansetzen und dich weiter bilden.

WCF ist nich an einem Tag zu erlernen. Aber WCF ist eine feine Technologie, wenn man die beherschen kann ( Ich bin da noch lange kein Profi, aber Intranet Anwendungen bekomme ich damit schon sehr solide umgesetzt.)

Grüße Stephan

07.01.2011 - 20:15 Uhr

Hallo Ayke,

ich hatte mal versuchsweise einen Mini Chat geschrieben mit WCF.
Dafür hab ich NetTcpBinding verwendet und das Observer Pattern implementiert.

Ob das Binding auch durch eine NAT Firewall kommunizieren kann, bezweifel ich im moment noch. Aber dafür gibt es auch Lösungen, wie man das umgehen kann, komme nur im moment nicht auf den Begriff.

Grüße
Stephan

06.01.2011 - 00:05 Uhr

Hallo MarsStein,

danke noch für die ausführliche erklärung.
Hast Du eventuell noch eine Quelle im Internet, wo man sich das nachlesen kann.
Am liebsten natürlich in Deutsch, das kann ich schneller erfassen als in Englisch 😃

Grüße Stephan

05.01.2011 - 21:35 Uhr

Hallo xxMUROxx,

danke für die Hilfe. Das ganze Thema mit generischen Klassen, Linq abfragen und dann gleich noch in verbindung mit einem Dictionary hat mich dann doch geschafft.
Hab darin allgemein noch nicht so viel übung. Teile der Grundlagen kenne ich, aber die übung darin fehlt noch.

Hier aber mal noch was erfolgreiches.

var result = workspaceDic.FirstOrDefault(x => x.Key.Equals(tItem)).Value;

Mit dem Code funktioniert das.

Danke nochmal, und das ist sicher ein Fehler, den ich kein 2. mal machen werde 😃

Grüße Stephan

05.01.2011 - 20:48 Uhr

Hallo zusammen,

ich habe ein kleines Problem, bei dem ich gefühlte 2 Stunden schon dran scheitere.


    public class UserControl<T> 
    {
        Dictionary<T, ObservableCollection<WorkspaceViewModel>> workspaceDic;

        public UserControl()
        {
            workspaceDic = new Dictionary<T, ObservableCollection<WorkspaceViewModel>>();
        }

        public void Add(T tItem)
        {
            var workspace = new ObservableCollection<WorkspaceViewModel>();
            workspace.CollectionChanged += this.OnWorkspacesChanged;
            workspaceDic.Add(tItem, workspace);
        }

        public ObservableCollection<WorkspaceViewModel> GetWorkspaces(T tItem)
        {           
            // Hier scheitere ich.
            var result = workspaceDic.FirstOrDefault(x=> x.Key == tItem);                         
            return result;
        }

        void OnWorkspacesChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            // Code gekürzt 
        }    
    }

Folgendes problem stellt sich mir. Ich möchte die ObservableCollection<WorkspaceViewModel> aus dem Dictionary auslesen, welchen den übergebenen Key hat. Leider komme ich nicht dahinter, wie ich den Key abfragen muss.

Der Operator "==" kann nicht auf Operanden vom Typ "T" und "T" angewendet werden

Mit generischen Klassen hab ich noch nicht so viel gemacht, als das ich sagen könnte, ich verstünde alles.
Kann mir da jemand den entscheidenden Tip geben?

Danke und Grüße
Stephan

03.01.2011 - 21:26 Uhr

Hallo diplomat,

ich denke das könnte dir weiterhelfen Entity Framework und praktische verwendung

03.01.2011 - 21:11 Uhr

Hallo zusammen,

noch eine kleine Frage zu der Business Logik bei WPF mit MVVM.

Wenn ich das Pattern richtig verstehe, dann ist die Logik der Gui ja nur in dem ViewModel versteckt. Die View wird dann rein über Binding verbunden, wodurch die ja dann insich komplett austauschbar ist. Das ViewModel sollte aber keinerlei Business Logik haben.

Laut meinem Tutorial was ich durcharbeite, wird das ViewModel des Hauptfenster in der App.xaml.cs instanziert. Da das Demo des Tutorial da ein bisschen minimalistisch gehalten ist, ersieht man da nicht, wo da eine Businesslogik rein soll. Hier noch der Link zu dem Tutorial WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

Rein von meiner Idee, könnte die App.xaml.cs auch erst die Businesslogik des Hauptfenster instanzieren lassen und die BL instanziert dann das ViewModel.
Wenn man das dann noch mit einem DI/IoC umsetzt, erhält man ja noch eine weitere abstraktion des ganzen. So ließe sich ja auch noch leicht ein Login für die Anwendung realisieren, und das ein Anwender nach x-Minuten inaktivität automatisch abgemeldet wird.

Liege ich mit meiner überlegung richtig, oder würfel ich da was durcheinander?
Gibt es noch etwas, was man da beachten sollte?

Danke schonmal an alle.

Grüße Stephan

03.01.2011 - 20:57 Uhr

Hallo Abt,

danke erstmal für die Antwort.

Serverseitig, um die Datenbank abzufragen.
-> einfaches Austauschen der Datenbank
Hier bietet sich zudem an, die einzelnen Linq-Queries ( Compile() ) zu cachen, um die Performance zu steigern.

Sollte es dann so sein, das ich auf dem Server schon die Objecte erstelle, wie ich die später dann im ViewModel für die View weiter verarbeiten möchte?
Oder sollte ich da nur die Entitäten des EF weiter reichen und die aufbereitung dann im Repository des Client mache?
Ich tendiere da zu Variante 2, da ich in den Objecten zu den Daten ja auch die prüfung der Daten integriert habe. Das halte ich aber für den Service als überflüssigen Overhead, der dann ja auch übertragen werden müsste.

Edit: nein mir fällt keine Traffic-arme Lösung für das Lock ein.
Ich würde das wahrscheinlich über ein Flag Lösen - die Logik sollte natürlich im Service stecken, um das Lock nach einer gewissen Zeit zurück zu setzen.

Das locks mit Traffic verbunden sein werden, damit rechne ich schon. Das macht im Grunde auch nicht so viel aus, da ein paar Bytes schnell übertragen sind. Schlimmer stelle ich mir da eben vor, wenn man 1..n Datensätze immer mit schleifen muss.

Allgemein stelle ich mir das Design dahingehend vor, das ich auf dem Client zu allen Teilbereichen Repository einrichte ( Settings / Daten etc ). Die Settings könnte man zB dann beim Start der Anwendung schon beziehen und danach würde das ja rein im Ram sein. So muss ich dann nur die veränderbaren Datensätze übertragen, wie zB einen neuen Kunden oder einen geänderten Kunden. Oder die Daten des Repository aktualisieren lassen ( Reload ).
Der Microsoft SQL Server bietet einem ja auch die möglichkeit den Client über änderungen zu an der Datenbank zu informieren, wenn ich das noch recht in errinnerung habe. So würde sich der Traffic auch auf das minimum reduzieren lassen.

Grüße Stephan

02.01.2011 - 22:21 Uhr

Hallo zusammen,

ich arbeite mich gerade in WPF mit dem MVVM-Pattern ein. Als ORM Mapper nutze ich EntityFramework.

Als Vorlage für das MVVM Pattern habe ich mir
WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster und das Demo Programm dazu angesehen.
In der Demo wird ein Repository für die Customer Daten verwendet. Da mir das mit dem Repository noch neu war, hab ich mich ein bisschen schlau gemacht, und dabei herausgefunden, das man das Repository nutz um damit die Daten vom ORM zu den eigentlichen Objecten mappen zu können. Desweiteren kann man das Repository dann Injizieren lassen und darin das Lock realisieren.
Soweit kann ich das alles noch nachvollziehen.

Nun zu meiner eigentlichen frage.
Ich werde in meiner Anwendung den SQL auf einem Server im Internet auslagern müssen, da ich von mindestens 3 Client auf die Daten zugreifen muss, die aber räumlich getrennt sind. Dazu möchte ich einen WCF Dienst auf dem Server anbieten.

Wo mein verständnis im moment noch an ecken anstöst. Wo muss ich da das Repository hin machen. Sollte das auf dem Server implementiert werden, oder sollte das jeder Client selbst haben ( Cache ).

Bei der 2. Variante stoße ich mit dem Lock zusammen. Denn es sollte ja auch immer sichergestellt werden, das nur 1 Client einen bestimmten Datensatz bearbeiten kann.

Bei Variante 1 bin ich mir nicht sicher, ob dadurch nicht der Traffic zu hoch werden könnte, wenn immer alle Daten über das Internet gesaugt und zurück geschrieben werden müssen. Denn schlussendlich kommuniziert das ViewModel ja auch direkt mit dem Repository.

Ich tendiere da im moment zu einem Mittelweg. Das heist, das ich ein Repository auf dem Server mache, der mir die Daten gegen das EF mappt und sich um das lock kümmern kann. Und ein Repository auf dem Client, der mehr als ein Cache der Daten zu sehen sein sollte. Also das der dann eine lock anforderung an den Server schickt, und darauf wartet bis der Server den lock bestätigt hat und dann die daten dem Client übergibt.

Das sollten mal die wichtigsten Punkte sein, die mir unter den Fingern brennen.
Für Tips, bin ich auch immer offen.

Grüße Stephan

31.12.2010 - 22:55 Uhr

Hallo Abt,

Jedes reale Objekt wird in einer eigenen Entität erfasst.
KundenSet, AnschriftSet, ArtikelSet, OptionSet, RechnungSet, BestellungSet etc.... und sind alle zusammen in einem einzigen Modell.
Ansonsten wären die "großen Vorteile" des EF, wie das LazyBinding ja überhaupt nicht gegeben.

Ich habe aber auch gewollte Redundanzen. Zum Beispiel hat meine Rechnung zwar einen Verweis an den Kunden, nutzt aber keine Abhängigkeit zur Anschrift. Einfacher Grund:
Die Adresse der Rechnung sollte im Nachhinein nicht geändert werden können.

Dieser Absatz hat mir geholfen. Ich denke mal, das ich das auch so handhaben werde, auch wenn dadurch der Designer recht voll werden wird.
Ich hab gerade erst angefangen das EF4 zu lernen. Und aller anfang ist bekanntlich schwer, bis man das praktische darin erkennen kann.

Danke nochmal, und einen guten Rutsch ins neue Jahr.

Grüße
Stephan

29.12.2010 - 23:24 Uhr

Hallo zusammen,

wie handhabt Ihr das mit dem Entity Framework und der aufteilung in verschiedene EntityModel?

Im moment bin ich da ein wenig unschlüssig, wie ich das machen soll.
Das folgende Beispiel nehme ich mal als Grundlage:
Es gibt eine Entität Kunden. Ein Kunde kann mehrere Anschriften haben ( Versand / Rechnung), bekommt dann auch eine neue Entität. Der Kunde wird einer Kundengruppe zugeordnet (Entität). Die Kundengruppe kann verschiedene Rabatte usw haben (Entität). usw. Brauche das ja nicht noch weiter spinnen.

Nun zum Denkproblem. Es gibt Artikel, die dann auch mehrere Bilder, Rabatte und Optionen haben können. Alles wieder sauber getrennt in Entitäten.
Wenn nun ein Kunde eine Bestellung aufgibt, dann gibt es ja wieder eine Entität zu den Bestellungen, die wiederum auch abhängigkeiten haben können.

Wenn man das ganze gebilde dann sieht, dann kann dies durchaus groß werden.
Dies aber alles in einem Model unterzubringen, kann doch der lesbarkeit nicht gut tun.

Wie macht Ihr das? Legt Ihr da verschiedene Model an (zB. Kunden incl abhängigkeiten, Artikel incl abhängigkeiten ... ) oder packt Ihr das wirklich alles in eine Entität?

Rein technisch sollten Bestellungen ja ein nur ein Abdruck sein, von den anderen Daten. Also kann ich mir das sogar noch in einem eigenen Model vorstellen, da man ja die Daten 1x kopieren muss für den abdruck ( es könnten ja sonst inkonsistente Daten entstehen, wenn ein Artikelpreis sich zwischenzeitlich ändern würde). Aber beim rest bin ich etwas unschlüssig. Im Entity Framework kann man ja die Zuordnungen im Designer wunderbar anlegen, und dann entstehen ja die Navigationseigenschaften. Wenn ich da aber irgendwo einen unterbruch rein bekomme, weil ich eine Entität habe, die bei beiden Model nötig sind (siehe beispiel Rabatte), dann muss man diese wieder von Hand nachziehen?

Ich hoffe ich hab das einigermaßen beschreiben können, was mir da so gerade durch den Kopf schwirrt. Für ein paar anregende Vorschläge, wie man das praxisgerecht machen sollte, bin ich dankbar und immer offen.

Grüße Stephan

12.12.2010 - 17:05 Uhr

Hallo,

ich versuche mal deine fragen zu beantworten, sofern ich das richtig verstanden habe was Du umsetzen möchtest.

Es gibt mehr Buchstaben als mögliche Antworten pro Frage. Es kann also sein, dass Antwort 1 den Buchstaben A, 2 B, 3 C und 4 D entspricht. Kann aber auch 1=N, 2=X, 3=A und 4=B sein.

Erstelle dir am besten ein Object, das du dann an einen Radiobutton binden kannst.
In dem Object, kannst du dann den Text speichern der angezeigt werden soll, und auch deinen Buchstaben, den du wieder auslesen möchtest.

Bei einem Postback musst du dann nur ermitteln, welcher der RadioButton markiert ist, und kannst leicht darüber dann wieder alles auslesen.

Wie kriege ich das so mit einem Benutzersteuerelement umgesetzt, dass ich nur mein Question-Objekt reingebe und ich bei einer Post-Back-Action für den Fragenblock (es können bis zu vier davon auf einer Seite sein) den gewählten Buchstaben bekomme?

Prinzipiell spielt es keine rolle, wieviele der UserControls auf einer Page sind. Jedes UserControl verarbeitet seinen bereich für sich ( PostBack ).
Du musst nur in der Page darüber die UserControls wieder auslesen. Auch die Page verarbeitet dabei einen PostBack selbst.

Hoffe das hilft ein bisschen weiter.

Grüße Stephan

10.12.2010 - 21:32 Uhr

20101210_210207.bak

Wenn Du die Uhrzeit da mit speicherst, dann wird das immer eine neue Datei sein.
Lass die Zeit weg, wenn Du nur eine tägliche Sicherung benötigst.
Dann würde ich das Backup noch in ein Zip stecken und dieses hoch laden.

Grüße Stephan

10.12.2010 - 20:46 Uhr

Ich nehme mal an, das Du innerhalb der Init Methode die ListItems erstellst.

Um sicherzustellen, das die Daten bei einem PostBack nicht nochmal erstellt werden, muss man im Code auf Page.IsPostBack prüfen.


if (!IsPostBack)
{
      // Hier die ListItem erstellen
}

Grüße Stephan

10.12.2010 - 18:21 Uhr

Hallo und herzlich willkommen,

wie wäre es, mit einem private Property?
Wenn ich den Screen richtig interpretiere, sind das normale private Property.


private string MyPrivateProperty
{
      get { return _myPrivateProperty; }
      set { _myPrivateProperty = value; }
}

// oder:

private string MyPrivateProperty { get; set; }

Grüße Stephan

09.12.2010 - 01:04 Uhr

So da ja 1 Woche vergangen ist, und laut den Regeln dann jeder eine neue Aufgabe bringen darf, möchte ich mal etwas dazu beitragen 😉

Es soll eine Klasse entworfen werden, die den Wochentag eines Datum berechnen kann. Das Datum darf nicht als ein DateTime übergeben werden. Als Hilfe kann der Artikel Wochentagsberechnung verwendet werden.

Die Aufgabe richtet sich an die Anfänger hier im Forum. Mit ein bisschen lesen und nachdenken, ist diese Aufgabe gut lösbar.

Folgenden Beispiel Code stelle ich zur verfügung:


    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Bitte geben Sie ein Datum ein (dd.mm.YYYY): ");
            string inputDatum = Console.ReadLine();
            string[] splittedDatum = inputDatum.Split(new Char[] { '.' });

            Wochentag wochentag = new Wochentag();
            Int32 tag = wochentag.GetWochentag(Int32.Parse(splittedDatum[0]), Int32.Parse(splittedDatum[1]), Int32.Parse(splittedDatum[2]));
            
            Wochentage wt = (Wochentage)tag;
            Console.WriteLine("Der Wochentag lautet: {0}", wt);
            
            Console.ReadLine();
        }
    }

Das passende Enum dazu:


    enum Wochentage
    {
        Sonntag = 0,
        Montag = 1,
        Dienstag = 2,
        Mittwoch = 3,
        Donnerstag = 4,
        Freitag = 5,
        Samstag = 6
    }

Und noch der Methoden Rumpf:


    class Wochentag
    {
        public Int32 GetWochentag(Int32 tag, Int32 monat, Int32 jahr)
        {
            return ...
        }
    }

Wünsche allen viel freude beim lösen.

Grüße Stephan

09.12.2010 - 00:25 Uhr

An dem ist nix schwer. Wohl eher an dem Brett vor meinem Kopf, weshalb ich da nicht drauf gekommen bin. Werde dann wohl mal ins Bett müssen, wenn ich so auf die Uhr schaue 😉

Danke noch, für die Lichtung in meinem Wald 🙂

Grüße Stephan

09.12.2010 - 00:05 Uhr

Hallo Sebastian.Lange,

du willst ein int einen enum wert wandeln bzw. prüfen ob dein
int einem bestimtem enum wert entspricht?

Ich bekomme von der Methode einen int zurück. Den Wert möchte ich dann als Enum zurück geben. Also benötige ich etwas, das ich diesem int Wert das Enum zuordnen kann.

Beispiel:



enum Wochentage
{
     Montag = 1,
     Dienstag = 2,
     ....
}

Int32 rückgabewert = GetBerechnet();

Wochentage wochentage = rückgabewert .... // Hier hänge ich

Ich könnte ja den rückgabewert in einem Switch durchlaufen, und dann das Enum da drin setzen, aber ich finde das nicht sonderlich schön, wenn sagen wir mal das Enum 20 Schlüselworte hat.

Hoffe das ist jetzt ein bisschen ersichtlicher was ich meine.

Grüße Stephan

08.12.2010 - 23:48 Uhr

Nabend zusammen,

es muss doch irgendwie möglich sein, das ich einen Int32 Wert auf ein Enum abbilden kann, ohne das ich das innerhalb eines Switch machen muss.

Ich habe als Beispiel eine Methode, die etwas berechnet, und mir dann als ergebnis ein Int32 zurück gibt. Diesen Int32 Wert möchte ich aber als lesbares Enum speichern.

Hoffe ich hab das einigermaßen gut erklärt.
Kann mir da jemand unter die Arme greifen. Finde da nix im Internet und Intellisens ist bei einem Enum auch nicht sonderlich gesprächig.

Grüße Stephan

08.12.2010 - 20:59 Uhr

Ich könnte damit leben wenn ich genau wüsste ob es gängige Praxis ist, den Service das erste mal im SplashScreen aufzurufen.
Dann wäre die Instanz erstellt und weitere Abfragen würden keine Zeitverzögerung mehr hervorrufen??????

Was sollte an dem verfahren schlecht sein. Wenn man damit erreicht, das der Service sich schon startet, während die Anwendung selbst ja auch am starten ist.

07.12.2010 - 00:19 Uhr

Hallo,

speicher Dir die Referenz der TextBoxen in einer List<TextBox>. Dann kannst Du innerhalb der Button-Click Methode die Liste durchlaufen und dir die Daten auslesen.

Grüße Stephan

07.12.2010 - 00:09 Uhr

Hallo,

da dürfte dann der Idle-TimeOut im IIS greifen. Der ist per default bei 20 Minuten eingestellt. Das bedeutet, das der IIS die Instanz dann nach 20 Minuten killt.
Somit muss dann der IIS bei einer neuen Anfrage erst wieder die Instanz starten und compiliert diese auch wieder ( wenn ich das recht in erinnerung habe ).

Hier noch ein bisschen Literatur, wie man den Idle-Timeout höher stellen kann.
Configure Idle Time-Out Settings

Grüße Stephan

03.12.2010 - 22:53 Uhr

Ich persönlich hasse es wenn ein Programm ohne mein Zutun sich in meinen Eigenen Dateien einnisten. Dazu gibt es ja auch noch bessere Ordner,wie z.b. %AppData% des Benutzers.
Ja, sicher Geschmackssache. Sogar dein Visual Studio macht das standardmäßig so 😉){gray}

Und genau das stört mich auch immer daran 😉
Deshalb habe ich meine Daten ausgelagert ( ist übersichtlicher ) und lasse den nervigen Programmen den Eigene Dateien Ordner 😃

02.12.2010 - 23:27 Uhr

Hallo,

ich würde das eher über eine USB-Steuerkarte lösen.

Vor allem ist dabei noch wichtig, das man immer eine Galvanische Trennung zwischen Rechner und externer Pheriperie hat. Sonst kann es irgendwann ein böses erwachen geben am Rechner, wenn man sich fremdspannungen in den Rechner einschleppt 😉

Grüße Stephan

29.11.2010 - 22:26 Uhr

Hallo herbivore,

ich habe 2 identische 19" mit 1280x1024 hier stehen. Ich empfinde das arbeiten mit 2 identischen auflösungen sehr angenehm. Wobei ich manchmal zugeben muss, das ein 16:9 durchaus seine vorzüge haben könnte, wenn man Toolbars links und rechts von dem Contentfenster anzeigen möchte, die sich aber nicht lösen lassen aus der Anwendung.
Wo ich auch merke, das es manchmal nicht schlecht ist, wenn man 16:9 hätte, wenn man zB den Explorer und FileZilla auf hat, weil man öfters mal dateien hin und her ziehen möchte, nebenher aber noch ein Editor zum bearbeiten und einen Browser zum anzeigen offen hat. Dann könnte das alles ein bisschen breiter sein, denn dann hätten die 4 Anwendungen nebeneinander platz. Da muss "Ich" dann manchmal in der Task die Anwendungen switchen.

Man verwendet nicht zwei Bildschirme, um darauf den gleichen Inhalt wie auf einem darzustellen, sondern, um verschiedenen Inhalt gleichzeitig vor sich zu haben.
Die beiden Bildschirme "verschmelzen" also nicht zu einem. Stattdessen wechselt man immer zwischen den beiden Bildschirmen hin und her.

Das kann ich bestätigen. Ich habe auch einen meiner beiden Monitore als Hauptschirm. Den 2. Monitor blende ich im grunde immer aus beim arbeiten.
Auf dem 2. Monitor habe ich dann immer den Browser, Messenger etc laufen.
Das ist das, was es angenehm macht. Man muss nicht jedesmal zwischen den Anwendungen switchen.

Grüße Stephan

29.11.2010 - 20:47 Uhr

Hallo tom-cat,

Du musst im Page_Load auf einen Postback prüfen.


if (!IsPostBack)
{
      // Hier das befüllen der DropDownList einfügen.
}

Hier noch die passende Seite bei MSDN Page.IsPostBack-Eigenschaft

Grüße Stephan