webForumDet fria alternativet

Moduluppbyggnad - hur hitta andra moduler?

.NET

4 svar · 371 visningar · startad av Pace

Medlem sedan juni 20019 024 inlägg
Frågan#1

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

Hur ska jag bygga upp applikationen?

Medlem sedan okt. 2002188 inlägg
#2

Hej

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..

Medlem sedan juni 20019 024 inlägg
#3

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.

Medlem sedan okt. 2002188 inlägg
#4

Inga problem...

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
{
	interface MyInterface
	{
		string Function();
	}
}

Sen kommer de klasserna som vi använder oss av.

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());
			}

Hoppas det hjälper

Medlem sedan juni 20019 024 inlägg
#5

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:

http://www.dotnet247.com/247reference/msgs/8/44807.aspx

502 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
358 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
358 ms — ändringar (db)