Autor Beitrag
Maliko
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 13.09.13 21:21 
Hallo ihrs,

ich hätte da mal ein kleines Problem und hoffe, ihr könntet mir vielleicht mit nem kleinen Denkansatz auf die Sprünge helfen. Und zwar schreibe ich derzeit eine ASP.Net-Anwendung welche mit mehreren Datenbanksystemen dynamisch kommunizieren soll. Für jede Datenbank gibt es einen eigenen Handler, welche eine .cs-Datei ist. Außerdem habe ich ein Interface (ISql) erstellt, von welchem jede Klasse erben muss (darin sind auch die Funktionen definiert, welche jeder Handler zwingend implementieren muss.

Die Handler funktionieren problemlos (hab MSSQL und MySQL ausprobiert) und der Zugriff auf die Handler läuft über das Interface, allerdings muss ich natürlich dem System sagen, welchen Handler er nehmen soll (MSSQL oder MySQL). Da das System auch für weitere Datenbanksysteme erweiterbar sein soll, ohne das die Ursprungsdateien überarbeitet werden müssen (seht es als eine Art Addon) würde ich das ganze gerne möglichst Dynamisch machen.

Mein Problem ist jetzt, das ich dem System irgendwie das entsprechende Objekt geben muss. Momentan habe ich das ganze so gelöst (so soll es aber nicht sein):

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
protected void Page_PreInit(object sender, EventArgs e)
{
    JetBoard.Core.Basic.SqlClasses.MSSQL sqlClass = new Core.Basic.SqlClasses.MSSQL();
    JetBoard.Core.Basic.Handlers.StyleHandler styleHandler = new Core.Basic.Handlers.StyleHandler();
    this.MasterPageFile = string.Format("~/Styles/{0}/Master.Master", styleHandler.GetDefaultStyle(sqlClass));
}


styleHandler.GetDefaultStyle(sqlClass) ermittelt in diesem Fall das StandartMastertemplate für die Seite und bindet dieses an die Seite. Allerdings würde ich jetzt gerne das "JetBoard.Core.Basic.SqlClasses.MSSQL sqlClass = new Core.Basic.SqlClasses.MSSQL();" aus der ASP-Seite rausbekommen und am besten Dynamisch übergeben.

Hat jemand von euch vielleicht eine Idee, wie ich das bewerkstelligen kann, ohne das der Author des "AddOns" an den Core-Klassen rumdocktern muss? Und sorry wenn das ganze etwas Wirr klingt, ist doch schon etwas später und ich bin nicht so gut im Erklären. Ich hoffe jemand von euch kann mir da weiterhelfen und mir nen Tipp geben. Ansonsten müsste ich nämlich tatsächlich für jedes Datenbanksystem sämtliche ASP-Dateien und Klassen, welche den entsprechenden SqlHandler nutzen seperat schreiben und die Coredateien dann mit den für das jeweilige Datenbanksystem überschreiben.

Liebe Grüße
Malikio
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 14.09.13 09:17 
Hallo Maliko,

ja, da gibt es mehrere Möglichkeiten:

1. Klassen oder Methoden als Generics anlegen, z.B. als gesamte Klasse
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
class Sql<TSQL> where TSQL : ISql, new()
{
    protected void Page_PreInit(object sender, EventArgs e)
    {
        ISql sqlClass = new TSQL();

        // ...
    }
}


2. Dynamisch mit Activator.CreateInstance (davon gibt es mehrere überladene Methoden: generisch/nicht-generisch):
ausblenden C#-Quelltext
1:
ISql sqlClass = (ISql)Activator.CreateInstance(...);					


3. Mittels DependencyInjection (Abkürzung: DI), z.B. im Konstruktor:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
class MyASPClass
{
  public MyASPClass(ISql sql)
  {
    SqlHandler = sql;
  }

  private ISql SqlHandler { get; private set; }

  // intern nun immer auf SqlHandler zugreifen
}


(P.S. Bei den Newsfeeds hier im Forum habe ich gerade einen Link auf IoC and DI Tips entdeckt.)

4. ... (habe bestimmt noch eine vergessen ;-))

Am besten, du suchst mal mit den obigen Stichworten im Internet nach weiteren Quellen oder Tutorials (falls du bisher damit noch nicht gearbeitet hast).
Maliko Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 14.09.13 09:45 
Na das ist doch schon mal was. Da habe ich schon mal ein paar Ansätze mit denen ich arbeiten kann. Danke dir. Bei sowas merke ich immer wieder, das ich immer noch Berufsanfänger bin (bin jetzt seit knapp 8 Monaten ausgelehrnt).

Edit: Meine Güte ist das einfach. Activator.CreateInstance() ist genau das was ich gebaraucht habe. Hat einwandfrei funktioniert. Jetzt kann ich einfach mit ner XML arbeiten, welche vom System erstellt wird.