Domain Specific Languages (DSL) And VS2008

By Anoop Madhusudanan

Vote on HN
Recently I started playing with VS 2008 and DSL (Domain Specific Language), and soon got bored with the T4 template engine. If you are still not with the story, the easiest way to start the play with out spoiling the existing egg in your plate is

This should get you everything you need to start with

The Visual Studio 2008 SDK contains DSL toolkit, along with a lot of other goodies. (If you have VS 2005 instead of 2008, still you can dig around, find and download the SDK for VS 2005, and you'll get the DSL toolkit installed with the same)

And just before we start, here is a bit of story about DSL if you are not familiar with the same. "Domain-Specific Language Tools enable the construction of custom graphical designers and the generation of source code using domain-specific diagrammatic notations." In simple words, if you are unhappy with the existing class designer in Visual Studio, you can go ahead and use the DSL tools to create a class designer yourself, and write some code to generate code out of the class model you may create with you class designer. But once you are good enough, you may certainly think about doing much better things with DSL - for sure :). Now we are good to go.

Starting With DSL

Fire up your Visual Studio IDE, and create a new project. Select Other Project Types - Extensibility - Domain Specific Language Designer as shown, and click OK

Follow the Wizard, Select 'Minimal Language' from the set of template language definitions, and Finish off. You can find the classes and relationships on left, and the Diagram elements on right. You can map any class or relationship to a diagram element. (Fig 1) You can use the Diagram Element Map connector from the toolbox, to connect a class or relationship with a diagram element.

If you see, the ExampleElement domain class is mapped to the diagram element Example Shape . This means, the user of your DSL will use the shape definition of ExampleShape geometry shape, to draw a notation, that represents a ExampleElement

There is a DomainRelationShip that actually connects the ExampleElement Domain Class to itself. ExampleElementReferencesTargets DomainRelationship is mapped to a ExampleConnector. This simply depicts that the user of your DSL can use the notation provided by ExampleConnector to draw a relation between one ExampleElement and another ExampleElement.

You can add a new Domain Class by selecting either the Domain Class or Named Domain Class from the toolbox. To create a Domain Relationship between two Domain Classes, you can select the Embedded Relationship or Reference Relationship. If it is an embedded relationship, it means the target domain class is 'completely a part of' the source domain class - much like a polygon and the points. If the polygon is destroyed, so are the points in it. If you are familiar with UML, you know that it means composition.

On the other hand, a reference relationship depicts an aggregation, which means the target is not completely part of the source. For example, a product is part of the order, but a product will continue to exist even if the order is not there. As simple as that.


  1. In that example solution, ExampleElement is nested under the root element. If you create a new Domain Class, it appears as a new root. How do you go about getting new Domain Classes to nest, as this initial Domain Class does?

  2. You can use a relation connector - like an embedded relation or association, to specify the 'nestings'

  3. I have used a relation connector to associate domain classes, and my domain class will be nested in the heirarchy properly. However the new domain class will also appear at the bottom of the designer as well. This is different from the example of Minimal Language, where ExampleElement appears as a domain class under ExampleModel, but it does not display again at the bottom of the designer like any new domain class I add will do.


Please keep your comments clean.

© 2012. All Rights Reserved.