Vem är Johan Lindfors

Jag jobbar som teknisk chef på Microsoft i Sverige och ansvarar för vår tekniska evangelisering mot utvecklare. I den här bloggen har jag för avsikt att skriva om utveckling i allmänhet och på Microsofts plattform i synnerhet.

Är du intresserad av en XNA användargrupp?



Visa resultat!

Get Microsoft Silverlight

Windows Azure och .NET Framework 4.0

Under TechEd North America konferensen presenterade Bob Muglia en hel del nyheter om Windows Azure Platform. Jag hoppas att du inte har missat nyheterna och uppdateringarna:

  • Windows Azure Tools for Visual Studio 1.2
    En ny version av Windows Azure SDK och Tools for Visual Studio innebär att det nu går att bygga applikationer på Windows Azure med hjälp av .NET Framework 4.0. Det finns också en del andra intressanta nyheter som att exempelvis få stöd för IntelliTrace och direkt ladda upp en applikation från Visual Studio till Windows Azure. Du kan redan nu ladda hem det uppdaterade SDK’t här, och hitta ytterligare läsning här!
  • Uppdateringar till SQL Azure
    Från och med den 28:e juni så kan kunder nu dra nytta av uppdateringar i SQL Azure. Bland annat så kan en databas uppdateras från den tidigare max-gränsen på 10GB till snart 50GB. Vi kommer också att kunna använda oss av spatiala typer för att lagra information om platser med exempelvis latitud och longitud. Mer information om uppdateringarna till SQL Azure hittar du här!
  • Windows Azure CDN
    Med hjälp av Windows Azure CDN (Content Delivery Network) så kan utvecklare nu cacha data lagrat i Windows Azure Blobs i olika datacenter över världen så att informationen finns tillgänglig närmare användarna och kunderna. Idag finns Windows Azure CDN på 19 platser, strategiskt placerade runt omkring och används även av bland annat Windows Update, Zune videos och Bing Maps. Mer detaljer såsom priser och tillgänglighet kan du hitta här!
  • Data Sync Service for SQL Azure
    Det här är en ny tjänst som för närvarande är tillgänglig som en förhandsversion i laborations-miljön. Den gör det möjligt för kunder att synkronisera data mellan två SQL Azure databaser i molnet. Det här är den andra tjänsten som erbjuds för SQL Azure Labs, den första var OData exponering av data. Du kan nå båda dessa tjänster via http://www.sqlazurelabs.com och vill du läsa mer om Data Sync tjänsterna så finns det information här!
  • Uppdatering av Windows Azure Platform Training Kit
    En uppdaterad version av utbildningskitet med massvis med information, laborationer, demos och presentationer finns nu tillgänglig för nedladdning. Bland annat så finns sju stycken nya laborationer som helt fokuserar på användning av Visual Studio 2010 och Windows Azure Platform. Hämta detta omedelbart här!
  • Exempel applikationer
    Två stycken exempelapplikationer finns nu tillgängliga. “PhluffyFotos” är en applikation som låter användare ladda upp bilder från sina mobila enheter, tagga informationen och dela med sig av resultatet. “PhluffyFotos” kan laddas hem från http://phluffyfotos.codeplex.com. Den andra exempelapplikationen heter “Full Monte” och är en “Monte Carlo”-simuleringstjänst som körs i Windows Azure. Den visar med hjälp av Excel som klient hur vi kan skapa applikationer som skalas både uppåt och nedåt vid behov. “Full Monte” kan laddas hem från http://code.msdn.microsoft.com/fullmonte.

MSDN TV Live – Introduktion till Code Contracts i Visual Studio

Code Contracts är Microsoft’s implementering av Design by Contract som först blev realiserat i programmeringsspråket Eiffel. Tesen är bland annat att vi tydligt skall beskriva kontraktet för en komponent som en klass. Detta kontrakt handlar om så mycket mer än bara att verifiera att parametrarna till en metod är ok. Det handlar om att kunna beskriva både ingående och utgående förväntningar på en metod; kunna hanterera arv och interface och att kunna dokumentera kontrakten.

I den här sessionen kommer Dag König att gå igenom de vanligaste funktionerna i Code Contracts. Det blir en enda lång demonstration av saker som vi kan göra med tekniken.

