Laden...

Zentrales Dataset - Zugriff von überall - Wie mögllich?

Erstellt von Siedlerchr vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.265 Views
S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 13 Jahren
Zentrales Dataset - Zugriff von überall - Wie mögllich?

Ich habe vor ein Dataset als eine Art Datenbankersatz zu verwenden, weil ich in meinem Fall keine DB brauche, das wäre unnötig und nicht das was ich brauche.

Also ich habe mir mit dem VS-Designer ein schönes Dataset zusammengebaut und erzeuge in einer Klasse in Objekt davon und befülle das ganze.

So, jetzt will ich von anderen Klassen auch auf das Dataset zugreifen mit den Daten die schon drin sind, geht aber leider nicht weil ich ja jeweils ein neues objekt kriege.

Eine Möglichkeit ist ja das ich in jeder Klasse mir ein eigenes Dataset erstelle und das ganze hin und her kopiere.

Die andere Möglichkeit ist ich speicher es als Xml zwischen und lade es jweils wenn ich es wieder befüllen will.

Was mir grad noch eingefallen ist, ich mache eine static Klasse mit einem static Dataset und kann dann über den Umweg da immer drauf zugreifen.

Aber ich finde die Lösungen nicht das gelbe vom Ei, gibt es denn noch weitere bessere Möglichkeiten das zu realisieren?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Würde Dir evtl helfen mal nach fast einem Jahr im Forum die Grundlagen zu erlernen.

Static für soetwas ist schonmal richtigerweise die falsche Herangehensweise.
Dann bleibt ja nur noch die Übergabe des DS von der Stelle, an der es erzeugt wird, an alle Stellen die es benötigen.
Hierzu kannst du den Constructor benutzen, oder Properties.

Benutzt du einen IOC Container ist es noch einfacher.

S
324 Beiträge seit 2007
vor 13 Jahren

Mhm...
Man könnte das dataset auch als klasse im code zur laufzeit erzeugen und aus dieser klasse ein singleton machen.
Dies könnte man dann auch von jeder anderen stelle aufrufen.

Ein anderer weg, kommt drauf an wie oft man dieses dataset braucht, wäre es mit writexml zu speichern und mit readxml an der stelle wieder einzulesen an der man es dann wieder benötigt.

T
381 Beiträge seit 2009
vor 13 Jahren

Da Speicher viel vorhanden und schnell ist, und die Festplatte langsam ist, würde ich in jedem Fall vom häufigen serialisieren abraten.
Singleton ist an der Stelle auch nicht unbedingt das Mittel zur Wahl, dennoch etwas besser als Static.

FZelle hat alles nötige gesagt. Das führt auch dazu, dass man ab und an nochmal nachdenkt ob es irgendwo wirklich benötigt wird bevor man den Constuctor erweitert.

S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 13 Jahren

So ich habe mich mal über das Thema informiert und ein gutes Tutorial gefunden:
Inversion Of Control Beginners Guide

Auf Basis dieses Tutorials habe ich das umgsetzt.
Ich poste hier mal meine Lösung, wenn jemand ähnliches Umsetzen will.


interface IBusinessLogic
    {

        FileHosterAssignDataset returnDataset();

    }

Das ist meine Main_Klasse von der ich das ganze verteile

