onsdag, maj 14, 2008

reSharper 3.1 med C# 3.0...

Igår installerade jag reSharper 3.1 på min Visual Studio 2008. Bättre intellisense, bättre refactoring-stöd och en allmänt trevligare utvecklingsmiljö var det som lockade. Tyckte också att det skulle bli kul att se vilket extra stöd man fick till de nya features i C# 3.0 så utan att läsa på allt för mycket installerade jag den senaste versionen, 3.1. Hoppade direkt in och skapa en ny console application i mitt favorit direcotry d:\junk\ och började skriva min favorit LINQ-fråga:

var procs = from p in Process.GetProcesses()

          select p;

 

Men istället för p så poppade en skum intellisense upp och ville ha en typ av nått slag... skrev om skrev om och skrev om men jag fick inte till frågan. Började tro att jag hade hamnat i akut LINQ-koma! Men det visade sig så klart att reSharper 3.1 inte har stöd för C# 3.0 utan då måste man vänta till version 4.0.

 

Det alternativ man har är att ladda ner den senaste nightly builden från reSharper 4.0 men det känns lite väl hard core just nu med tanke på att vissa av byggena är taggade som Not Recommended.

 

 

Så, dags för avinstallation. In på add/remove programs och plocka bort den - gick mycket smärtfritt och sedan tillbaka in till Visual Studio igen men...

 

Ingen intellisense!

 

Det visade sig dock att det bara var en checkbox under Tools/Options/Text Editor/C#. Av någon anledning återställer inte avinstallationen av reSharper "Auto list members" - Puh!

 

Men visst är det så att man är lite sugen på att ladda ner senaste bygget och testa 4.0...

fredag, maj 02, 2008

Plugin-pattern på webben

Martin Fowler har i sin bok Patterns of Enterprise Application Architecture beskrivit ett plugin patter som man kan använda för att länka ihop applikationer genom konfiguration istället för vid kompilering. Min tanke var att bygga en webbapplikation, typ en portal, som sedan blir medveten om att andra applikationer existerar bara genom en konfigurering istället för att man måste känna till den vid utveckling. Min vision var att kunna utveckla och uppgradera portalen för sig och sedan utveckla och uppgradera applikationer för sig.

Jag började med att definiera ett interface som varje applikation måste implementera. Det interfacet ska kunna leverera information om applikationen i fråga:

    public interface IApplicationInfo

    {

        string ApplicationName { get; set; }

    }

 

Sedan la jag till en PluginFactory med en statisk metod getPlugin. Den metodens uppgift var att läsa in assemblyt (snyggt ord) från disk och skapa en instans av den klass som implementerar IApplicationInfo och returnera denna...

public static IApplicationInfo getPlugin(string assemblyName)

{

var assembly = Assembly.LoadFrom(assemblyName);

var assemblyTypes = from a in assembly.GetTypes()

                    select a;

 

foreach (var t in assemblyTypes)

{

    var o = Activator.CreateInstance(t);

    if (o is IApplicationInfo)

        return o as IApplicationInfo;

}

return null;

}

 

Först placerade jag min PluginFactory i samma Visual Studio 2008 projekt som Portalen men det gjorde att mina enhetstester mot getPlugin blev otroligt sega att köra eftersom att den måste starta igång webservern först. Det blev dock betydligt bättre när jag flyttade ut den till ett eget class-library. Ett härligt bevis på hur test-driven utveckling gör att man fattar beslut tidigt som gör att ens arkitektur blir mer testbar!

Nästa steg var att lägga till en AppSetting i min web.config för varje applikation som jag vill att portalen ska känna till och använde mig av en LINQ-fråga för att hämta ut dessa:

var applications = from a in ConfigurationManager.AppSettings.AllKeys

                   where a.StartsWith("PortalApplication")

                   select new { AssemblyName = ConfigurationManager.AppSettings[a] };

 

Grymt coolt! Refelction, LINQ, plugin-patterns och allt möjligt coolt men sen då? Vad har jag vunnit med det här jämfört med att bara lägga in den här informationen i web.config eller i en databas. Hur ska jag nu få mina applikationer att agera i portalen som om de var en del av portalen från första början?

Ju mer jag funderar på det hela desto mer ser det ut som att det är Facebook jag vill bygga (fast utan den sociala delen)... För det är ju precis det Facebook är, en portal med viss gemensam funktionalitet och ett antal tjänster som sedan applikationsutvecklare kan nyttja för att bygga egna applikationer som jackas in i portalen. Så hur har Facebook löst interaktionen mellan en applikation och portalen? Kör varje applikation i en IFrame eller? Är det någon som vet??