Datum Fredagen den 21:a maj
Tid 12:00-13:00
Plats Klicka här för att ta del av sändningen!

OBS: Webbsändningen använder Office Live Meeting och kommer att innehålla presentation, demonstration och ljud (via datorn). Innan du går med i webbsändningen så behöver du installera Office Live Meeting-klienten!

Visual Studio 2010 och .NET Framework 4.0 äntligen här!

Så idag släpptes äntligen Visual Studio 2010 och .NET Framework 4.0. Du som har en MSDN-prenumeration kan redan ladda hem den nya lanserade versionen från “MSDN Subscription Downloads”. När jag skriver detta (21.25 på måndagskvällen) så har vi precis avslutat vårt svenska lanseringsevenemang på Skandia-biografen i Stockholm (som en del av The Ultimate Tour 2010), och den globala lanseringen pågår för fullt och kan också följas Live här!

Om du vill fortsätta att ta del av nyheterna i Visual Studio 2010 och .NET Framework 4.0 så bör du besöka och börja prenumera på innehållet på http://msdn.se/vs2010.

En av våra partners som är tidiga ut med att installera .NET Framework 4.0 RTM på sina servrar är Binero. De håller på för fullt vid skrivandets stund! De har redan installerat ramverket och kör för fullt! (Uppdaterades 2010-04-13)

Visual Studio 2010 och .NET Framework 4 RC

I måndags kväll, sent, så släppte vi Release Candidate av Visual Studio 2010 och .NET Framework 4.0 för nedladdning för dig som har en MSDN prenumeration. Den borde finnas publikt tillgänglig sent på onsdagen eller tidigt under torsdagen.

Det finns inga nya funktioner i RC-versionen utan det är bara en prestanda och stabilitets-uppdatering.

Läs mer och ladda hem själv här!

Filmerna från Scott Guthrie i Stockholm

Nu finns filmerna producerade och publicerade på Channel9. En trevlig liten tidig julklapp för oss som kanske börjat att tröttna på Kalle Anka klockan 15.00 på julafton. :)

Du kan också få tillgång till både presentationerna och demonstrationerna eftersom Scott redan publicerat dessa på hans blogg!

Ha en riktigt trevlig jul nu!

Scott Guthrie i stockholm

Onsdagen den andra december 2009 kommer att gå till minnet för mig som en av de mest intensiva och intressanta dagar jag varit med om under min tid på Microsoft. Att från tidig morgon styra och följa Scott Guthrie mellan möten och presentationer till lämning på Arlanda på kvällen var en mycket rolig upplevelse.

Scott höll flera intressanta presentationer om .NET 4.0, Visual Studio 2010, ASP.NET MVC och Silverligt 4.0. Dagen verkar ha uppskattas av de nästan 1200 deltagarna och på twitter skrevs det flera roliga inlägg! Om du vill veta lite mer om vad som hände och vad som togs upp så har Mike Plate skrivit en omfattande rapport från dagen.

Andra som var där:

Hur fungerar MEF?

MEF eller Managed Extensibility Framework är ett gemensamt ramverk och en programmeringsmodell för att bygga en applikation som består av separata delar och komponenter som tillsammans skapar en helhet. MEF finns idag som en separat nedladdning på CodePlex, nyss släppt som en “preview 7” men kommer att ingå i .NET Framework 4.0 som en central del av vårt ramverk. Observera att koden i det här exemplet är skrivet med Visual Studio 2010 Beta 2 och .NET Framework 4.0.

Med hjälp av nyckelord som [Import] och [Export] kan beståndsdelarna exportera sin funktionalitet eller importera andra komponenters funktionalitet. Det som används för att binda dessa komponenter tillsammans är en så kallad “container” som i sin tur har en katalog av komponenter med detta beteende.

En textbox och en knappHär är ett exempel på hur en applikation kan se ut (ett mycket enkelt exempel, men åtminstone en introduktion).

Jag vill bygga en översättningsapplikation som läser in ett ord från användaren och översätter det ordet till andra språk baserat på separata komponenter. Applikationen kommer att bestå av en WPF-applikation med ett enda fönster bestående av en TextBox och en knapp.

