[Journal - New Project: Gregor.Media]

New Project: Gregor.Media

Sunday, November 5, 2006

I'm delighted to welcome a new project in the Gregor.NET application framework: Gregor.Media is the latest entry.

It's a general-purpose content rendering engine, leveraging the available text generation features, and using the .NET Console code interpreter heavily. Hopefully, it will push the framework to new directions.

In some way, I see all the things I've put my hands on so far - data access, code generation, code interpretation, text editing, WebEdit.NET with its extensible storages and views - finally coming together.

Remember my musings about Data Access and Strong Typing? This was about dynamically constructing generic types (tuples, in this case) from schema information returned from a database, but doing so with .NET Console. This time, implementing Gregor.Media, I came again to face the issue of mapping relational data to objects. The approach now isn't so all-automatic, but with the new C# language features, well see for yourself:

// general code, one of several generic overloads
void ReadTable<T0, T1>(string sTableName,
                       string sColumn0, string sColumn1,
                       VoidCallback<T0, T1> cb){
    using(IDataReader reader = this.ExecuteReader(sTableName, sColumn0, sColumn1)){
        while(reader.Read()){
            T0 v0 = (T0) this.GetValue(reader, sColumn0);
            T1 v1 = (T1) this.GetValue(reader, sColumn1);
            cb(v0, v1);
        }
    }
}

// client code
void ReadArtists(){
    this.ReadTable<int, string>(
        "Artist",
        "ArtistId", "Name",
        delegate(int id, string sName){
            CArtist artist = new CArtist(id, sName);
            m_Artists.Add(artist, artist.Name);
        }
    );
}

This isn't DLinq-like simplicity, but it's reasonably concise.