Jag håller på med en moduluppbyggd webbapplikation vars tanke är att man bara ska installera och använda de delar man behöver. Men jag har problem med att sammanfoga alla delar till en helhet.
Alla moduler registreras i en databas; registrerar jag t ex modulen "Alfons" så sparas information om den i databasen, att den är aktiv och existerar m.m.
Men om jag nu vill använda den från själva huvudkoden, hur ska jag kunna anropa en komponent dynamiskt? Jag vill inte hårdkoda för då faller hela konceptet med olika moduler:
Hårdkodning
If Module.Alfons Is Installed Then
' Do this.
ElseIf Module.Mollgan Is Installed Then
' Do that.
End If
Jag vill istället köra en modul dynamiskt på något sätt, typ:
ModuleAction = "Alfons"
If ModuleAction Is Installed Then
' Kör modulen.
End If
Javisst kan du köra alla moduler utan att veta deras egentliga namn. Har alla modulera ett någonlunda samma beteende så är det inte några problem, annars kan det bli lite trixigt..
Varje modul kan implementera ett interface som symboliserar modulerna, detta kan lösas på olika sätt men då man inte vet om vad det är för modulera så blir det svårt att ge något direkt exempel.. Men som sagt, varje modul har ett interface exempelvis IModule.
Sen hämtar du alla dina moduler som du lägger i någon form av collection eg, myModules genom att ladda dem från databasen som du beskrev.
sen kör du bara igenom denna med foreach och plockar ut den aktuella modulen.. och sen kör du den
foreach(Imodule myModule in myModules)
{
myModule.DoThat();
}
I metoden doThat så kan du sedan lägga in alla anrop som du behöver göra..
Det kan nog uppstå problem om alla modulerna inte har samma beteende, men det blir en senare fråga..
Tackar! Har nu byggt upp grunden men har ett stort problem, omvandlingen från objekt till "modul".
Låt säga att jag lägger listan över moduler i en hashtable (borde väl gå?); news, articles och faq. Således anropas modulerna med news.funktion(), articles.funktion() och faq.funktion().
Hur göra omvandlingen till objektet? Alltså:
For Each Module In [red][i]objekttyp med strängarna news, articles och faq[/i][/red]
Module.funktion()
Next
Jag är osäker på hur och vilken collection jag ska använda/bygga. Exempel uppskattas.
Bara skoj att kunna hjälpa till.. Man e ju arbetslös :(
Angående vilken collection du vill använda, det beror på.
Det andra problemet.. Eftersom du vet vilket interface det är du skall jobba med så är det denna typen av "objekt" som du vill jobba med.. Skrev ett mycket litet exempel..
Här först interfacet som jag vill använda, det har ett dumt namn men du förstår säkert.
namespace webforum
{
/// <summary>
/// Summary description for Person.
/// </summary>
public class Person : MyInterface
{
public Person()
{
//
// TODO: Add constructor logic here
//
}
public string Function()
{
return "Person";
}
}
public class Bil : MyInterface
{
public Bil()
{
//
// TODO: Add constructor logic here
//
}
public string Function()
{
return "Bil";
}
}
}
Sen kommer koden där vi där vi skriver ut det till skärmen.
MyInterface[] saker = new MyInterface[2];
Person myPerson = new Person();
saker[0] = myPerson;
Bil myBil = new Bil();
saker[1] = myBil;
foreach(MyInterface sak in saker)
{
MessageBox.Show(sak.Function());
MessageBox.Show(sak.GetType().ToString());
}
Fick det inte att fungera dynamiskt med koden ovan, men lyckades hitta kodexempel för att använda System.Reflection för att köra en class/funktion dynamiskt: