Hejsan! Ja, Visst är det möjligt att gära en sådan dynamisk lösning som du beskriver, men det kräver ju att man tänker igenom designen av systemet i förväg så att man inte målar in sig i något hörn. Jag tackar ödmjukast för svaren, det här ser ut att bli något att bita i :) Har en känsla av att jag återkommer när det blir dags för implementationen ;)En riktigt komponentbaserad applikation?
Jag skall snart påbörja ett examensarbete där jag skall skapa ett enklare(?) affärssystem med kundhantering, produktregister och låneregister. Mitt mål är att göra applikationen både distribuerad och komponentbaserad. Jag har en del ideér som jag skulle vilja genomföra men jag är inte säker på om det går. Eller rättare sagt: jag är inte säker på om det går med den tiden jag har på mig med tanke på att jag inte har en aning om hur man gör :) (jag har inte tid med att "gå in i väggen")
Det jag vill veta är alltså om följande scenario är något jag rimligt kan ta mig an.
Jag vill att man i servergränsnittet skall kunna ladda olika självstående moduler/assemblies, t.ex. kundhanteringen eller produkthanteringen. Klienten måste helt dynamiskt kunna uppdateras (dialogrutor, menyval etc.) efter vilka assemblies som är laddade i servern. Tanken är att man skall kunna skapa nya moduler som klienten då skall kunna utnyttja sig av utan att man ändrar i klienten.
Om man t.ex. bara har kundhanteringsmodulen installerad på servern så skall klienten t.ex. bara kunna visa vilka produktnr som klienten har lånad och när. Har man produkthanteringsmodulen installerad på servern också så skall man kunna se uppgifter om produkterna han har lånat, kunna korssöka mellan de både registrena osv.
Frågan summerad alltså: Kan man dynamiskt förändra klienten efter de assemblies som är "laddade" på servern? (Jag kan tänka mig en del problem med behov av stubs/skeletons etc).
Oerhört tacksam för hjälp/tips och ideér!
Mvh Jonas Versén - Nerd in trainingSv: En riktigt komponentbaserad applikation?
du får använda dig av reflection bland annat. Allan Knudsen på Microsoft hade ett sådant exempel på lanseringen av VS.NET. Har själv bett honom lägga upp det på svenska MSDN ett par gånger men vet inte om det ligger där ännu.
// PatrikSv: En riktigt komponentbaserad applikation?
Som någon annan svarade så är det Reflection som gäller när du vill anropa funktioner "latebound", dvs där du inte vid kompileringstillfället känner till assemblyns namn och dess funktioners namn. Se mitt tips [Skapa ett objekt och anropa en metod "latebound" med Reflection. (C#)] angåenge reflection.
Du skulle kunna utnyttja t ex ini-filer (eller systemregistret eller..) för att tala om för klienten vilka komponenter som fanns installerade på den aktuella maskinen samt vilka funktioner som respektive komponent innehåller. Exempel på hur ini-filen kan se ut :
<code>
[Components]
ProductBL
CustomerBL
[ProductBL]
ShowProductList ' Visa artikelregistret.
ShowProduct ' Redigera en enskild artikel.
' Tar produktnummer som parameter.
[CustomerBL]
ShowCustomerList ' Visa kundregistret.
ShowCustomer ' Redigera en enskild kund.
' Tar kundnummer som parameter.
</code>
Notera att ShowProduct och ShowCustomer behöver ta en parameter, produktnummer resp kundnummer, så du behöver fixa en lösning för att överföra parametrar i t ex en string-array eller object-variabel.
Låt alla komponenter innehålla en klass med samma namn (t ex Connect) som har en funktion som alltid heter likadant (t ex StartFunction) . Använd Reflection för att skapa en instans av den klassen och anropa funktionen med en parameter som anger vilken funktion som ska startas (hämtas från ini-filen) och eventuella ytterligare nödvändiga parametrar.
<code>
public class Connect
{
public void StartFunction(string FunctionName, object[] Parameters)
{
switch(FunctionName)
{
case "ShowProductList":
....
break;
case "ShowProduct":
....
break;
}
}
}
</code>
Jag har provat en liknande lösning i ett ramverk som jag varit med och byggt i VB6 och det har fungerat utmärkt. En annan fördel med den här typen av design är att det är lätt att göra kundspecifika lösningar. Man behöver ju då bara skapa en ny komponent (med ett nytt namn) specifik för kunden och skicka den till kunden, redigera ini-filen på klientsidan och sedan är det klart!
Det finns säkert andra smartare lösningar men ovanstående metod har jag testat och den fungerade bra för våra ändamål.Sv: En riktigt komponentbaserad applikation?
/Jonas Versén