LightSpeed Passes Mats’ Challenge

Posted by Andrew on June 26, 2007

I took the challenge today and we passed.

BackgroundMotion Code Sample

Posted by Andrew on June 19, 2007

The BackgroundMotion community site and ASP.NET code sample that we worked with Microsoft to develop has gone live. w00t!

If you’re interested in ASP.NET you definitely want to check out the sample as it illustrates one approach to architecting .NET web apps. The architecture was really designed to facilitate rapid development so emphasizes things like testability etc. My personal highlights of the sample are:

  • Use of a domain-driven design techniques. Repository and Unit of Work abstractions over LINQ to SQL
  • Model-level validation using the Validation Block
  • Dependency injection using Composite Web Block
  • Using Lucene.NET to index a domain model
  • Using MVP with declarative data-binding in the presentation layer

Let us know what you think.

Eager Loading

Posted by Andrew on June 06, 2007

Alex has been thinking a bit about object eager-loading (prefetch) retrieval strategies recently.

The LINQ to SQL approach of using a Lambda is interesting and was the approach we used on BackgroundMotion:

Contribution contribution = Repository<Contribution>
      .Find(1)
      .Including(c => c.ContributionTags);

What’s more interesting to me however is that now we have a way to refer to symbols in a type safe way. Useful for things like data binding etc. where we want to specify a property and where currently we have to use a string. That’s not to say that this Lambda syntax is optimal for this but what can you do? :-)

With respect to eager load strategies our new domain model/persistence framework LightSpeed has the notion of a “named aggregate” - aggregate being a term taken from Domain-driven design. Basically we use an attribute called EagerLoad at the association level in the model:

[EagerLoad(AggregateName="ContributionDetail")]
public readonly EntityCollection<ContributionTag> _contributionTags
  = new EntityCollection<ContributionTag>();

Then we can specify an aggregate name as part of our query.

Query query = new Query(Entity.Attribute("Title").Like("A%"));
query.AggregateName = "ContributionDetail";
IList<Contribution> contributions = Repository.Find<Contribution>(query);

The key point is that we are being explicit about naming the aggregates.