class BusinessLogic
    {
        IBusinessLogic dataset = null; 
        FormCreator fc;
        public void factoryMethod()
        {

           this.dataset = new Dataset(); //Warum kann ich hier nicht auf die Methoden  des Objekts 
           this.fc = new FormCreator(this.dataset);

        }

        public void ReturnDataset()
        { 
          Console.WriteLine("Dataset {0}", fc.ReturnDataset().returnDatset()); //Hier  //kann ich letendlich auf mein Dataset zugreifen, das heißt ich kann es sogar von //meiner factoryMethod auf das FileHosterAssignDataset zugreifen.


        }


Hier meine Klasse Dataset :


 //Hier das Dataset erstellen
        private FileHosterAssignDataset ds;

         public Dataset()
         {
             this.ds = new FileHosterAssignDataset();
         }


        public FileHosterAssignDataset returnDataset()
        {

            return this.ds;
        }

Und hier die Klasse FormCreator in der ich dann die Main_Form aufrufen werde:

class FormCreator
    {
        IBusinessLogic dataset;
        public FormCreator(IBusinessLogic dataset)
        {
            this.dataset = dataset;
        }


        public IBusinessLogic ReturnDataset()
        {
            return this.dataset;
        }


T
381 Beiträge seit 2009
vor 13 Jahren

returnDataset != ReturnDataset

Du solltest immer die rechte Variante nutzen.

Fehlt:

class FormCreator : IBusinessLogic

Oder wieso hat FormCreator auch die Funktion ReturnDataset?

Das sieht doch sonst ganz solide aus.

Falls du später ein 2. DataSet brauchst, musst du returnDataset(); refactoren. Daher wäre ReturnFileHosterAssignDataset() oder noch besser GetFileHosterAssignDataset() eine bessere Namenswahl.

5.299 Beiträge seit 2008
vor 13 Jahren

Hmm, verstehe ich noch nicht.

Wie ist jetzt gewährleistet, dass nur ein FileHosterAssignDataset erstellt wird?
Kann BusinessLogic.factoryMethod() nicht mehrmals aufgerufen werden?

Wie ist gewährleistet, dasses von überall zugreifbar ist? ist class BusinessLogic ein Singleton?

Der frühe Apfel fängt den Wurm.

S
Siedlerchr Themenstarter:in
178 Beiträge seit 2009
vor 13 Jahren

Wie ist gewährleistet, dasses von überall zugreifbar ist? ist class BusinessLogic ein Singleton?

Also wenn ich das richtig verstehe, dann musst du in der factory Method nur ein Objekt der entsprechende Klasse erzeugen in dem du es haben willst und dem Constructor das

IBusinessLogic dataset

übergeben.
Und dann kannst du in der Klasse per

dataset.returnDataset()

drauf zugreifen.

So, ich habe da aber noch eine Frage:

Ich habe jetzt das Beispiel hier unten in dem ich meine Main_Form erzeuge und ihr das Dataset übergebe. Allerdings übergebe ich der ja in dem Moment schon den konkreten Typ.
Oder ist es besser ich erzeuge die Main_Form mit in der Factory Methode und übergebe ihr das IBusinesslogic dataset und greife in der Form-Klasse dann das eigentliche FileHosterAssignmentDataset über die Methode

dataset.returnDataset()

?

Also eigentlich kommt es doch aufs gleiche raus, nur das ich in dem ersten Fall direkt schon den konkreten Typ übergebe.

 public void CreateFormMain()
        {
            FileHosterAssignDataset ds = this.dataset.returnDataset();
            Console.WriteLine(ds.DataSetName); //Komplettes Dataset im Zugriff
            Application.Run(new frm_Main(ds)); 
           
        }

5.299 Beiträge seit 2008
vor 13 Jahren

Wie ist gewährleistet, dasses von überall zugreifbar ist? ist class BusinessLogic ein Singleton?
Also wenn ich das richtig verstehe, dann musst du in der factory Method nur ein Objekt der entsprechende Klasse erzeugen in dem du es haben willst und dem Constructor das

  
IBusinessLogic dataset  

übergeben.
Und dann kannst du in der Klasse per

  
dataset.returnDataset()  

drauf zugreifen.

Das sieht mir aus wie ein leicht verunglückter Singleton-Pattern: Pro BusinessClass sind die Datasets Singletons, aber wenn einer eine 2. BusinessClass erstellt, gibts doch wieder 2 Datasets. Und komplizierter isses außerdem.

Ich merke doch deutlich eine entstehende Verwirrung, weils ein Dataset gibt, und eine Methode returnDataset, und eine Dataset-Klasse, die kein Dataset ist, und einen privaten Member, der auch Dataset heißt, und das einzig wirkliche Dataset in der Geschichte ist doch wohl die typisierte Dataset-Klasse FileHosterAssignDataset.

sorry, sieht mir nicht eigentlich solide aus

ich weiß natürlich nicht, was daran nun richtig verstandener, und was falsch verstandener factoryPattern ist, weilich den factoryPattern noch nicht kapiere. Aber vlt. lernichs hier ja 😉

So, ich habe da aber noch eine Frage:

Ich habe jetzt das Beispiel hier unten in dem ich meine Main_Form erzeuge und ihr das Dataset übergebe. Allerdings übergebe ich der ja in dem Moment schon den konkreten Typ.
Oder ist es besser ich erzeuge die Main_Form mit in der Factory Methode und übergebe ihr das IBusinesslogic dataset und greife in der Form-Klasse dann das eigentliche FileHosterAssignmentDataset über die Methode

  
dataset.returnDataset()  

?

Kannichnix zu sagen, weil mir die Factory-Geschichte obskur ist. Höchstens - die factory-Methode ist doch in der BusinessLogic? - also da drinne soll man wohl bestimmt kein Form erstellen.
Aber bei mir gäbs eh zunächst mal nur 2 Klassen: MainForm und FileHosterAssignmentDataset (und dafür würde ich nach einem kürzeren Namen suchen).
Und MainForm würde ich in void Main erzeugen und anzeigen. Wie du es nun hinkriegst, in verschiedenen Forms und UserControls dasselbe Dataset verfügbar zu machen, dafür sehe ich zwei Wege, von denen ich natürlich den etwas einfacheren bevorzuge.
Allerdings wird es hier nicht gern gesehen, wenn ich den erläutere, daher ende ich hier.

Der frühe Apfel fängt den Wurm.