Dariusz quatscht

Web Development on Microsoft's Platform

October, 2009

Navigation
Posts
  • Dariusz quatscht

    Anmeldemöglichkeit zum TechTalk Anwendungsentwicklung mit Visual Studio 2010 und Freibier

    • 9 Comments

    Der Winter TechTalk den Christian Binder und ich halten lässt keine Registrierung mehr über die Webseite zu, da er ausgebucht ist.

    Es gibt hier zwei Dinge, die ich jetzt mal in den Raum stelle:

    1. Beim TechTalk zu Parallel Computing waren einige Locations auch ausgebucht und wir hatten trotzdem noch Stühle frei, da es doch immer wieder mal passiert dass man sich anmeldet und was anderes dazwischen kommt.
    2. Selbst wenn wir keine Stühle frei hätten, so gibt es noch die Möglichkeit sich auf den Boden zu setzen, an der Wand zu stehen oder Chair Sharing zu machen.

    Wir limitieren Anmeldungen einfach auf Grund von räumlichen Kapazitäten und Catering (Meist ein Brötchen und ein Getränk).

    Damit wir in keinen Engpass laufen, werden wir zu jedem TechTalk einen Kasten Bier mitbringen.

    Um nicht das falsche Bier mitzubringen, würde ich mich über Kommentare freuen, was denn so an den Standorten Karlsruhe, Köln, Hamburg, Berlin und München üblicherweise getrunken wird.

  • Dariusz quatscht

    Visual Studio 2010 - Fun with DynamicObject in C# 4.0

    • 1 Comments

    This morning I just played around with the new C# 4.0 dynamic feature. Using the dynamic keyword allows you to bind to properties, indexers and methods during runtime. This means that during compile time there is no check if the methods, properties or whatever you are calling are really existent, you experience any missing pieces during runtime.

    On the other hand this allows you to implement some flexible stuff. You can implement your own dynamic objects just deriving from DynamicObject and overriding the methods you are interested in.

    So, I just implemented a short demo how to use DynamicObject derived classes to wrap some parts of System.Data.SqlClient to access data from tables directly, without any code gen.

    The result is, that I can write the following code and it will resolve during runtime if it can find data for the specified tables.

    using( dynamic db = new DirectDataAccess("connectionstring") )
    {
    Console.WriteLine( db.Products.Count );
    Console.WriteLine( db.Customers[15].CompanyName );
    Console.WriteLine( db.Employees.Row10.LastName );
    }

    Here is how it works. First lets have a look at the responsible classes:

    shot1

    DirectDataAccess, DirectRowAccess and DirectColumnAccess are deriving from DynamicObject. My approach is simple and just for demo purposes. Also it just enables read access and does not handle errors well. I encapsulate DataTable as member and create new instances of DirectRowAccess and DirectColumnAccess through the overriden TryGetMember methods.

    Lets have a look into the DirectDataAccess implementation:

    public class DirectDataAccess : DynamicObject, IDisposable
    {
    SqlConnection connection = null;

    public DirectDataAccess(string connectionString)
    {
    connection = new SqlConnection(connectionString);
    connection.Open();
    }

    public void Dispose()
    {
    /// removed for clarity
    }

    public override bool TryGetMember(GetMemberBinder binder,
    out object result)
    {
    DataTable table = new DataTable(binder.Name);
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "SELECT * FROM " + binder.Name;
    cmd.CommandType = CommandType.Text;
    cmd.Connection = connection;

    try
    {
    table.Load(cmd.ExecuteReader());
    }
    catch (Exception)
    {
    result = null;
    return false;
    }

    result = new DirectRowAccess(table);
    return true;
    }
    }

    The constructor is creating the connection and opens it. The TryGetMember implementation just constructs a SQL Query for the given binder. The binder specifies exactly the property name I use in the code. For instance, I want to get a specific table, I just type:
     
    // db is an instance of DirectDataAccess

    var table = db.Products;

     
    table is an instance of DirectRowAccess which is also derived from DynamicObject.
     
    public class DirectRowAccess : DynamicObject
    {
    private DataTable table = null;

    public DirectRowAccess(DataTable table)
    {
    this.table = table;
    }

    public override bool TryGetMember(GetMemberBinder binder,
    out object result)
    {
    string raw = binder.Name.Substring(3,
    binder.Name.Length - 3);
    int index = Convert.ToInt32(raw);

    try
    {
    result = new DirectColumnAccess(table.Rows[index]);
    return true;
    }
    catch (Exception)
    {
    result = null;
    return false;
    }
    }

    public override bool TryGetIndex(GetIndexBinder binder,
    object[] indexes,
    out object result)
    {
    result = new DirectColumnAccess(
    table.Rows[(int)indexes[0]]);
    return true;
    }

    public int Count
    {
    get
    {
    return table.Rows.Count;
    }
    }
    }

    Methods, properties and indexers which are implemented by the class are called directly. The override TryGetMember will be called if a method or property was not found by the binder natively.
     
    I can access rows from the table in two ways. I can use an indexer like
     
    var row = db.Customers[10];

    or I can use an alternative implementation like
     
    var row = db.Customers.Row10;

    both returning a new instance of DirectColumnAccess, which, yes you can guess, is also derived from DynamicObject:
     
    public class DirectColumnAccess : DynamicObject
    {
    private DataRow row = null;

    public DirectColumnAccess(DataRow row)
    {
    this.row = row;
    }

    public override bool TryGetMember(GetMemberBinder binder,
    out object result)
    {
    try
    {
    result = row[binder.Name];
    return true;
    }
    catch (Exception)
    {
    result = null;
    return false;
    }
    }

    public override string ToString()
    {
    return string.Join(",", row.ItemArray);
    }
    }

    This TryGetMember implementation tries to retrieve the column value specified in the binder, for instance:
     
    var companyName = db.Customers[10].CompanyName;

    The ToString() override is just an convenient way to retrieve all values from a specific row, so you can just console out the following:
     
    Console.WriteLine( db.Customers[10] );

    Just remember:
    This is just demo code, written just for fun!

    Another Idea I had was to write a generic REST object which implements the common HTTP Verbs GET, POST, PUT and DELTE to talk to REST Services. I thought on writing something like this:

    dynamic rest = new REST("http://twitter.com")
    var xml = rest.GET.statuses_public__timeline.AsXml();

    var postXml = ...;

    var xml2 = rest.POST.statuses_update(postXml).AsXml();

    But there are some problems to solve like the fact that you can’t use a forward slash in a method or property name and masking the underscore is maybe not a good idea.

    What do you think, are there any usages in your environment where DynamicObject derived implemenations could help?

  • Dariusz quatscht

    Rätsel: Was wurde Veröffentlicht?

    • 4 Comments

    MSDN Blogs Main Feed RSS

    Und, schon eine wage Idee?

  • Dariusz quatscht

    Das Windows Azure Token kommt einfach nicht…

    • 1 Comments

    Ich schreibe diesen Blog Post an alle Teilnehmer des Windows Azure Gewinnspiels (http://www.msdn-online.de/AzureNow), die noch immer nicht Ihr Token erhalten haben.

    Das Token wird innerhalb von 48 Stunden per Email an Sie versendet. Falls Sie nach 48 Stunden immer noch kein Windows Azure Token erhalten haben, so schreiben Sie mir bitte eine Email

    dparys@microsoft.com

    und teilen Sie mir bitte Ihre Windows Live ID mit der Sie die Registrierung durchgeführt haben, sowie das Datum und die Uhrzeit der Registrierung mit. Dann kann ich auch entsprechend diese Informationen weitergeben und intern eskalieren.

    Falls Sie mich auf anderem Wege kontaktieren (z.B. über mein Blog) so hinterlassen Sie mir doch bitte eine Möglichkeit Ihnen zu antworten (z.B. die eigene Email Adresse).

  • Dariusz quatscht

    Visual Studio 2010 Serie: C# 4.0 Webcast

    • 0 Comments

    In den nächsten Monaten werden wir bei MSDN Online einen Schwerpunkt auf Visual Studio 2010 und dem .NET Framework 4 legen. Dies wird sich auch in den kommenden MSDN Webcasts widerspiegeln. Am Montag ist hierzu der erste Webcast erschienen. Er behandelt die neuen Sprachfeatures von C# 4.0.

    Link: Webcast C# 4.0

    Während der PDC 2008 habe ich bereits über die wichtigsten Features geblogged.

    C# 4.0 kurz zusammengefasst:

    • Das neue Keyword dynamic und damit Dynamic Invoke
    • Benannte Optionale Parameter
    • Verbesserungen COM Interop –> Interop Type Embedding
    • Co- und Contra Varianz
  • Dariusz quatscht

    Das “1-Wochen Projekt” Revisited

    • 5 Comments

    Ich denke ich sollte zu meinen Blog Post zum 1-Wochen Projekt ein wenig Stellung nehmen.

    Die Frage sollte nicht provokativ wirken, ich habe auch keine Praktikanten die ich zur Verfügung stellen kann. Es ging mir vielmehr um das Verständnis ob ein beliebiger Entwickler, mit gleichem Kenntnisstand wie man selbst, hilfreich sein kann, wenn er nur eine Woche zur Verfügung steht. Die Fragestellung war vielleicht auch nicht so glücklich, deshalb möchte ich die Frage neu stellen, mit neuen Rahmenbedingungen:

    Wenn Ihr 1 Woche Zeit hättet, dass zu Programmieren was Ihr schon immer mal anpacken wolltet, was wäre das? Ein Tool, eine Hilfsklasse, ein komplettes Spiel, Refactoring des kompletten Projekts?

    Die Definition von 1 Woche in Stunden ist bei jedem unterschiedlich, aber ich denke 7x12 sollte es nicht überschreiten.

  • Dariusz quatscht

    Dominick Baier auf Channel 9

    • 0 Comments

    Ich hatte vor längerer Zeit die Gelegenheit Dominick Baier zum Thema Windows Identity Foundation zu interviewen. Das Interview ist nun endlich fertig gerendered und auf Channel 9 publiziert.

    Interview mit Dominick Baier auf Channel 9

    Leider hat während des Interviews die Kamera ihren Geist aufgegeben. Oder vielmehr: Die Schärferegulierung hat nicht mehr funktioniert. Insofern sollte man sich dann einfach nur das Audio zu Gemüte ziehen.

  • Dariusz quatscht

    Umstellung des CSS Layouts

    • 0 Comments

    So, das Wochenende der Blog Umstellung ist nun vorbei. Was hat sich eigentlich verändert? Nun, mein Blog das auf den MSDN Blogs liegt wird nun in einem unserer Data Center gehostet. Das war vorher nicht der Fall. Ansonsten hat sich nichts getan. Sprich, ich bin immer noch an diese Blog Software gebunden und meine Suche nach einer möglichen Alternative hat sich zumindest konkretisiert. Ich denke es wird Subtext werden. Das ist jetzt von der Anprogrammierung auch nicht so der Hit, aber es ist noch überschaubar.

    Auf Wunsch einiger Leser werden nun kaum Grafiken in der Hauptseite angezeigt. Der Style machts möglich, aber leider eben auch nur dieser Style. Der Nachteil ist die Wahnsinnige enge, damit wird das anzeigen von Sourcecode nicht gerade einfacher.

    Ich habe nicht die alten Posts auf das neue Stylesheet angepasst. Insofern können ausbrechende Grafiken und auch Quelltexte in den älteren Posts unter Umständen schlimm aussehen. Falls die Lesbarkeit zu sehr leidet, einfach anpingen, ich werde den entsprechenden Post im Laufe der Zeit anpassen.

  • Dariusz quatscht

    Das 1-Wochen Projekt

    • 10 Comments

    Nehmen wir mal an, wir hätten eine Ressource die uns eine Woche zur freien Verfügung stehen würde. Nehmen wir an, diese Ressource würde uns kein Geld kosten. Nehmen wir an diese Ressource könnte uns in dieser einen Woche ein beliebiges Thema selbstständig bearbeiten und fertigstellen.

    Was würdet Ihr aus Entwickler-Sicht diese Ressource entwickeln lassen?

    Hättet Ihr überhaupt Bedarf an einer solchen Ressource?

  • Dariusz quatscht

    Erreichbarkeit meines weblogs

    • 0 Comments

    Für dieses Wochenende (beginn Donnerstag Nacht) sind Wartungsarbeiten an der MSDN Blogs Plattform angekündigt. In dieser Zeit werden keine neuen Blog Posts auf der Plattform erscheinen, des weiteren wird die Seite unter Umständen in einen Wartungsmodus geschaltet. Ab Montag sollte dann alles wieder reibungslos funktionieren.

    Ich wurde auch angeschrieben bezüglich der Download-Größe der Bilder und Videos die in meinen Blog Posts verwendet werden. Das sind unter Umständen mehrere MB die heruntergeladen werden, nur weil man die Blog Seite mal anschauen will. Ich werde das ändern sobald die Plattform umgestellt ist. Sorry an dieser Stelle nochmal.

Page 1 of 2 (11 items) 12