Skip to main content

Domain Specific Languages (DSL) And VS2008

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.

Comments

  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?

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

    ReplyDelete
  3. Hope this answer your question

    ReplyDelete
  4. 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.

    ReplyDelete

Post a Comment

Please keep your comments clean.

Popular posts from this blog

Creating a quick Todo listing app on Windows using IIS7, Node.js and Mongodb

As I mentioned in my last post, more and more organizations are leaning towards Web Oriented Architecture (WOA) which are highly scalable. If you were exploring cool, scalable options to build highly performing web applications, you know what Node.js is for.After following the recent post from Scott Hanselman, I was up and running quickly with Node.js. In this post, I’ll explain step by step how I’ve setup Node.js and Mongodb to create a simple Todo listing application.Setting up Node.jsThis is what I’ve done.1 – Goto http://nodejs.org/, scroll down and download node.exe for Windows, and place it in your c:\node folder2 – Goto IIS Node project in Git at https://github.com/tjanczuk/iisnode, download the correct ‘retail’ link of IIS Node zip file (I downloaded the already built retail package, otherwise you can download and build from the source).3 – Extract the zip file some where, and run the install.bat or install_iisexpress.bat depending on your IIS Version. If you don’t have IIS in…

MVVM - Binding Multiple Radio Buttons To a single Enum Property in WPF

I had a property in my View Model, of an Enum type, and wanted to bind multiple radio buttons to this.

Firstly, I wrote a simple Enum to Bool converter, like this.

public class EnumToBoolConverter : IValueConverter { #region IValueConverter Members public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (parameter.Equals(value)) return true; else return false; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return parameter; } #endregion }

And my enumeration is like

public enum CompanyTypes { Type1Comp, Type2Comp, Type3Comp } Now, in my XAML, I provided the enumeration as the ConverterParameter, of the Converter we wrote earlier, like
<Wi…

Top 7 Coding Standards & Guideline Documents For C#/.NET Developers

Some time back, I collated a list of 7 Must Read, Free EBooks for .NET Developers, and a lot of people found it useful. So, I thought about putting together a list of Coding Standard guidelines/checklists for .NET /C# developers as well.As you may already know, it is easy to come up with a document - the key is in implementing these standards in your organization, through methods like internal trainings, Peer Reviews, Check in policies, Automated code review tools etc. You can have a look at FxCop and/or StyleCop for automating the review process to some extent, and can customize the rules based on your requirements.Anyway, here is a list of some good Coding Standard Documents. They are useful not just from a review perspective - going through these documents can definitely help you and me to iron out few hidden glitches we might have in the programming portion of our brain. So, here we go, the listing is not in any specific order.1 – IDesign C# Coding StandardsIDesign C# coding stand…