09. marts 2005 - 08:15Der er
7 kommentarer og 1 løsning
Pluginbaseret arkitektur
Hejsa,
Jeg sidder og skal designe et nyt system. Jeg vil gerne lave det pluginbaseret. Hvordan gør man det i asp.net? Jeg vil samtidig gerne bevare performance osv.... jeg har en ide om at jeg skal implementere et bestemt interface i mine plugins (assemblies), men hvordan jeg når derfra til at jeg rent faktisk kan loade mine plugins synes jeg er langt.... nogle ideer eller praktiske erfaringer? Ideer til hvordan dette interface kan se ud? indtil videre har jeg forestillet mig noget i dur med at der returneres enten HTML eller XML som så renderes af stylesheets....
lad en klasse implementere et interface du har defineret i hovedprogrammet og brug Activator.CreateInstance-metoden til at oprette en instans af klassen.
IDitInterface = (IDitInterface)Activator.CreateInstance( "dinAssembly", "pluginKlasse, new object[] {} );
Vil jeg således ikke være nødt til at loade mit plugin hver gang siden loades?
Konkret vil jeg fx. gerne lave en side hvor jeg nemt og sikkert (uden om visual studio) kan tilføje eksempelvis et nyhedsplugin (eventuelt en ascx fil der viser nyheder) dette vil jeg gerne gøre runtime, og allerhelst kompileret ind i filen.... Jeg vil gerne starte ud med en xml fil der har nogle basale tags (title, header....) og så et eller flere tags der eksempelvis hedder: <component>news.ascx</component> det skal så være muligt at vælge mellem forskellige "plugins" til at placere i disse component tags, og så generere siden ud fra dette (i værste fald) eller loade komponenten dynamisk..... skal bruges i et simpelt CMS
erm... ja, et plugin skal loades hver gang en side skal loades, ligesom ALLE andre dine objecter. Objecter bliver altid oprettet igen ved hvert request, så jeg kan ikke se hvad problemet skulle være?
at gøre noget runtime, og samtidig snakke om at kompile det ind i dit program er to modsætninger... den sætning gør man faktisk i tvivl om hvad det er du egentlig vil, og det er et rigtigt plugin-system du vil lave, hvor alt kan skiftes ud som man har lyst, eller om man bare skal kunne vælge mellem en masse forudlavede komponenter når en side skal opbygges.
hmm.... kan godt se dilemmaet. Konkret vil jeg bygge et simpelt CMS til en håndfuld sider jeg sidder og vedligeholder. Jeg vil gerne have muligheden for at i designfasen bygge en side og så indsætte en bestemt komponent på denne side (det er denne del der er pluginbaseret, altså de plugins jeg kan vælge mellem loades dynamisk hver gang jeg "går i design mode"). Når jeg så er færdig med at designe siden så gemmer jeg den som den skal se ud og den bliver nu kompileret ind i .dll filen (dette er kompilerings delen).....efter min bedste overbevisning er dette den "smarteste" måde at lave dette på (men ideer til forbedringer modtages gerne)
hvis du kan vælge mellem en masse ascx'er er der ikke noget der skal compiles om bare fordi at du rykker rundt på dem på en aspx-side.
At vise i design mode hvordan en given ascx-control kommer til at se ud via er nok den sværeste del. Jeg går ud fra du gerne vil lave et system ala Visual Studio eller Webmatrix hvor man kan trække en control ind på siden og den så skal renderes så den ser ud som den vil gøre når en en bruger browser ind på hjemmesiden? Det kan jeg desværre ikke hjælpe dig med, og vil gå så langt og sige at det nok ikke kan lade sig gøre, da en ascx-control jo typisk indeholder kode der skal eksekveres før man ved hvilket html-output den giver.
Den nemmeste måde at specificere via et cms-system at "her vil jeg gerne have en control" lave dine egne tags som manså kan sættte ind. f.eks. skriver man [control:news], som så bliver parset om til et <ditTag:NewsControl id="newsControl1" runat="server" /> når at siden bliver gemt.
takker, tror jeg ved hvordan jeg vil gøre det nu..... Jeg vælger ikke at rendere min kontrol for brugeren, men blot indsætte [control:news] i min kode. Skriv lige et svar
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.