Knappen har sedan logiken för att läsa av textrutans text och skriva tillbaka det översatta ordet i densamma.

Det som jag börjar med i det här fallet är att skapa ett interface som beskriver beteendet som jag vill att mina översättningsklasser kommer att implementera, här är förslaget:

public interface ITranslator
{
    string Translate(string wordToTranslate);
}

En översättningsklass skulle kunna se ut som följande:

public class French : ITranslator
{
    public string Translate(string wordToTranslate)
    {
        return "Oui";
    }
}

Jag ber om ursäkt för den naiva implementationen av översättning till franska, men det är ungefär så långt som min kompetens i det franska språket sträcker sig.

Sedan implementerar jag applikationens logik enligt följande:

public partial class Window1 : Window
{
    ITranslator translator;

    public Window1()
    {
       InitializeComponent();

       translator = new French();
    }

    private void btnTranslate_Click(object sender, RoutedEventArgs e)
    {
        var word = textBox1.Text;            
        textBox1.Text += " " + translator.Translate(word);
    }
}

Nu fungerar applikationen som jag hade tänkt det, men använder fortfarande inte MEF, och är inte heller speciellt flexibel i sin struktur baserat på att jag anar att jag kommer att vilja ha stöd för fler språk i applikationen.

Jag börjar med att se till att min översättningsklass exponerar och exporterar sin funktionalitet enligt följande:

[Export(typeof(ITranslator))]
public class French : ITranslator
{
    public string Translate(string wordToTranslate)
    {
        return "Oui";
    }
}

Och i själva fönstret markerar jag instansen “translator” enligt följande:

[Import]
ITranslator translator;

Det som jag också behöver se till är att ersätta instansieringen av “translator” med MEF’s teknik och metod att skapa instanser. Jag ersätter alltså instansieringen i konstruktorn till följande kod:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);

container.ComposeParts(this);

Det kanske inte är helt självförklarande vad som händer, men i korta drag så skapar jag först en så kallad katalog som i det här fallet undersöker den exekverande applikationen om det finns komponenter som använder [Export] eller [Import]. Den katalogen skickar jag som en parameter till en “container” som används för att koppla samman alla komponenter i katalogen med hjälp av det sista anropet till ComposeParts.

Applikationen fungerar nu på samma sätt som tidigare, skulle det vara så att det inte kompilerar så är det antagligen så att följande namnrymder inte finns tillagda i filen:

using System.ComponentModel.Composition.Hosting;
using System.Reflection;
using System.ComponentModel.Composition;

För att ytterligare visa på styrkan av MEF så vill jag nu lägga till ytterligare språk till översättningen. Jag skapar därför två ytterligare översättningsklasser på liknande sätt som tidigare:

[Export(typeof(ITranslator))]
public class Spanish : ITranslator
{
    public string Translate(string wordToTranslate)
    {
        return "Si";
    }
}

[Export(typeof(ITranslator))]
public class Swedish : ITranslator
{
    public string Translate(string wordToTranslate)
    {
        return "Ja";
    }
}

Men hur får jag en variabel som bara är en instans av ett interface till att innehålla flera klasser, precis, det gör jag inte. Istället väljer jag att ersätta den tidigare instansen av “translator” till att se ut som följande:

[ImportMany]
IEnumerable<ITranslator> translators;

[ImportMany] atributet säger till MEF att hitta alla komponenter som exporterar interfacet ITranslator och populera samlingen “translators” med dessa. Genom att sedan skapa en enkel for-each-loop runt mitt anrop till Translate så får jag ett önskat beteende:

foreach (var translator in translators)
{
    textBox1.Text += " " + translator.Translate(word);
}

Så kan vi alltså använda MEF i sin grundläggande form för att bygga flexibla och utbyggbara applikationer. Bland annat finns det kataloger för att undersöka en katalog i filsystemet om det finns andra “assemblies” som exporterar och importerar funktionalitet, och det finns till och med MEF för Silverlight som möjliggör asynkron laddning och instansiering av funktionalitet från servern.

Den här bloggen använder BlogEngine.NET 1.6.0.0
Temat anpassat av Johan Lindfors