<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Edward Bakker</title>
    <link>http://www.edwardbakker.nl/</link>
    <description>Guidance, automation and factories</description>
    <language>en-us</language>
    <copyright>Edward Bakker </copyright>
    <lastBuildDate>Mon, 30 Jul 2007 11:47:25 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.8.5223.2</generator>
    <managingEditor>ef.bakker@quicknet.nl</managingEditor>
    <webMaster>ef.bakker@quicknet.nl</webMaster>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=f2d916bc-ae06-4140-8761-bc26a44e904f</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,f2d916bc-ae06-4140-8761-bc26a44e904f.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,f2d916bc-ae06-4140-8761-bc26a44e904f.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=f2d916bc-ae06-4140-8761-bc26a44e904f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Slides and recording 'Build Your Own Software Factory'</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,f2d916bc-ae06-4140-8761-bc26a44e904f.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,f2d916bc-ae06-4140-8761-bc26a44e904f.aspx</link>
      <pubDate>Mon, 30 Jul 2007 11:47:25 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;&lt;font face=Calibri color=#000000 size=3&gt;The &lt;/font&gt;&lt;a href="http://download.microsoft.com/download/1/b/0/1b0d95a3-40be-41ce-a40d-512a5f869938/arc303_bakker_santos.pptx"&gt;&lt;font face=Calibri size=3&gt;slides&lt;/font&gt;&lt;/a&gt;&lt;font face=Calibri color=#000000 size=3&gt; and &lt;/font&gt;&lt;a href="http://download.microsoft.com/download/1/b/0/1b0d95a3-40be-41ce-a40d-512a5f869938/arc303.wmv"&gt;&lt;font face=Calibri color=#800080 size=3&gt;recording&lt;/font&gt;&lt;/a&gt;&lt;font face=Calibri color=#000000 size=3&gt; of
   our (&lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa"&gt;&lt;font face=Calibri color=#800080 size=3&gt;Jezz&lt;/font&gt;&lt;/a&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; and
   myself) session ‘Build Your Own Software Factory’ are now available for download. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Calibri','sans-serif'; mso-ansi-language: EN-US; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-language: NL; mso-bidi-language: AR-SA; mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;&lt;font color=#000000&gt;From
   the statistics of my blog I know that most of my ‘readers’ don’t live in Japan, but
   If you ARE in Japan on 21st-24th August and plan to visit &lt;/font&gt;&lt;a href="http://www.microsoft.com/japan/teched/default.mspx"&gt;&lt;font color=#800080&gt;TechEd
   Yokohama&lt;/font&gt;&lt;/a&gt;&lt;font color=#000000&gt;, come join us and attend &lt;/font&gt;&lt;a href="http://www.event-registration.jp/events/te07/SessionDetail.aspx?sessionid=T1-401"&gt;&lt;font color=#800080&gt;our
   session&lt;/font&gt;&lt;/a&gt;&lt;font color=#000000&gt;.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=f2d916bc-ae06-4140-8761-bc26a44e904f" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,f2d916bc-ae06-4140-8761-bc26a44e904f.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=655dc4b7-30d2-48c4-baad-e0719e524350</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,655dc4b7-30d2-48c4-baad-e0719e524350.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,655dc4b7-30d2-48c4-baad-e0719e524350.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=655dc4b7-30d2-48c4-baad-e0719e524350</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <b>Factories 201 Series - Building Software Factories</b>
        </p>
        <ul>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">What
         are they (concretely)?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">When
         would you build one?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx">What
         do I tell my Manager?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx">How
         long will it take?</a> (Jezz) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
         would you build?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx">With
         what would you build it?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx">How
         would you build it?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx">What
         should you strive for?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/28/factories-201-what-are-the-challenges.aspx">What
         are the challenges?</a> (Jezz)</li>
        </ul>
        <p>
      Post authors: <a href="http://www.edwardbakker.nl">Edward Bakker</a> and <a href="http://blogs.msdn.com/jezzsa">Jezz
      Santos</a>. 
      <hr /></p>
        <p>
      Well, we have finally come to the end of this 201 series on ‘<b>Building Software
      Factories</b>’. 
   </p>
        <p>
          <u>First time arriving here?</u> - we have listed the entire series above – please
      have a look through those posts before ending it below. 
   </p>
        <p>
      If you are arriving here after reading (<i>hopefully all</i>) the posts in the series,
      we wanted to say, good on you, and thanks for sticking it out with us. 
   </p>
        <h3>Series Wrap-Up
   </h3>
        <p>
      Well, we have spent quite a bit of time and thought in putting this series together
      for you. The motivation behind this effort has been that we’ve recognised that there
      is little practical information helping ordinary professional developers on getting
      started with building and understanding software factories. We have had quite a head
      start on this and wanted to share our knowledge and experiences with you and the community
      to promote the uptake of building factories, which in turn should promote the adoption
      of software factories and the industrialisation of software in general. 
   </p>
        <p>
      This series was created in a format that asks a logical sequence of questions that
      you might have when trying to figure out how to build software factories today. We
      have covered many such issues as they arose and shared much of the combined knowledge
      and experiences built up over the last few years in this space. We will be sharing
      more resources on this in future posts – so stay tuned to our blogs. 
   </p>
        <p>
      We hope that you can take the guidance represented in this series forward as a starting
      point for developing your own software factories further. We recognise openly and
      frankly in the series that this is not a trivial undertaking today, but hopefully
      we have shown you that it is very possible and how to successfully approach it. Hopefully
      we have also directed you to what’s most important, where you should direct your energies,
      and how to build factories practically and realistically. 
   </p>
        <h3>Your Feedback
   </h3>
        <p>
      One of the primary objectives of this series was to connect with many more of you
      in the community and share ideas and innovations about everyone’s efforts at building
      factories today. 
   </p>
        <p>
      We have received a small number of comments to this series so far, which we have been
      keen to discuss at length, and hope we have done a good job at answering the questions
      appropriately. Hopefully, there are many more of you out there building factories,
      or at least considering building them, and so we hope to hear more from all of you
      on that. Please drop us a comment on the appropriate post and we will work hard to
      get you an answer you will find useful. 
   </p>
        <p>
      If we are doing a good job please let us know. If we are doing a poor job and you
      don’t like the guidance we are giving please let us know that also. This should shape
      any future guidance we give the community in this space, and at least we can start
      further discussions with those of you in this space. Hopefully, we will also get a
      feel for just how many of you are out there are in this space. 
   </p>
        <h3>The Final Say
   </h3>
        <p>
      There should now be a little more information out there to help you build a software
      factory right now on the Microsoft platform with the current toolsets. This series
      was created exactly for that purpose to share with you the experiences we have had
      in building factories and give you insights into the issues we have faced on this
      road already. 
   </p>
        <p>
      As more and more people jump into this space we expect to see from the community more
      detailed, formal guidance on this subject, so that the community as a whole can learn
      from previous experiences and elevate the adoption and the application of software
      factories to real world projects. 
   </p>
        <p>
      After all we think that the act of building a software factory should leverage the
      tenants that software factories promote themselves, i.e. 
   </p>
        <blockquote>
          <p>
            <i>“Package domain expertise and guidance in a form that others can re-use and manipulate
      to create solutions using simplified descriptions of the problem at hand.”</i>
          </p>
        </blockquote>
        <p>
      Hopefully we have done a good job of that for you, and hopefully you will consider
      the experiences we have shared in this series in your factory building efforts. 
   </p>
        <h3>Come see us...
   </h3>
        <p align="justify">
          <a href="http://go.microsoft.com/?linkid=1865553">
            <img alt="Tech Ed Bloggers" src="http://techedbloggers.net/Images/Flair/teched07_120X90_v2w.jpg" align="right" border="0" />
          </a>
        </p>
        <p align="left">
      We are proud to announce that we will be presenting a session on ‘<b><u>Real World:
      Building Software Factories</u></b>’ at <a href="http://www.microsoft.com/events/teched2007/default.mspx">Tech-Ed
      2007</a> in June this year.
   </p>
        <p align="left">
      The 300 level session will contain material from this series and demos and examples
      of other factories to explain the concepts. We would love to meet up with you there
      and answer your factory building questions. 
   </p>
        <p>
       
   </p>
        <p>
      Many Thanks, <a href="http://blogs.msdn.com/jezzsa">Jezz Santos</a> and <a href="http://www.edwardbakker.nl">Edward
      Bakker</a></p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=655dc4b7-30d2-48c4-baad-e0719e524350" />
      </body>
      <title>Building Software Factories - Factories 201</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,655dc4b7-30d2-48c4-baad-e0719e524350.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,655dc4b7-30d2-48c4-baad-e0719e524350.aspx</link>
      <pubDate>Tue, 06 Mar 2007 10:36:48 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;b&gt;Factories 201 Series - Building Software Factories&lt;/b&gt; 
&lt;ul&gt;
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;What
      are they (concretely)?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;When
      would you build one?&lt;/a&gt;&amp;nbsp;(Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx"&gt;What
      do I&amp;nbsp;tell my Manager?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx"&gt;How
      long will it take?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
      would you build?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx"&gt;With
      what would you build it?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx"&gt;How
      would you build it?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx"&gt;What
      should you strive for?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/28/factories-201-what-are-the-challenges.aspx"&gt;What
      are the challenges?&lt;/a&gt; (Jezz)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   Post authors: &lt;a href="http://www.edwardbakker.nl"&gt;Edward Bakker&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/jezzsa"&gt;Jezz
   Santos&lt;/a&gt;. 
   &lt;hr&gt;
&lt;p&gt;
   Well, we have finally come to the end of this 201 series on ‘&lt;b&gt;Building Software
   Factories&lt;/b&gt;’. 
&lt;p&gt;
   &lt;u&gt;First time arriving here?&lt;/u&gt; - we have listed the entire series above – please
   have a look through those posts before ending it below. 
&lt;p&gt;
   If you are arriving here after reading (&lt;i&gt;hopefully all&lt;/i&gt;) the posts in the series,
   we wanted to say, good on you, and thanks for sticking it out with us. 
&lt;h3&gt;Series Wrap-Up
&lt;/h3&gt;
&lt;p&gt;
   Well, we have spent quite a bit of time and thought in putting this series together
   for you. The motivation behind this effort has been that we’ve recognised that there
   is little practical information helping ordinary professional developers on getting
   started with building and understanding software factories. We have had quite a head
   start on this and wanted to share our knowledge and experiences with you and the community
   to promote the uptake of building factories, which in turn should promote the adoption
   of software factories and the industrialisation of software in general. 
&lt;p&gt;
   This series was created in a format that asks a logical sequence of questions that
   you might have when trying to figure out how to build software factories today. We
   have covered many such issues as they arose and shared much of the combined knowledge
   and experiences built up over the last few years in this space. We will be sharing
   more resources on this in future posts – so stay tuned to our blogs. 
&lt;p&gt;
   We hope that you can take the guidance represented in this series forward as a starting
   point for developing your own software factories further. We recognise openly and
   frankly in the series that this is not a trivial undertaking today, but hopefully
   we have shown you that it is very possible and how to successfully approach it. Hopefully
   we have also directed you to what’s most important, where you should direct your energies,
   and how to build factories practically and realistically. 
&lt;h3&gt;Your Feedback
&lt;/h3&gt;
&lt;p&gt;
   One of the primary objectives of this series was to connect with many more of you
   in the community and share ideas and innovations about everyone’s efforts at building
   factories today. 
&lt;p&gt;
   We have received a small number of comments to this series so far, which we have been
   keen to discuss at length, and hope we have done a good job at answering the questions
   appropriately. Hopefully, there are many more of you out there building factories,
   or at least considering building them, and so we hope to hear more from all of you
   on that. Please drop us a comment on the appropriate post and we will work hard to
   get you an answer you will find useful. 
&lt;p&gt;
   If we are doing a good job please let us know. If we are doing a poor job and you
   don’t like the guidance we are giving please let us know that also. This should shape
   any future guidance we give the community in this space, and at least we can start
   further discussions with those of you in this space. Hopefully, we will also get a
   feel for just how many of you are out there are in this space. 
&lt;h3&gt;The Final Say
&lt;/h3&gt;
&lt;p&gt;
   There should now be a little more information out there to help you build a software
   factory right now on the Microsoft platform with the current toolsets. This series
   was created exactly for that purpose to share with you the experiences we have had
   in building factories and give you insights into the issues we have faced on this
   road already. 
&lt;p&gt;
   As more and more people jump into this space we expect to see from the community more
   detailed, formal guidance on this subject, so that the community as a whole can learn
   from previous experiences and elevate the adoption and the application of software
   factories to real world projects. 
&lt;p&gt;
   After all we think that the act of building a software factory should leverage the
   tenants that software factories promote themselves, i.e. &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;“Package domain expertise and guidance in a form that others can re-use and manipulate
   to create solutions using simplified descriptions of the problem at hand.”&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Hopefully we have done a good job of that for you, and hopefully you will consider
   the experiences we have shared in this series in your factory building efforts. 
&lt;h3&gt;Come see us...
&lt;/h3&gt;
&lt;p align=justify&gt;
   &lt;a href="http://go.microsoft.com/?linkid=1865553"&gt;&lt;img alt="Tech Ed Bloggers" src="http://techedbloggers.net/Images/Flair/teched07_120X90_v2w.jpg" align=right border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   We are proud to announce that we will be presenting a session on ‘&lt;b&gt;&lt;u&gt;Real World:
   Building Software Factories&lt;/u&gt;&lt;/b&gt;’ at &lt;a href="http://www.microsoft.com/events/teched2007/default.mspx"&gt;Tech-Ed
   2007&lt;/a&gt; in June this year.
&lt;/p&gt;
&lt;p align=left&gt;
   The 300 level session will contain material from this series and demos and examples
   of other factories to explain the concepts. We would love to meet up with you there
   and answer your factory building questions. 
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   Many Thanks, &lt;a href="http://blogs.msdn.com/jezzsa"&gt;Jezz Santos&lt;/a&gt; and &lt;a href="http://www.edwardbakker.nl"&gt;Edward
   Bakker&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=655dc4b7-30d2-48c4-baad-e0719e524350" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,655dc4b7-30d2-48c4-baad-e0719e524350.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=610855c7-0047-46ba-ae4a-a455a48dec2b</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=610855c7-0047-46ba-ae4a-a455a48dec2b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
      Previous posts in the <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">Factory
      201</a> series: 
   </p>
        <ul>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">What
         are they (concretely)?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">When
         would you build one?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx">What
         do I tell my Manager?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx">How
         long will it take?</a> (Jezz) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
         would you build?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx">With
         what would you build it?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx">How
         would you build it?</a> (Jezz) 
      </li>
        </ul>
        <hr align="center" width="100%" size="2" />
        <p>
      After reading all of our previous posts (don’t tell me you skipped one!) we know <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">what</a> automated
      assets to build, which <a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx">tools
      and technologies</a> to use and <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx">how</a> to
      build a factory. The final step here will focus on the quality attributes we have
      to keep in mind during the design and development of our factory in order to make
      it a stunning success! In other words, “<b>What should we strive for?</b>” when building
      our factories? 
   </p>
        <p>
        </p>
        <h3>Abstraction
   </h3>
        <p>
      In a previous post “<a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx">With
      what would you build it?</a>” we already mentioned the power of using abstractions
      in our factory. Let’s dig in this a little further and see why abstraction is definitely
      the top thing we should strive for! 
   </p>
        <h5>
          <strong>Increased Productivity</strong>
        </h5>
        <p>
      One of the advantages of using abstractions in our software factory is significantly
      increased productivity. We can think of an abstraction as a simplified representation
      of a specific problem. In fact, we are probably using abstractions in our job as a
      developer or architect every day. (i.e. 4G programming languages, class diagrams,
      API’s, class libraries, frameworks, DSL’s etc.) 
   </p>
        <p>
      Think about it, for example, if we build a helper class to perform a specific task
      (say: logging to a file) we are actually using abstraction. We create a class and
      some methods that simplify the details of logging, file management, rolling-over,
      naming, log details and formats etc. Once we have the helper class in place we can
      just re-use the helper class using some basic parameters without focussing on the
      details of how it works anymore. We solved our problem more simply by creating the
      helper class. 
   </p>
        <p>
      Now, let’s elaborate on this a little further. Suppose we only use this helper class
      in certain circumstances of a particular type of solution, let’s say only for certain
      components of a particular application. In this case, we don’t use or need all the
      possible parameters of the helper class (because we only use it in a certain way in
      this context), and let’s say we identify 5 different cases of use, each with different
      parameter values. Now we can build another higher-level helper class that wraps the
      original helper class, and defines only one parameter which describes one of our 5
      cases – perhaps an enumeration. Our new helper class is now an abstraction of the
      older helper class – because it simplified its usage in this particular context. Typically,
      this new level of helper class becomes part of a framework for those types of applications,
      because we have made certain types of assumptions about how the helper class is to
      be used. 
   </p>
        <blockquote>
          <p>
            <i>[To clarify this, using abstraction for simplifying a problem is something we see
      all time. For example, take ADO.NET that hides a lot of the low level details that
      are needed to communicate with a SQL Server database. On top of that we have Enterprise
      Library that adds another abstraction level to make data access even more straight
      forward. In the future, ADO.NET vNext and the Entity Framework will do an another
      attempt to raise the level of abstraction for “data programming”]</i>
          </p>
        </blockquote>
        <p>
      As we continue to build up the levels of abstraction, you can see that we can solve
      more specific problems at less level of detail, and also by using a higher level description
      or language. If we can get close to a point where we can provide these abstractions
      in terms of the specific problem we are solving, we are making it real easy to program
      our application (based on minimal information). This is where productivity is gained. 
   </p>
        <h5>
          <strong>Abstraction Roadmap</strong>
        </h5>
        <p>
      When developing a solution you can think of many abstractions, when you add modelling
      and automation to this picture the possibilities for abstraction build upon each other
      vastly: 
   </p>
        <p>
      Platform API’s → Application API’s →Helper Functions →Class Libraries → Frameworks
      → Domain Models → Software Factories 
   </p>
        <p>
      Each of the abstractions denoted above increases the level of abstraction of the problem
      you are solving, and in each case also narrows the domain of the solution you are
      providing for – this is the simplification part. I am sure it’s obvious to you that
      using a domain model to configure an application is far quicker than writing programming
      API’s to describe the same thing. 
   </p>
        <p>
      The other key point here is that I can configure my application in terms of high
      level things that make sense to that application and not in the low level details
      of the API’s. This means that those using the domain model now don’t need to be programmers
      they can have higher level skill-sets like solution design, requirements gathering
      and interpretation etc. By raising the level of abstractions we are moving from a
      physical design (platform API’s) to a logical design (domain model) that exposes less
      details and is understandable for a much wider audience. 
   </p>
        <h3>Automated Guidance
   </h3>
        <p>
      Another very important aspect we have to keep in mind during the development of our
      factory is the level of automated guidance we expose to our factory users. In our
      post “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
      would you build?</a>” we have already discussed the different types of automation
      assets that we might want to use in our factory but we have make sure we use them
      in their most effective way. 
   </p>
        <h5>
          <strong>Remove Mundane Tasks</strong>
        </h5>
        <p>
      A top quality attribute (from a developer’s perspective) for using our factory would
      be to provide automated assets that remove the rote and menial tasks from the factory
      user’s ToDo list. At best remove these types of duties completely from the developers
      ToDO list. We as solution developers, often have some predictable boring tasks that
      we have to do over and over again. By exposing automated assets for these types of
      tasks we save our factory users from completing these mundane and in-variable tasks
      and let them focus on the variable and more exciting design aspects of the solution
      they are building. Our factory users will definitely love us for that! 
   </p>
        <h5>
          <strong>Transfer Domain Knowledge</strong>
        </h5>
        <p>
      The design of our automated assets must ensure they capture knowledge and experiences
      and can be used to make that knowledge available for others. Using the example of
      a DSLs’ domain model which holds the knowledge about the underlying solution domain
      and how it can be and should be manipulated. By using the DSL, the user is presented
      with all the knowledge of how to describe the domain, the parts and relationships
      of that domain, and the description of the pieces within it. 
   </p>
        <p>
      The important part of this is that the domain model helps the user to figure out the
      key parts (concepts) in the domain. The domain model (and designer in case of the
      DSL) guides the user through the process of modelling a solution for the problem by
      using concepts that make sense to him. In fact, the user learns the domain and the
      important concepts of it but also how to provide a solution by using these abstractions. 
   </p>
        <h5>
          <strong>Enforce Compliance and Completeness</strong>
        </h5>
        <p>
      When we design the automated assets (and factory as a whole) we encapsulate the architecture
      of the factory product in the domain model that is used by the factory – this is the
      model of the product. 
   </p>
        <p>
      We can build automation assets to populate or configure the product model and in this
      way ensure compliance with the implicit architecture of the product. Because these
      models have configuration to address their variance, validation can be used explicitly
      to ensure the factory user has not configured parts of it incorrectly with respect
      to the whole solution. 
   </p>
        <p>
      Automation assets can also be used to examine the model, check for completeness and
      use that information to guide the factory user in his next steps he needs to execute
      in the factory to complete the product. 
   </p>
        <h5>
          <strong>Full Automation vs. Flexibility</strong>
        </h5>
        <p>
      When designing our automated assets we have to keep in mind to keep them limited and
      focused on one particular concern. It doesn’t make sense to build a huge fully automated
      asset that covers multiple concerns and generates a lot of unrelated artefacts (i.e.
      source code and configuration files). It also doesn’t make sense to build a DSL that
      tries to model to world. If we expose a number of small, highly focussed automation
      assets we have a much more flexible factory because we can, for example, change the
      order in which we manipulate the assets, combine them or even decide not to use some
      automation assets at all to better meet the requirements for the product we have to
      build. 
   </p>
        <p>
      However, if we go too far with variability and refining our abstractions and automated
      assets to a more detailed level we might end up with a factory that is less productive
      because there are more “moving parts” that needs to be configured which also increases
      the complexity of using the factory. 
   </p>
        <p>
      Finding a balance between full automation and flexibility is absolutely key here! 
   </p>
        <h3>Usability
   </h3>
        <p>
      Because we are so busy developing our software factory we might forget that building
      a fully fledged and super cool software factory that generates the perfect product
      isn’t enough to make everyone want to use it. In the end it is often the factory user
      that has a huge influence in the adoption of our software factory. This means we have
      to make it cool to use the thing and make it flexible and intuitive enough to use
      and improve the experience of building solutions in this domain with it! 
   </p>
        <p>
      You don’t want people to discard you factory because it too hard to use, or discover
      how to use effectively. Don’t assume they will read the manual! 
   </p>
        <h5>
          <strong>Promote Adoption</strong>
        </h5>
        <p>
      Another thing we have to keep in mind during the development of our factory is the
      fact that the factory is likely to be used by other less-skilled and less-knowledgeable
      developers than the ones that building the factory. They might not even have to be
      developers! This means, we might have an issue here in convincing other development
      teams to adopt the factory and use that instead of their existing tools, frameworks
      and utilities they are so familiar with. Or worse, have built themselves! 
   </p>
        <p>
      To get our factory adopted by our audience we have to lower the bar for them to start
      using the factory. Of course there are multiple ways to achieve this and they will
      probably differ dependent on the organization structure we are working in. Suppose
      we are working in an organization where the factory is build by a dedicated team that
      is known by the several project teams responsible for delivering products. In this
      example, the factory team can support the project teams in the start up phase of their
      project to get familiar with the factory and makes sure the project team gets up to
      speed on using the factory real quick. Once the factory is adopted by the project
      team responsible for building the product, the factory authoring team can start collecting
      the feedback from this team to enhance the factory and increase the usability of the
      factory even better. You see this in the process described in “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx">How
      would you build it?</a>” 
   </p>
        <h5>
          <strong>Role Sensitivity</strong>
        </h5>
        <p>
      A software factory, just like any other development tool, is potentially used by a
      lot of project team members (factory users). i.e. Developers, Architects, Testers,
      User Experience Engineers, Technical Writers etc. To get the full potential from our
      factory, and factory users, we must make sure the factory targets the audience that
      is supposed to use the factory in the way they want to use it. In other words before
      we start developing our factory we need to know what types of users we expect for
      our factory. Do we only target architects, developers, testers or is it a mix of these
      types of users that we are aiming at? 
   </p>
        <p>
      Why is it important to know the factory users? Well, each type of user is interested
      in a different set of concerns and views of those concerns (In factory terminology
      this is called a ViewPoint). For example, an architect might only be interested in
      the high level view of the system design while the developer is interested in much
      more technical details. 
   </p>
        <p>
      Once we know our audience, and those who we are building the factory for, we can attempt
      to provide them with the right tools, views and level of abstraction to support them
      do their job in the best possible way and be more productive when using the factory. 
   </p>
        <h3>Customization
   </h3>
        <p>
      Software development is rapidly changing. New technologies, new paradigms happen almost
      every day. To be successful in software development we have to keep up with these
      changes, and therefore our software factory has to too! 
   </p>
        <p>
      In our post “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx">How
      long will it take?</a>” we have seen that our factory only start to pay back after
      we have used it for greater than ~5 times, so we better make sure we can customize
      our factory very easily to meet evolving requirements and additional product variants.
      This is exactly why we have an iterative development cycle as defined by “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx">How
      would you build it?</a>” 
   </p>
        <p>
      One of the key requirements of any development tool like a factory is to be flexible
      enough to address as many use scenarios and development environments as possible.
      Otherwise its’ use is limited. There are two aspects of customization worth noting
      here: 
   </p>
        <h5>
          <strong>Factory Customization</strong>
        </h5>
        <p>
      Firstly, there is customization of the factory itself, usually to accommodate a change
      in architecture or change in variability of the existing architecture that the factory
      models. This is hard to accommodate if the factory itself presents a closed programming
      interface. However, this can be accommodated by defining good extensible infrastructures
      to the architecture so that those using the factory can easily customize it to add
      or remove features or variability that the factory presents. We see this most when
      ‘horizontal factories’ are customized to suit certain vertical scenarios, where variability
      in most cases wants to be predefined, and fixed, and therefore requires removal from
      the user experience of the factory. 
   </p>
        <p>
      As an example. Consider a (horizontal) factory that builds web services. If I want
      to ‘verticalise’ this factory and customise it to suit building certain types of financial
      web services, then it’s likely that for financial web services, I want to pre-define
      certain Operations Contracts and Data Contracts to use. The Operation and Data Contracts
      are one point of variability of the horizontal factory, and the horizontal factory
      provides assets to allow the user to configure them. Now that I want to customise
      this factory to make a new verticalised version that is financial services based,
      I want to be able to say that the Operation and Data Contracts are fixed to certain
      industry standards, and no longer configurable by the factory user. 
   </p>
        <h5>
          <strong>Product Customization</strong>
        </h5>
        <p>
      Secondly, there is customization of the automation assets used to create the product
      itself. Typically, the scenario here is that you want to alter the automation assets
      used to transform the model of the product into a physical solution. 
   </p>
        <p>
      As an example. Consider a factory that generates source code as its final product.
      The source code is determined by the factory in code templates, which are used to
      transfer the models of the factory into a physical solution. So consider, that the
      generated code does not agree with you in some way. Often, this needs to be changed
      to suit an organisations’ coding standards, or include some organisations standard
      copyright header, or perhaps you want to change the code that is output because you
      have a more optimal way to write the solution. 
   </p>
        <h3>Extensibility &amp; Composability
   </h3>
        <p>
      One of the key issues of building factories is in providing the right guidance and
      solutions to varying requirements. Creating a factory for a large domain increases
      the chance that the guidance it offers is limited in addressing wider usage scenarios. 
   </p>
        <p>
      For example, consider a factory that builds web services. This factory is likely at
      some point to define a mapping of the web service’s logical architecture to source
      code artefacts. In doing that, the factory itself will have to make decisions about
      what patterns and technologies to use to do that. The assumptions it makes to do that
      may not be valid for all cases, and it is such cases that may prohibit the use of
      the factory at all, if the factory user cannot customize or influence how that is
      done. In smaller domains the chances of meeting this issue are smaller, because the
      possible solutions are smaller in number. However, even in smaller domains, there
      can be several solutions that apply to different circumstances. This means that larger
      domains need to be composed of smaller domains, where each smaller domain could be
      swapped out for a different implementation. 
   </p>
        <h5>
          <strong>Composite Factories</strong>
        </h5>
        <p>
      In order to practically achieve this we need to be able to compose larger domains
      from smaller domains, and have the domains interact with each other. Furthermore we
      need to be able to potentially swap-out each domain with a different implementation. 
   </p>
        <p>
      In factories, this can be achieved by providing extensibility mechanisms that accommodate
      plugging in and out various other factories to provide the sub-domains. We call these
      sub-domain factories ‘<a href="http://en.wikipedia.org/wiki/Factorette">factorettes</a>’.
      These extensibility points are key for expanding the use of your factory, so others
      could provide alternative implementations for the pieces of you factory to suit their
      needs. 
   </p>
        <p>
      One such use of this is to provide specific technology implementations or strategies
      for implementation such as the ‘<a href="http://msdn2.microsoft.com/en-us/library/aa905331.aspx">EFx
      Factory’</a> does, so that factory users can pick and chose which technology to use
      to implement the Service Contract or Data Mapping layers, for example. Of course you
      can choose many other aspects to make extensible in your factory apart from technology.
      Perhaps you want to allow other factories to provide better views of a part of a domain,
      or provide better implementations of it as well. 
   </p>
        <h3>Summary
   </h3>
   In this post we tried to list the important quality attributes for software factories.
   Building factories isn’t (only) about using the available technologies to build some
   automated stuff that is just cool. We have to realize that we need to take special
   care to ensure the factory is useful for our users, improves their productivity and
   adds value to help them deliver high quality products. <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=610855c7-0047-46ba-ae4a-a455a48dec2b" /></body>
      <title>Factories 201 - What should you strive for?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx</link>
      <pubDate>Tue, 27 Feb 2007 08:24:05 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   Previous posts in the &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;Factory
   201&lt;/a&gt; series: 
&lt;ul&gt;
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;What
      are they (concretely)?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;When
      would you build one?&lt;/a&gt;&amp;nbsp;(Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx"&gt;What
      do I&amp;nbsp;tell my Manager?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx"&gt;How
      long will it take?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
      would you build?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx"&gt;With
      what would you build it?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx"&gt;How
      would you build it?&lt;/a&gt; (Jezz) 
   &lt;/li&gt;
&lt;/ul&gt;
&lt;hr align=center width="100%" size=2&gt;
&lt;p&gt;
   After reading all of our previous posts (don’t tell me you skipped one!) we know &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;what&lt;/a&gt; automated
   assets to build, which &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx"&gt;tools
   and technologies&lt;/a&gt; to use and &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx"&gt;how&lt;/a&gt; to
   build a factory. The final step here will focus on the quality attributes we have
   to keep in mind during the design and development of our factory in order to make
   it a stunning success! In other words, “&lt;b&gt;What should we strive for?&lt;/b&gt;” when building
   our factories? 
&lt;p&gt;
&lt;h3&gt;Abstraction
&lt;/h3&gt;
&lt;p&gt;
   In a previous post “&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx"&gt;With
   what would you build it?&lt;/a&gt;” we already mentioned the power of using abstractions
   in our factory. Let’s dig in this a little further and see why abstraction is definitely
   the top thing we should strive for! 
&lt;h5&gt;&lt;strong&gt;Increased Productivity&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   One of the advantages of using abstractions in our software factory is significantly
   increased productivity. We can think of an abstraction as a simplified representation
   of a specific problem. In fact, we are probably using abstractions in our job as a
   developer or architect every day. (i.e. 4G programming languages, class diagrams,
   API’s, class libraries, frameworks, DSL’s etc.) 
&lt;/p&gt;
&lt;p&gt;
   Think about it, for example, if we build a helper class to perform a specific task
   (say: logging to a file) we are actually using abstraction. We create a class and
   some methods that simplify the details of logging, file management, rolling-over,
   naming, log details and formats etc. Once we have the helper class in place we can
   just re-use the helper class using some basic parameters without focussing on the
   details of how it works anymore. We solved our problem more simply by creating the
   helper class. 
&lt;p&gt;
   Now, let’s elaborate on this a little further. Suppose we only use this helper class
   in certain circumstances of a particular type of solution, let’s say only for certain
   components of a particular application. In this case, we don’t use or need all the
   possible parameters of the helper class (because we only use it in a certain way in
   this context), and let’s say we identify 5 different cases of use, each with different
   parameter values. Now we can build another higher-level helper class that wraps the
   original helper class, and defines only one parameter which describes one of our 5
   cases – perhaps an enumeration. Our new helper class is now an abstraction of the
   older helper class – because it simplified its usage in this particular context. Typically,
   this new level of helper class becomes part of a framework for those types of applications,
   because we have made certain types of assumptions about how the helper class is to
   be used. &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;[To clarify this, using abstraction for simplifying a problem is something we see
   all time. For example, take ADO.NET that hides a lot of the low level details that
   are needed to communicate with a SQL Server database. On top of that we have Enterprise
   Library that adds another abstraction level to make data access even more straight
   forward. In the future, ADO.NET vNext and the Entity Framework will do an another
   attempt to raise the level of abstraction for “data programming”]&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   As we continue to build up the levels of abstraction, you can see that we can solve
   more specific problems at less level of detail, and also by using a higher level description
   or language. If we can get close to a point where we can provide these abstractions
   in terms of the specific problem we are solving, we are making it real easy to program
   our application (based on minimal information). This is where productivity is gained. 
&lt;h5&gt;&lt;strong&gt;Abstraction Roadmap&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   When developing a solution you can think of many abstractions, when you add modelling
   and automation to this picture the possibilities for abstraction build upon each other
   vastly: 
&lt;p&gt;
   Platform API’s → Application API’s →Helper Functions →Class Libraries → Frameworks
   → Domain Models → Software Factories 
&lt;p&gt;
   Each of the abstractions denoted above increases the level of abstraction of the problem
   you are solving, and in each case also narrows the domain of the solution you are
   providing for – this is the simplification part. I am sure it’s obvious to you that
   using a domain model to configure an application is far quicker than writing programming
   API’s to describe the same thing. 
&lt;p&gt;
   The other key point here is that&amp;nbsp;I can configure my application in terms of high
   level things that make sense to that application and not in the low level details
   of the API’s. This means that those using the domain model now don’t need to be programmers
   they can have higher level skill-sets like solution design, requirements gathering
   and interpretation etc. By raising the level of abstractions we are moving from a
   physical design (platform API’s) to a logical design (domain model) that exposes less
   details and is understandable for a much wider audience. 
&lt;h3&gt;Automated Guidance
&lt;/h3&gt;
&lt;p&gt;
   Another very important aspect we have to keep in mind during the development of our
   factory is the level of automated guidance we expose to our factory users. In our
   post “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
   would you build?&lt;/a&gt;” we have already discussed the different types of automation
   assets that we might want to use in our factory but we have make sure we use them
   in their most effective way. 
&lt;h5&gt;&lt;strong&gt;Remove Mundane Tasks&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   A top quality attribute (from a developer’s perspective) for using our factory would
   be to provide automated assets that remove the rote and menial tasks from the factory
   user’s ToDo list. At best remove these types of duties completely from the developers
   ToDO list. We as solution developers, often have some predictable boring tasks that
   we have to do over and over again. By exposing automated assets for these types of
   tasks we save our factory users from completing these mundane and in-variable tasks
   and let them focus on the variable and more exciting design aspects of the solution
   they are building. Our factory users will definitely love us for that! 
&lt;h5&gt;&lt;strong&gt;Transfer Domain Knowledge&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   The design of our automated assets must ensure they capture knowledge and experiences
   and can be used to make that knowledge available for others. Using the example of
   a DSLs’ domain model which holds the knowledge about the underlying solution domain
   and how it can be and should be manipulated. By using the DSL, the user is presented
   with&amp;nbsp;all the knowledge of how to describe the domain, the parts and relationships
   of that domain, and the description of the pieces within it. 
&lt;p&gt;
   The important part of this is that the domain model helps the user to figure out the
   key parts (concepts) in the domain. The domain model (and designer in case of the
   DSL) guides the user through the process of modelling a solution for the problem by
   using concepts that make sense to him. In fact, the user learns the domain and the
   important concepts of it but also how to provide a solution by using these abstractions. 
&lt;h5&gt;&lt;strong&gt;Enforce Compliance and Completeness&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   When we design the automated assets (and factory as a whole) we encapsulate the architecture
   of the factory product in the domain model that is used by the factory – this is the
   model of the product. 
&lt;p&gt;
   We can build automation assets to populate or configure the product model and in this
   way ensure compliance with the implicit architecture of the product. Because these
   models have configuration to address their variance, validation can be used explicitly
   to ensure the factory user has not configured parts of it incorrectly with respect
   to the whole solution. 
&lt;p&gt;
   Automation assets can also be used to examine the model, check for completeness and
   use that information to guide the factory user in his next steps he needs to execute
   in the factory to complete the product. 
&lt;h5&gt;&lt;strong&gt;Full Automation vs. Flexibility&lt;/strong&gt; 
&lt;/h5&gt;
&lt;p&gt;
   When designing our automated assets we have to keep in mind to keep them limited and
   focused on one particular concern. It doesn’t make sense to build a huge fully automated
   asset that covers multiple concerns and generates a lot of unrelated artefacts (i.e.
   source code and configuration files). It also doesn’t make sense to build a DSL that
   tries to model to world. If we expose a number of small, highly focussed automation
   assets we have a much more flexible factory because we can, for example, change the
   order in which we manipulate the assets, combine them or even decide not to use some
   automation assets at all to better meet the requirements for the product we have to
   build. 
&lt;p&gt;
   However, if we go too far with variability and refining our abstractions and automated
   assets to a more detailed level we might end up with a factory that is less productive
   because there are more “moving parts” that needs to be configured which also increases
   the complexity of using the factory. 
&lt;p&gt;
   Finding a balance between full automation and flexibility is absolutely key here! 
&lt;h3&gt;Usability
&lt;/h3&gt;
&lt;p&gt;
   Because we are so busy developing our software factory we might forget that building
   a fully fledged and super cool software factory that generates the perfect product
   isn’t enough to make everyone want to use it. In the end it is often the factory user
   that has a huge influence in the adoption of our software factory. This means we have
   to make it cool to use the thing and make it flexible and intuitive enough to use
   and improve the experience of building solutions in this domain with it! 
&lt;p&gt;
   You don’t want people to discard you factory because it too hard to use, or discover
   how to use effectively. Don’t assume they will read the manual! 
&lt;h5&gt;&lt;strong&gt;Promote Adoption&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   Another thing we have to keep in mind during the development of our factory is the
   fact that the factory is likely to be used by other less-skilled and less-knowledgeable
   developers than the ones that building the factory. They might not even have to be
   developers! This means, we might have an issue here in convincing other development
   teams to adopt the factory and use that instead of their existing tools, frameworks
   and utilities they are so familiar with. Or worse, have built themselves! 
&lt;p&gt;
   To get our factory adopted by our audience we have to lower the bar for them to start
   using the factory. Of course there are multiple ways to achieve this and they will
   probably differ dependent on the organization structure we are working in. Suppose
   we are working in an organization where the factory is build by a dedicated team that
   is known by the several project teams responsible for delivering products. In this
   example, the factory team can support the project teams in the start up phase of their
   project to get familiar with the factory and makes sure the project team gets up to
   speed on using the factory real quick. Once the factory is adopted by the project
   team responsible for building the product, the factory authoring team can start collecting
   the feedback from this team to enhance the factory and increase the usability of the
   factory even better. You see this in the process described in “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx"&gt;How
   would you build it?&lt;/a&gt;” 
&lt;h5&gt;&lt;strong&gt;Role Sensitivity&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   A software factory, just like any other development tool, is potentially used by a
   lot of project team members (factory users). i.e. Developers, Architects, Testers,
   User Experience Engineers, Technical Writers etc. To get the full potential from our
   factory, and factory users, we must make sure the factory targets the audience that
   is supposed to use the factory in the way they want to use it. In other words before
   we start developing our factory we need to know what types of users we expect for
   our factory. Do we only target architects, developers, testers or is it a mix of these
   types of users that we are aiming at? 
&lt;p&gt;
   Why is it important to know the factory users? Well, each type of user is interested
   in a different set of concerns and views of those concerns (In factory terminology
   this is called a ViewPoint). For example, an architect might only be interested in
   the high level view of the system design while the developer is interested in much
   more technical details. 
&lt;p&gt;
   Once we know our audience, and those who we are building the factory for, we can attempt
   to provide them with the right tools, views and level of abstraction to support them
   do their job in the best possible way and be more productive when using the factory. 
&lt;h3&gt;Customization
&lt;/h3&gt;
&lt;p&gt;
   Software development is rapidly changing. New technologies, new paradigms happen almost
   every day. To be successful in software development we have to keep up with these
   changes, and therefore our software factory has to too! 
&lt;p&gt;
   In our post “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx"&gt;How
   long will it take?&lt;/a&gt;” we have seen that our factory only start to pay back after
   we have used it for greater than ~5 times, so we better make sure we can customize
   our factory very easily to meet evolving requirements and additional product variants.
   This is exactly why we have an iterative development cycle as defined by “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/17/factories-201-how-would-you-build-it.aspx"&gt;How
   would you build it?&lt;/a&gt;” 
&lt;p&gt;
   One of the key requirements of any development tool like a factory is to be flexible
   enough to address as many use scenarios and development environments as possible.
   Otherwise its’ use is limited. There are two aspects of customization worth noting
   here: 
&lt;h5&gt;&lt;strong&gt;Factory Customization&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   Firstly, there is customization of the factory itself, usually to accommodate a change
   in architecture or change in variability of the existing architecture that the factory
   models. This is hard to accommodate if the factory itself presents a closed programming
   interface. However, this can be accommodated by defining good extensible infrastructures
   to the architecture so that those using the factory can easily customize it to add
   or remove features or variability that the factory presents. We see this most when
   ‘horizontal factories’ are customized to suit certain vertical scenarios, where variability
   in most cases wants to be predefined, and fixed, and therefore requires removal from
   the user experience of the factory. 
&lt;p&gt;
   As an example. Consider a (horizontal) factory that builds web services. If I want
   to ‘verticalise’ this factory and customise it to suit building certain types of financial
   web services, then it’s likely that for financial web services, I want to pre-define
   certain Operations Contracts and Data Contracts to use. The Operation and Data Contracts
   are one point of variability of the horizontal factory, and the horizontal factory
   provides assets to allow the user to configure them. Now that I want to customise
   this factory to make a new verticalised version that is financial services based,
   I want to be able to say that the Operation and Data Contracts are fixed to certain
   industry standards, and no longer configurable by the factory user. 
&lt;h5&gt;&lt;strong&gt;Product Customization&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   Secondly, there is customization of the automation assets used to create the product
   itself. Typically, the scenario here is that you want to alter the automation assets
   used to transform the model of the product into a physical solution. 
&lt;p&gt;
   As an example. Consider a factory that generates source code as its final product.
   The source code is determined by the factory in code templates, which are used to
   transfer the models of the factory into a physical solution. So consider, that the
   generated code does not agree with you in some way. Often, this needs to be changed
   to suit an organisations’ coding standards, or include some organisations standard
   copyright header, or perhaps you want to change the code that is output because you
   have a more optimal way to write the solution. 
&lt;h3&gt;Extensibility &amp;amp; Composability
&lt;/h3&gt;
&lt;p&gt;
   One of the key issues of building factories is in providing the right guidance and
   solutions to varying requirements. Creating a factory for a large domain increases
   the chance that the guidance it offers is limited in addressing wider usage scenarios. 
&lt;p&gt;
   For example, consider a factory that builds web services. This factory is likely at
   some point to define a mapping of the web service’s logical architecture to source
   code artefacts. In doing that, the factory itself will have to make decisions about
   what patterns and technologies to use to do that. The assumptions it makes to do that
   may not be valid for all cases, and it is such cases that may prohibit the use of
   the factory at all, if the factory user cannot customize or influence how that is
   done. In smaller domains the chances of meeting this issue are smaller, because the
   possible solutions are smaller in number. However, even in smaller domains, there
   can be several solutions that apply to different circumstances. This means that larger
   domains need to be composed of smaller domains, where each smaller domain could be
   swapped out for a different implementation. 
&lt;h5&gt;&lt;strong&gt;Composite Factories&lt;/strong&gt;
&lt;/h5&gt;
&lt;p&gt;
   In order to practically achieve this we need to be able to compose larger domains
   from smaller domains, and have the domains interact with each other. Furthermore we
   need to be able to potentially swap-out each domain with a different implementation. 
&lt;p&gt;
   In factories, this can be achieved by providing extensibility mechanisms that accommodate
   plugging in and out various other factories to provide the sub-domains. We call these
   sub-domain factories ‘&lt;a href="http://en.wikipedia.org/wiki/Factorette"&gt;factorettes&lt;/a&gt;’.
   These extensibility points are key for expanding the use of your factory, so others
   could provide alternative implementations for the pieces of you factory to suit their
   needs. 
&lt;p&gt;
   One such use of this is to provide specific technology implementations or strategies
   for implementation such as the ‘&lt;a href="http://msdn2.microsoft.com/en-us/library/aa905331.aspx"&gt;EFx
   Factory’&lt;/a&gt; does, so that factory users can pick and chose which technology to use
   to implement the Service Contract or Data Mapping layers, for example. Of course you
   can choose many other aspects to make extensible in your factory apart from technology.
   Perhaps you want to allow other factories to provide better views of a part of a domain,
   or provide better implementations of it as well. 
&lt;h3&gt;Summary
&lt;/h3&gt;
In this post we tried to list the important quality attributes for software factories.
Building factories isn’t (only) about using the available technologies to build some
automated stuff that is just cool. We have to realize that we need to take special
care to ensure the factory is useful for our users, improves their productivity and
adds value to help them deliver high quality products. &lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=610855c7-0047-46ba-ae4a-a455a48dec2b" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,610855c7-0047-46ba-ae4a-a455a48dec2b.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=880184af-39ca-4b13-a886-bd358b6ff600</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=880184af-39ca-4b13-a886-bd358b6ff600</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
      Previous posts in the Factory 201 series: 
   </p>
        <ul>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">What
         are they (concretely)?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">When
         would you build one?</a> (Jezz) 
      </li>
          <li>
            <a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx">What
         do I tell my Manager?</a> (Edward) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx">How
         long will it take?</a> (Jezz) 
      </li>
          <li>
            <a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
         would you build?</a> (Jezz) 
      </li>
        </ul>
        <hr align="center" width="100%" size="2" />
        <p>
      To continue the thread of actually creating your factory, in this post we will answer the
      question "<b>With what would you build it?</b>" We will discuss the software factory
      enabling technologies available today (on the Microsoft platform) and don’t speculate
      about possible future tooling. In our previous post “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
      would you build?</a>” we discussed <b>what</b> we would build for our factory, and
      now we will see <b>how</b> that is mapped and addresses by specific technologies<b>.</b></p>
        <p>
      Let's have a look at some tooling and technologies and see how we can use that
      to build our software factories, starting today.    
   </p>
        <h3>Automated Actions
   </h3>
        <p>
      Today's generations of software factories, like the ones available from <a href="http://msdn.microsoft.com/practices/">Microsoft
      p&amp;p</a>, are primarily composed of a related set of automated
      activities (called recipes) that encapsulate a huge amount of best practices and
      domain expertise. The recipes often represent repetitive development and design
      tasks which result in generated source code or configuration files to help
      accelerate the development of our factory product. Let’s find out what tooling we
      can use to build these automated activities and how we can expose these, so called
      recipes, to our factory users. 
   </p>
        <p>
          <strong>
            <font size="2">Guidance Automation Toolkit/Extensions</font>
          </strong>
        </p>
        <p>
      The <a href="http://msdn2.microsoft.com/en-us/architecture/aa718948.aspx">Guidance
      Automation Toolkit</a> (GAT) is a toolkit that simplifies the development of automated
      actions into re-usable assets and provides mechanisms to make these assets available to
      architects and developers using Visual Studio. To accomplish this, GAT leverages
      the Guidance Automation Extensions (GAX) which is actually a runtime environment that
      expands the capabilities of Visual Studio and makes it easier to integrate and run
      automate tasks from the Visual Studio environment. So, we are actually using
      GAT and GAX together to build and run recipes and deploy them as guidance packages.
      ehhh...? Now what are recipes and guidance packages? 
   </p>
        <p>
          <u>Recipes</u>
        </p>
        <p>
      Think of a recipe as set of automated instructions, called actions that
      together represent a specific automated activity or task. These actions are relatively
      small units of work and can be anything from creating a file, getting the value of
      a registry key or return the name of the currently selected project within
      a Visual Studio solution. 
   </p>
        <p>
      A recipe is defined in an XML file in a predefined structure that
      is interpreted by GAX at runtime. GAX supports invoking wizards for a recipe to gather
      user input that can be used as variables during the execution of the recipe to create
      variability in the artefacts the recipe outputs or configures. For example, a wizard
      can prompt the user to select a file location, ask for a name of a file that gets
      generated or ask the user to select items from a list. Recipes that don’t require
      user input can gather the variables from the environment to use in the same way. Recipes
      also can provide a convenient means of giving the user feedback about the actions
      being performed. 
   </p>
        <p>
      We can build recipes using GAT, it provides us with a special solution template in
      Visual Studio to author recipes, it comes with predefined solution structure, example
      actions and recipes and other utilities that give us a head start in building
      our own recipes and wizards. 
   </p>
        <p>
          <u>Guidance Package</u>
        </p>
        <p>
      A Guidance Package is an installable Visual Studio package that contains a collection
      of recipes (and some their support classes like, converters, value providers, etc.)
      and is basically our deployment mechanism for the recipes that we built and want
      to expose in our software factory. In fact, the current generation of software factories
      as we see today are for the most part simply implemented as pure guidance packages. 
   </p>
        <p>
      That leaves us with another question: "how do we build a guidance package"? Again,
      this is where GAT comes in. Actually, GAT is a guidance package itself that helps
      architects and developers build guidance packages. Once we are done developing
      and testing our guidance package we can create a Windows installer package (MSI)
      and distribute our guidance package to our users. 
   </p>
        <p>
      Unfortunately, building and testing guidance packages (recipes) isn't as straightforward
      as we want it to be. For example, building recipes basically comes down to hacking
      in XML files and isn't supported by any graphical designers. Also the documentation is
      still limited. This makes the learning curve for developing guidance packages a little
      steep. 
   </p>
        <h3>Artefact Templates &amp; Generation
   </h3>
        <p>
      As said, some of the automated activities in our software factory will possibly
      result in one or more generated artefacts for our solution. These artefacts
      can be anything in the range from source code, XML files or a piece
      of documentation. To support this kind of artefact generation in our software factory
      we can use text templates (also referred to as "T4" templates) and the Text
      Templating Engine. This technology is included in GAT but also
      in the DSL Tools which we will discuss a little later in this post. 
   </p>
        <p>
      A text template is basically a text file that contains the (boilerplate) text you
      want to generate (i.e. C#/VB.NET code, XML, text etc.) that is mixed with control
      markers (&lt;#, #&gt;) and control blocks. The text between the markers is evaluated
      and provides the dynamic behaviour to the text template. Control blocks are used to
      control the processing flow of our templates. In other words they determine what text
      is output and how the Text Templating Engine navigates over a provided object model.
      This works very similar to how classic ASP work where you could combine server side
      directives with the raw HTML code. 
   </p>
        <p>
      Below an example of a T4 template that comes from Service Factory. The text between
      the markers (in bold) is evaluated and mixed with the static text in the template. 
   </p>
        <p>
        </p>
        <p>
        </p>
        <p>
        </p>
        <p>
          <font color="#000080">namespace</font>
          <strong>
            <font color="#ff0000">&lt;#=</font>
          </strong>
          <font color="#ff8000">ServiceImplementationNamespace</font>
          <strong>
            <font color="#ff0000">#&gt;</font>
          </strong>
        </p>
        <p>
      { 
   </p>
        <p>
         [<font color="#0080c0">System.Web.Services.WebService</font>(Namespace
      = <strong>"<font color="#ff0000">&lt;#=</font></strong><font color="#ff8000">ServiceContractNamespac<strong>e</strong></font><strong><font color="#ff0000">#&gt;</font></strong>",
      Name = <strong>"<font color="#ff0000">&lt;#=</font></strong><font color="#ff8000">ServiceImplementation</font><strong><font color="#ff0000">#&gt;</font></strong>")] 
   </p>
        <p>
         [<font color="#0080c0">System.Web.Services.WebServiceBindingAttribute</font>(ConformsTo
      = <font color="#0080c0">System.Web.Services.WsiProfiles.BasicProfile1_1</font>, EmitConformanceClaims
      = <font color="#000080">true</font>)] 
   </p>
        <p>
          <font color="#0000ff">   </font>
          <font color="#000080">public class</font>
          <strong>
            <font color="#ff0000">&lt;#=</font>
          </strong>
          <font color="#ff8000">ServiceImplementation</font>
          <strong>
            <font color="#ff0000">#&gt;</font>
          </strong> : <strong><font color="#ff0000">&lt;#=</font></strong><font color="#ff8000">ServiceContractInterfaceNamespace</font><strong></strong><font color="#ff0000">#&gt;</font>.<font color="#ff0000">&lt;#=</font><font color="#ff8000">ServiceContractInterface</font><font color="#ff0000">#&gt;</font></p>
        <p>
         { 
   </p>
        <p>
         } 
   </p>
        <p>
      } 
   </p>
        <p>
      The most powerful feature of text templates is that they can be invoked from recipes and they
      can receive variables from our recipes. In this way we can build recipes that collect
      input from our users or factory environment and use that as input in our text templates
      to generate artefacts. 
   </p>
        <p>
      A major advantage of using text templates as a means to generate artefacts is that
      they can be customized very easily, typically to reformat the textual output or enhance
      it in some way (perhaps to suit an organisations coding standards for example). Text
      templates are deployed as plain text files so it is straight forward to customize
      them. 
   </p>
        <p>
      The fact that text templates are so easy to customise makes them perfectly suited
      for an iterative development approach. We can start with a “hard coded” copy of the
      desired output and we can identify the variability points in the code. We can then
      pass some arguments to the template and from that point we can add control blocks
      to parameterize it and hook into the underlying argument’s object models. One disadvantage
      of a text template is the lack of designer support like syntax colouring (we added
      the colouring in the example manually) and intellisense. This makes writing and maintaining
      large text templates a bit ’un-guided’. 
   </p>
        <h3>Solution &amp; Project Templates
   </h3>
        <p>
      As we saw in “<a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx">What
      would you build?</a>” we can use the solution structure to provide guidance on how
      to physically relate the artefacts that represent the product of our factory. Unfortunately,
      defining this (physical) structure is often challenging because of the struggle to
      define both the deployment model and the logical architectural model of the product
      in this single structure. Today, the solution structure is all we have (Solution Explorer),
      so let’s have a look how we can implement predefined solution structures in our factories
      to describe the physical structure (deployment) of the product. 
   </p>
        <blockquote>
          <p>
            <i>[The logical architecture is best left to another separate view, which as we will
      see later we can provide with deep Visual Studio integration]</i>
          </p>
        </blockquote>
        <p>
      Solution structures are captured in so called Visual Studio Templates (*.vstemplate
      files) that are written in XML and are expanded by the Visual Studio template engine.
      Visual Studio 2005 now supports the creation and packaging of these templates. However,
      these templates are by default static, and require a separate mechanism to gather
      variables from the user or environment to enhance them with dynamic values. As it
      happens, GAT has just that mechanism, and can bind recipes and wizards to these templates. 
   </p>
        <p>
      Let's have a look how we can use this mechanism with GAT to ‘unfold’ certain
      types of templates: 
   </p>
        <ul>
          <li>
            <b>Solution templates.</b> These templates unfold an initial Visual Studio solution
         file (*.sln) and structure that could represent the entire physical structure of the
         product of our factory. 
      </li>
          <li>
            <b>Project templates.</b> These templates unfold a project (*.csproj, *.vbproj etc.)
         within an existing solution. 
      </li>
          <li>
            <b>Item templates.</b> These templates unfold new project items such as a class files,
         XML files or any other valid project item.</li>
        </ul>
        <p>
      One of the primary features of GAT is automating the creation of the solution structure.
      GAT accomplishes this by hooking into the VS template mechanism. This means recipes
      are allowed to participate in the template unfolding so they can, for example, collect
      input from the user to customize the names of the template artefacts and take additional
      actions to further configure the created solution items. For example, write some settings
      to a app.config file. A perfect example of this is demonstrated in <a href="http://codeplex.com/servicefactory">Service
      Factory</a> where the user is prompted to provide the name of the service, which is
      then used in the naming of the solution and projects within the solution. We have
      now discussed GAT and recipes, and learned they are perfectly suited for automating
      tasks and providing initial solution structures. Let’s look at providing abstractions
      to our factory and enhancing the design experience and productivity of automating
      solution assembly. Recipes with wizards often do form a visual abstraction of the
      underlying part of the product they are automating, but this abstraction is lost when
      the wizard completes. Let’s have a look at Domain Specific Languages and the DSL Tools
      and see how they can help enhance that experience and increase the level of abstraction
      represented in our factory. 
   </p>
        <h3>Domain Specific Languages
   </h3>
        <p>
      A Domain Specific Language is a custom language that targets a specific
      domain and helps us describe the problem by using concepts that make sense for the
      target domain. But how would we build one? This is where the <a href="http://msdn2.microsoft.com/en-us/architecture/aa718368.aspx">DSL
      Tools</a> come to rescue. We can use The DSL Tools, (part of VS SDK), to define
      our domain model and easily represent that domain model with a graphical designer.
      Together, the domain model and the graphical designer form our DSL that we can
      integrate into our software factory.   
   </p>
        <blockquote>
          <p>
            <i>[You can also provide a textual representation of your language instead of visually,
      but this is not supported currently out-of-the-box with the DSL Tools yet, unless
      you are prepared to define that language in XML.]</i>
          </p>
        </blockquote>
        <p>
      The DSL Tools also supports artefact generation using T4 templates which means we
      can write templates that generate (source code) artefacts directly from models we
      created in our DSL. The DSL Tools is just everything we need to build Domain Specific
      Languages today. 
   </p>
        <p>
          <strong>How would we use the DSL Tools?</strong>
        </p>
        <p>
      So, how would we use the DSL Tools to build a DSL for our factory? Would we build
      one big DSL and designer that covers the complete product? The answer to this question
      is probably NO. Although our factory only targets one product (with several variants
      maybe!) it is likely that the scope of the domain is too broad to fit in just one
      designer (view). Therefore, we probably want to build a DSL that only targets
      one concern, component or aspect in our software factory.  For example,
      we can use a DSL to model a piece of the architecture of the product that is
      build in our factory or use a DSL to model one of the work products
      (logical components) in our factory. In this case both DSL's help us presenting the
      right level of abstraction to our factory user for each of the sub-problems we
      identified in our factory. 
   </p>
        <p>
      But wait…, we have to make it very clear why we state to keep the scope of the DSL
      (domain model) limited to only one concern or piece of architecture. In fact, we can
      think of examples, like the <a href="http://blogs.msdn.com/jezzsa/archive/2006/05/27/608873.aspx">factory
      schema</a>, that are represented in a ‘larger’ domain model. Mostly, this is because
      off a limitation in the current technology. The current release of the DSL Tools only
      supports one view per domain model. In other words, the view that is exposed in our
      DSL is tightly coupled to the domain model. In future releases of the DSL Tools this
      limitation will disappear which means we can define multiple views with each view
      exposing only a part of a, possibly larger, domain model (like the factory schema).
      Please note that this doesn’t mean we have to build huge domain models in the future,
      but it will give us more flexibility in our domain model (DSL) design. 
   </p>
        <blockquote>
          <p>
            <i>[You can find more information on how to use DSL’s in the context of software factories
      in the article ‘</i>
            <a href="http://www.architecturejournal.net/2006/issue9/F1_Bare/">
              <i>Bare
      Naked Languages or What Not To Model</i>
            </a>
            <i>’ from </i>
            <a href="http://blogs.msdn.com/jackgr/">
              <i>Jack
      Greenfield</i>
            </a>
            <i>]</i>
          </p>
        </blockquote>
        <p>
      Another important limitation of the current DSL tools is that there is no easy way
      to reference elements in one domain model with those in another, so stitching together
      domain models to fit larger domains is also challenging. However, there are DSL Power
      Toys soon to be released called ‘DSL Integration Service’ that enable that cross-referencing. 
   </p>
        <p>
      Another thing to keep in mind is that we don't have to start with a DSL in our
      factory from the very first beginning. It is absolutely possible that an asset that
      is implemented as a GAT recipe in a first iteration of our factory evolves in a DSL
      in one of the next iterations of our factory development cycle. 
   </p>
        <p>
          <u>DSL Advantages</u>
        </p>
        <p>
      An important advantage of a DSL in our factory is providing a simplified view (abstraction)
      of the problem domain and to help us to provide architectural guidance in assembling
      that part. By using specific languages we can present our factory users with the right
      level of abstraction and use the designer as a way to provide context for our actions
      and the artefacts we are delivering from our factory. Recipes can also be applied
      to these designers to manipulate the underlying domain model, and automate the configuration
      and creating of the elements in these models. 
   </p>
        <p>
      The domain model that is introduced by the DSL (and stored on disk) can be validated
      and evaluated to determine the progress, validity and completeness of the product
      we are building. The domain model also provides us with a means to introduce “state”
      in our factory. We can generate artefacts over and over again for our populated
      domain model, something we can't do easily with just code generating recipes, where
      we have to populate the wizards with the necessary information on every run. 
   </p>
        <p>
      A very good example of the usage of a DSL, together with recipes is in the EFx
      Software Factory, which can be seen <a href="http://blogs.msdn.com/photos/jezzsa/images/677134/original.aspx">here</a>. 
   </p>
        <p>
          <u>DSL Challenges</u>
        </p>
        <p>
      So, if Domain Specific Languages can add value to our software factories, why haven't
      we seen them in many factories yet? We think the answer to this question is easy.
      The reason for that is the lack of "out of the box" integration between GAT and the
      DSL Tools. Currently, it is hard to use model information in our GAT recipes, without
      writing the custom code to support this ourselves. Luckily this scenario will be supported
      soon by means of a DSL Power Toy that becomes available.   
   </p>
        <blockquote>
          <p>
            <i>[A more complete description of Domain Specific Languages, the Microsoft DSL Tools,
      together with an example of an 'real life' DSL can be found in </i>
            <a href="http://www.code-magazine.com/Article.aspx?quickid=0607051">
              <i>this
      article</i>
            </a>
            <i>]</i>
          </p>
        </blockquote>
        <h3>Integrated Design Experiences
   </h3>
        <p>
      The technologies that we discussed so far are first class citizens in Microsoft's
      software factory offering. However, there are more technologies, which are not
      dedicated “software factory tools”, that can add enormous value to our software
      factories. 
   </p>
        <p>
      Be warned, these technologies are a little more difficult to use than those described
      earlier. 
   </p>
        <p>
          <strong>Tool-Windows and Custom Editors</strong>
        </p>
        <p>
      One of the things we will notice when we are building software factories is that there
      will be situations where the decoupled GAT/GAX and DSL Tools features simply don't
      provide the experience we need. For example, we might want to provide a
      more integrated user experience for our factory users and decide that we need
      to provide the user with a larger view of the factory product. 
   </p>
        <p>
      To support this product view we might want to build custom tool-windows or specific
      editors. An example of this can be seen in the EFx Factory that hosts a custom
      tool-window that provides a ’<a href="http://blogs.msdn.com/photos/jezzsa/images/677147/original.aspx">Product
      Explorer</a>’ view for the factory in addition to the default ‘Solution Explorer’
      view. 
   </p>
        <p>
      We may want to enhance views with the use of customer editors that provide different
      abstractions and increase the productivity of modifying the view. An example of that
      can be seen <a href="http://www.edwardbakker.nl/PermaLink,guid,11ab1f38-75aa-4ce2-8fc7-ff950b745aa9.aspx">here</a> where
      we built a custom tool-window to maintain hierarchical data within a DSL. 
   </p>
        <p>
      It's good to know that we can use the <a href="http://www.microsoft.com/downloads/details.aspx?familyid=7e0fdd66-698a-4e6a-b373-bd0642847ab7&amp;displaylang=en">VS
      SDK</a> for all that. This SDK provides us with utilities and documentation that
      explains, for example, how to build a tool-window and hook that in Visual Studio.
      The bad part of this is that creating Visual Studio extensions like this isn't
      always as straight forward as we like it to be. Besides, building just the tool-window
      (or editor) isn't enough; we also have to make sure it integrates with GAX
      or the DSL Tools. Unfortunately this isn't something that is described in
      great detail anywhere so we are on our own in implementing this.  
   </p>
        <p>
      If you are interested in this type of integration you better make sure you have the <a href="http://msdn2.microsoft.com/en-us/library/bb187352(VS.80).aspx">VS
      SDK documentation</a> ready and find your way to the <a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=78&amp;SiteID=1">GAT</a>, <a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&amp;siteid=1">DSL
      Tools</a> and <a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=57&amp;SiteID=1">Visual
      Studio Extensibility</a> forums! 
   </p>
        <h3>Distributed Application and System Designers 
   </h3>
        <p>
      One means of providing a high level view of your product is to leverage the ‘<a href="http://msdn2.microsoft.com/en-us/library/ms379582(VS.80).aspx">Distributed
      Application and Systems Designers</a>’ that come with the ‘<a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718804.aspx">Visual
      Studio Team Edition for Software Architects’</a>. These designers, although currently
      geared to deployment, provide a useful view of applications which can be composed
      into larger black box systems. If your factory targets the domain of applications
      represented on this design surface, this should be a natural choice for leveraging
      in describing your product, rather than creating DSL’s which duplicate this functionality. 
   </p>
        <p>
      Unfortunately, integrating with these designers today is very challenging, although
      it is possible to provide custom shapes using the <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718757.aspx">SDM
      SDK</a> (part of the VS SDK). Integrating recipes and solution templates into these
      designers is more of a commitment and currently not officially supported since this
      requires integration with a non-public API. However it is possible to a large degree,
      as demonstrated by the EFx Factory <a href="http://blogs.msdn.com/photos/jezzsa/images/677127/original.aspx">here</a>.
      Where you can ‘drill into’ the applications on these diagrams and expose DSL’s containing
      the inner workings of the applications. You can also ‘Implement’ these shapes by using
      custom GAT project templates. 
   </p>
        <p>
      In the future, this type of integration will become a lot easier and integration between
      these designers and GAT and other DSL’s will be a better experience for factory builders.
      This will provide many factories the capability for top-down solution design. 
   </p>
        <h3>Summary
   </h3>
        <p>
      In this post we have discussed the relevant technologies that we can use to build
      automation assets for real life software factories today. We haven't talked about
      technical details, issues, missing features, etc. which of course are there.
      The technologies are still in their early days and scenarios for software factory
      use are still maturing. The learning curve is steep now, and that will definitely
      become easier in the coming years. However, it is absolutely possible to build some very
      good factories with the above described technologies. So, if you are interested in
      factories you better start looking at these technologies right away!  
   </p>
        <p>
      Now that you know what to do, and what technologies to use for that, the next post
      in this series “<i><u>How would you build it?</u></i>” addresses how to put all these
      assets together in a process of assembling your factory. 
   </p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=880184af-39ca-4b13-a886-bd358b6ff600" />
      </body>
      <title>Factories 201 - With what would you build it?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx</link>
      <pubDate>Tue, 13 Feb 2007 11:26:46 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   Previous posts in the Factory 201 series: 
&lt;ul&gt;
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;What
      are they (concretely)?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;When
      would you build one?&lt;/a&gt;&amp;nbsp;(Jezz) 
   &lt;li&gt;
      &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx"&gt;What
      do I&amp;nbsp;tell my Manager?&lt;/a&gt; (Edward) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/02/factories-201-how-long-will-it-take.aspx"&gt;How
      long will it take?&lt;/a&gt; (Jezz) 
   &lt;li&gt;
      &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
      would you build?&lt;/a&gt; (Jezz) 
   &lt;/li&gt;
&lt;/ul&gt;
&lt;hr align=center width="100%" size=2&gt;
&lt;p&gt;
   To continue the thread of actually creating your factory, in this post we will answer&amp;nbsp;the
   question "&lt;b&gt;With what would you build it?&lt;/b&gt;" We will discuss the software factory
   enabling technologies available today (on the Microsoft platform) and don’t speculate
   about possible future tooling.&amp;nbsp;In our previous post “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
   would you build?&lt;/a&gt;” we discussed &lt;b&gt;what&lt;/b&gt; we would build for our factory, and
   now we will see &lt;b&gt;how&lt;/b&gt; that is mapped and addresses by specific technologies&lt;b&gt;.&lt;/b&gt; 
&lt;p&gt;
   Let's have a look&amp;nbsp;at some tooling and technologies and see how we can use that
   to build our software factories, starting today. &amp;nbsp;&amp;nbsp; 
&lt;h3&gt;Automated Actions
&lt;/h3&gt;
&lt;p&gt;
   Today's generations of software factories, like the ones available from &lt;a href="http://msdn.microsoft.com/practices/"&gt;Microsoft
   p&amp;amp;p&lt;/a&gt;,&amp;nbsp;are&amp;nbsp;primarily&amp;nbsp;composed of a&amp;nbsp;related set of automated
   activities (called recipes) that encapsulate a huge amount of&amp;nbsp;best practices&amp;nbsp;and
   domain expertise. The recipes&amp;nbsp;often represent repetitive development and design
   tasks which result&amp;nbsp;in&amp;nbsp;generated source code or configuration files to help
   accelerate the development of our factory product. Let’s find out what tooling we
   can use to build these automated activities and how we can expose these, so called
   recipes, to our factory users. 
&lt;p&gt;
   &lt;strong&gt;&lt;font size=2&gt;Guidance Automation Toolkit/Extensions&lt;/font&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   The &lt;a href="http://msdn2.microsoft.com/en-us/architecture/aa718948.aspx"&gt;Guidance
   Automation Toolkit&lt;/a&gt; (GAT) is a toolkit that simplifies the development of automated
   actions into re-usable assets and provides mechanisms to make these assets available&amp;nbsp;to
   architects and developers using Visual Studio. To accomplish this, GAT&amp;nbsp;leverages
   the Guidance Automation Extensions (GAX)&amp;nbsp;which is actually a runtime environment&amp;nbsp;that
   expands the capabilities of Visual Studio and makes it easier to integrate and run
   automate tasks from the Visual Studio environment.&amp;nbsp;So, we are actually using
   GAT and GAX together to build and run recipes and deploy them as guidance packages.
   ehhh...?&amp;nbsp;Now what are recipes and guidance packages? 
&lt;p&gt;
   &lt;u&gt;Recipes&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
   Think of a&amp;nbsp;recipe&amp;nbsp;as set of automated instructions, called actions that
   together represent a specific automated activity or task. These&amp;nbsp;actions are relatively
   small units of work and can be anything from creating a file, getting the value of
   a registry key or return the name&amp;nbsp;of the currently&amp;nbsp;selected project within
   a&amp;nbsp;Visual Studio solution. 
&lt;p&gt;
   A recipe&amp;nbsp;is&amp;nbsp;defined in an XML file in&amp;nbsp;a predefined&amp;nbsp;structure that
   is interpreted by GAX at runtime. GAX supports invoking wizards for a recipe to gather
   user input that can be used as variables during the execution of the recipe to create
   variability in the artefacts the recipe outputs or configures. For example, a wizard
   can prompt the user to select a file location, ask for a name of a file that gets
   generated or ask the user to select items from a list. Recipes that don’t require
   user input can gather the variables from the environment to use in the same way. Recipes
   also can provide a convenient means of giving the user feedback about the actions
   being performed. 
&lt;p&gt;
   We can build recipes using GAT, it provides us with a special solution template in
   Visual Studio to author recipes, it comes with predefined solution structure, example
   actions and&amp;nbsp;recipes and other utilities that give us a head start in&amp;nbsp;building
   our own recipes and wizards. 
&lt;p&gt;
   &lt;u&gt;Guidance Package&lt;/u&gt; 
&lt;/p&gt;
&lt;p&gt;
   A Guidance Package is an installable Visual Studio package that contains a collection
   of recipes (and some their support classes like, converters, value providers, etc.)
   and is basically our deployment mechanism for the recipes that we&amp;nbsp;built and want
   to expose in our software factory. In fact, the current generation of software factories
   as we see today are&amp;nbsp;for the most part simply implemented as pure guidance packages. 
&lt;p&gt;
   That leaves us with another question: "how do we build a guidance package"? Again,
   this is where GAT&amp;nbsp;comes in. Actually, GAT is a guidance package itself that helps
   architects&amp;nbsp;and developers build guidance packages. Once we are done developing
   and testing our&amp;nbsp;guidance package we can create a Windows installer package (MSI)
   and distribute our guidance package&amp;nbsp;to our users. 
&lt;p&gt;
   Unfortunately, building and testing guidance packages (recipes) isn't as straightforward
   as we want it to be. For example, building recipes basically comes down&amp;nbsp;to hacking
   in XML files&amp;nbsp;and isn't supported by any graphical designers. Also&amp;nbsp;the documentation&amp;nbsp;is
   still limited. This makes the learning curve for developing guidance packages a little
   steep. 
&lt;h3&gt;Artefact Templates &amp;amp; Generation
&lt;/h3&gt;
&lt;p&gt;
   As said, some&amp;nbsp;of&amp;nbsp;the automated activities in our software factory will&amp;nbsp;possibly
   result in one or more generated&amp;nbsp;artefacts&amp;nbsp;for&amp;nbsp;our solution. These artefacts
   can be anything in the range from&amp;nbsp;source code,&amp;nbsp;XML files&amp;nbsp;or a piece
   of documentation. To support this kind of artefact generation in our software factory
   we can&amp;nbsp;use text templates (also referred to as "T4" templates)&amp;nbsp;and the Text
   Templating Engine.&amp;nbsp;This&amp;nbsp;technology is included in&amp;nbsp;GAT&amp;nbsp;but also
   in the DSL Tools which we will discuss&amp;nbsp;a little later in this post. 
&lt;p&gt;
   A text template is basically a text file that contains the (boilerplate) text you
   want to generate (i.e. C#/VB.NET code, XML, text etc.) that is mixed with control
   markers (&amp;lt;#, #&amp;gt;) and control blocks. The text between the markers is evaluated
   and provides the dynamic behaviour to the text template. Control blocks are used to
   control the processing flow of our templates. In other words they determine what text
   is output and how the Text Templating Engine navigates over a provided object model.
   This works very similar to how classic ASP work where you could combine server side
   directives with the raw HTML code. 
&lt;p&gt;
   Below an example of a T4 template that comes from Service Factory. The text between
   the markers (in bold) is evaluated and mixed with the static text in the template. 
&lt;p&gt;
&lt;p&gt;
&lt;p&gt;
&lt;p&gt;
   &lt;font color=#000080&gt;namespace&lt;/font&gt; &lt;strong&gt;&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;/strong&gt;&lt;font color=#ff8000&gt;ServiceImplementationNamespace&lt;/font&gt;&lt;strong&gt; &lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt;&lt;/strong&gt; 
&lt;p&gt;
   { 
&lt;p&gt;
   &amp;nbsp;&amp;nbsp; [&lt;font color=#0080c0&gt;System.Web.Services.WebService&lt;/font&gt;(Namespace
   = &lt;strong&gt;"&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;/strong&gt;&lt;font color=#ff8000&gt;ServiceContractNamespac&lt;strong&gt;e&lt;/strong&gt;&lt;/font&gt;&lt;strong&gt; &lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt;&lt;/strong&gt;",
   Name = &lt;strong&gt;"&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;/strong&gt;&lt;font color=#ff8000&gt;ServiceImplementation&lt;/font&gt;&lt;strong&gt; &lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt;&lt;/strong&gt;")] 
&lt;p&gt;
   &amp;nbsp;&amp;nbsp; [&lt;font color=#0080c0&gt;System.Web.Services.WebServiceBindingAttribute&lt;/font&gt;(ConformsTo
   = &lt;font color=#0080c0&gt;System.Web.Services.WsiProfiles.BasicProfile1_1&lt;/font&gt;, EmitConformanceClaims
   = &lt;font color=#000080&gt;true&lt;/font&gt;)] 
&lt;p&gt;
   &lt;font color=#0000ff&gt;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font color=#000080&gt;public class&lt;/font&gt; &lt;strong&gt;&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;/strong&gt;&lt;font color=#ff8000&gt;ServiceImplementation&lt;/font&gt;&lt;strong&gt; &lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt;&lt;/strong&gt; : &lt;strong&gt;&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;/strong&gt;&lt;font color=#ff8000&gt;ServiceContractInterfaceNamespace&lt;/font&gt;&lt;strong&gt; &lt;/strong&gt;&lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt;.&lt;font color=#ff0000&gt;&amp;lt;#=&lt;/font&gt; &lt;font color=#ff8000&gt;ServiceContractInterface&lt;/font&gt; &lt;font color=#ff0000&gt;#&amp;gt;&lt;/font&gt; 
&lt;p&gt;
   &amp;nbsp;&amp;nbsp; { 
&lt;p&gt;
   &amp;nbsp;&amp;nbsp; } 
&lt;p&gt;
   } 
&lt;p&gt;
   The most powerful feature of text templates is that they can be invoked from recipes&amp;nbsp;and&amp;nbsp;they
   can receive variables from our recipes. In this way we can build recipes that collect
   input from our users or factory environment and use that as input in our text templates
   to generate artefacts. 
&lt;p&gt;
   A major advantage of using text templates as a means to generate artefacts is that
   they can be customized very easily, typically to reformat the textual output or enhance
   it in some way (perhaps to suit an organisations coding standards for example). Text
   templates are deployed as plain text files so it is straight forward to&amp;nbsp;customize
   them. 
&lt;p&gt;
   The fact that text templates are so easy to customise makes them perfectly suited
   for an iterative development approach. We can start with a “hard coded” copy of the
   desired output and we can identify the variability points in the code. We can then
   pass some arguments to the template and from that point we can add control blocks
   to parameterize it and hook into the underlying argument’s object models. One disadvantage
   of a text template is the lack of designer support like syntax colouring (we added
   the colouring in the example manually) and intellisense. This makes writing and maintaining
   large text templates a bit ’un-guided’. 
&lt;h3&gt;Solution &amp;amp; Project Templates
&lt;/h3&gt;
&lt;p&gt;
   As we saw in “&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/02/12/factories-201-what-would-you-build.aspx"&gt;What
   would you build?&lt;/a&gt;” we can use the solution structure to provide guidance on how
   to physically relate the artefacts that represent the product of our factory. Unfortunately,
   defining this (physical) structure is often challenging because of the struggle to
   define both the deployment model and the logical architectural model of the product
   in this single structure. Today, the solution structure is all we have (Solution Explorer),
   so let’s have a look how we can implement predefined solution structures in our factories
   to describe the physical structure (deployment) of the product. &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;[The logical architecture is best left to another separate view, which as we will
   see later we can provide with deep Visual Studio integration]&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Solution structures are captured in so called Visual Studio Templates (*.vstemplate
   files) that are written in XML and are expanded by the Visual Studio template engine.
   Visual Studio 2005 now supports the creation and packaging of these templates. However,
   these templates are by default static, and require a separate mechanism to gather
   variables from the user or environment to enhance them with dynamic values. As it
   happens, GAT has just that mechanism, and can bind recipes and wizards to these templates. 
&lt;p&gt;
   Let's have a look how we can use&amp;nbsp;this mechanism with GAT to ‘unfold’ certain
   types of templates: 
&lt;ul&gt;
   &lt;li&gt;
      &lt;b&gt;Solution templates.&lt;/b&gt; These templates unfold an initial Visual Studio solution
      file (*.sln) and structure that could represent the entire physical structure of the
      product&amp;nbsp;of our factory. 
   &lt;li&gt;
      &lt;b&gt;Project templates.&lt;/b&gt; These templates unfold a project (*.csproj, *.vbproj etc.)
      within an existing solution. 
   &lt;li&gt;
      &lt;b&gt;Item templates.&lt;/b&gt; These templates unfold new project items such as a class files,
      XML files or any other valid project item.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
   One of the primary features of GAT is automating the creation of the solution structure.
   GAT accomplishes this by hooking into the VS template mechanism. This means recipes
   are allowed to participate in the template unfolding so they can, for example, collect
   input from the user to customize the names of the template artefacts and take additional
   actions to further configure the created solution items. For example, write some settings
   to a app.config file. A perfect example&amp;nbsp;of&amp;nbsp;this is demonstrated in &lt;a href="http://codeplex.com/servicefactory"&gt;Service
   Factory&lt;/a&gt; where the user is prompted to provide the name of the service, which is
   then used in the naming of the solution and projects within the solution. We have
   now discussed GAT and recipes, and learned they are perfectly suited for automating
   tasks and providing initial solution structures. Let’s look at providing abstractions
   to our factory and enhancing the design experience and productivity of automating
   solution assembly. Recipes with wizards often do form a visual abstraction of the
   underlying part of the product they are automating, but this abstraction is lost when
   the wizard completes. Let’s have a look at Domain Specific Languages and the DSL Tools
   and see how they can help enhance that experience and increase the level of abstraction
   represented in our factory. 
&lt;h3&gt;Domain Specific Languages
&lt;/h3&gt;
&lt;p&gt;
   A&amp;nbsp;Domain Specific Language&amp;nbsp;is a custom language&amp;nbsp;that targets a specific
   domain and helps us&amp;nbsp;describe the problem by using concepts that make sense for&amp;nbsp;the
   target domain. But how would we build one? This is where the&amp;nbsp;&lt;a href="http://msdn2.microsoft.com/en-us/architecture/aa718368.aspx"&gt;DSL
   Tools&lt;/a&gt; come to rescue. We can use The DSL Tools, (part of VS SDK),&amp;nbsp;to define
   our domain model and&amp;nbsp;easily represent that domain model with a graphical designer.
   Together, the domain model and the graphical designer&amp;nbsp;form our DSL that we can
   integrate into our software factory. &amp;nbsp; &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;[You can also provide a textual representation of your language instead of visually,
   but this is not supported currently out-of-the-box with the DSL Tools yet, unless
   you are prepared to define that language in XML.]&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   The DSL Tools also supports artefact generation using T4 templates which means we
   can write templates that generate (source code) artefacts directly from models we
   created in our DSL. The DSL Tools is just everything we need to build Domain Specific
   Languages today. 
&lt;p&gt;
   &lt;strong&gt;How would we use the DSL Tools?&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   So, how would we use the DSL Tools to build a DSL for our factory? Would we build
   one big DSL and designer that covers the complete product? The answer to this question
   is probably NO. Although our factory only targets one product (with several variants
   maybe!) it is likely that the scope of the domain is too broad to fit in just one
   designer (view). Therefore,&amp;nbsp;we probably want to build a DSL that only targets
   one concern, component or aspect in&amp;nbsp;our software factory. &amp;nbsp;For example,
   we can use a DSL to&amp;nbsp;model a piece of the architecture of the product that is
   build in our factory&amp;nbsp;or use&amp;nbsp;a DSL to&amp;nbsp;model one of the work products
   (logical components) in our factory. In this case both DSL's help us presenting the
   right level of abstraction&amp;nbsp;to our factory user for each of the sub-problems we
   identified in our&amp;nbsp;factory. 
&lt;p&gt;
   But wait…, we have to make it very clear why we state to keep the scope of the DSL
   (domain model) limited to only one concern or piece of architecture. In fact, we can
   think of examples, like the &lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/05/27/608873.aspx"&gt;factory
   schema&lt;/a&gt;, that are represented in a ‘larger’ domain model. Mostly, this is because
   off a limitation in the current technology. The current release of the DSL Tools only
   supports one view per domain model. In other words, the view that is exposed in our
   DSL is tightly coupled to the domain model. In future releases of the DSL Tools this
   limitation will disappear which means we can define multiple views with each view
   exposing only a part of a, possibly larger, domain model (like the factory schema).
   Please note that this doesn’t mean we have to build huge domain models in the future,
   but it will give us more flexibility in our domain model (DSL) design. &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;[You can find more information on how to use DSL’s in the context of software factories
   in the article ‘&lt;/i&gt;&lt;a href="http://www.architecturejournal.net/2006/issue9/F1_Bare/"&gt;&lt;i&gt;Bare
   Naked Languages or What Not To Model&lt;/i&gt;&lt;/a&gt;&lt;i&gt;’ from &lt;/i&gt;&lt;a href="http://blogs.msdn.com/jackgr/"&gt;&lt;i&gt;Jack
   Greenfield&lt;/i&gt;&lt;/a&gt;&lt;i&gt;]&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Another important limitation of the current DSL tools is that there is no easy way
   to reference elements in one domain model with those in another, so stitching together
   domain models to fit larger domains is also challenging. However, there are DSL Power
   Toys soon to be released called ‘DSL Integration Service’ that enable that cross-referencing. 
&lt;p&gt;
   Another thing to keep in mind is that&amp;nbsp;we don't have to start with a DSL in our
   factory from the very first beginning. It is absolutely possible that an asset that
   is implemented as a GAT recipe in a first iteration of our factory evolves in a DSL
   in one of the next iterations of our factory development cycle. 
&lt;p&gt;
   &lt;u&gt;DSL Advantages&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
   An important advantage of a DSL in our factory is providing a simplified view (abstraction)
   of the problem domain and to help us to provide architectural guidance in assembling
   that part. By using specific languages we can present our factory users with the right
   level of abstraction and use the designer as a way to provide context for our actions
   and the artefacts we are delivering from our factory. Recipes can also be applied
   to these designers to manipulate the underlying domain model, and automate the configuration
   and creating of the elements in these models. 
&lt;p&gt;
   The domain model that is introduced by the DSL (and stored on disk) can be validated
   and evaluated to determine the progress, validity and completeness of the product
   we are building. The domain model also provides us with a means to introduce “state”
   in our factory. We can generate artefacts&amp;nbsp;over and over again for our populated
   domain model, something we can't do easily with just code generating recipes, where
   we have to populate the wizards with the necessary information on every run. 
&lt;p&gt;
   A&amp;nbsp;very good example of the usage of a DSL, together with recipes is in the EFx
   Software Factory, which can be seen &lt;a href="http://blogs.msdn.com/photos/jezzsa/images/677134/original.aspx"&gt;here&lt;/a&gt;. 
&lt;p&gt;
   &lt;u&gt;DSL Challenges&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
   So, if Domain Specific Languages can add value to our software factories, why haven't
   we seen them in many factories yet? We think the answer to this question is easy.
   The reason for that is the lack of "out of the box" integration between GAT and the
   DSL Tools. Currently, it is hard to use model information in our GAT recipes, without
   writing the custom code to support this ourselves. Luckily this scenario will be supported
   soon by means of a DSL Power Toy that becomes available. &amp;nbsp; &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;[A more complete description of Domain Specific Languages, the Microsoft DSL Tools,
   together with an example of an 'real life' DSL can be found in &lt;/i&gt;&lt;a href="http://www.code-magazine.com/Article.aspx?quickid=0607051"&gt;&lt;i&gt;this
   article&lt;/i&gt;&lt;/a&gt;&lt;i&gt;]&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h3&gt;Integrated Design Experiences
&lt;/h3&gt;
&lt;p&gt;
   The technologies that we discussed so far are first class citizens in&amp;nbsp;Microsoft's
   software factory offering. However, there are more technologies,&amp;nbsp;which are not
   dedicated “software factory tools”,&amp;nbsp;that can&amp;nbsp;add enormous value to our software
   factories. 
&lt;p&gt;
   Be warned, these technologies are a little more difficult to use than those described
   earlier. 
&lt;p&gt;
   &lt;strong&gt;Tool-Windows and Custom Editors&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
   One of the things we will notice when we are building software factories is that there
   will be situations where the decoupled GAT/GAX and DSL Tools features simply don't
   provide the experience we need. For example,&amp;nbsp;we might&amp;nbsp;want to provide a
   more integrated user experience for our factory&amp;nbsp;users and decide that we need
   to provide the user with&amp;nbsp;a larger view of the factory product. 
&lt;p&gt;
   To support this product view we might want to build custom tool-windows or specific
   editors. An example of this can be seen in the EFx Factory that hosts&amp;nbsp;a custom
   tool-window that provides a ’&lt;a href="http://blogs.msdn.com/photos/jezzsa/images/677147/original.aspx"&gt;Product
   Explorer&lt;/a&gt;’ view for the factory in addition to the default ‘Solution Explorer’
   view. 
&lt;p&gt;
   We may want to enhance views with the use of customer editors that provide different
   abstractions and increase the productivity of modifying the view. An example of that
   can be seen &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,11ab1f38-75aa-4ce2-8fc7-ff950b745aa9.aspx"&gt;here&lt;/a&gt; where
   we built a custom tool-window to maintain hierarchical data within a&amp;nbsp;DSL. 
&lt;p&gt;
   It's good to know that we can&amp;nbsp;use the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=7e0fdd66-698a-4e6a-b373-bd0642847ab7&amp;amp;displaylang=en"&gt;VS
   SDK&lt;/a&gt; for all that. This SDK provides us&amp;nbsp;with utilities and documentation that
   explains, for example, how to build a tool-window and hook that&amp;nbsp;in Visual Studio.
   The bad part&amp;nbsp;of this is that creating Visual Studio extensions like this isn't
   always as straight forward as we like it to be. Besides, building just the tool-window
   (or editor)&amp;nbsp;isn't enough; we also have to make sure&amp;nbsp;it integrates with GAX
   or the DSL Tools. Unfortunately this isn't something that&amp;nbsp;is described&amp;nbsp;in
   great detail&amp;nbsp;anywhere so we are on our&amp;nbsp;own in implementing this.&amp;nbsp; 
&lt;p&gt;
   If you are interested in this type of integration you better make sure you have the &lt;a href="http://msdn2.microsoft.com/en-us/library/bb187352(VS.80).aspx"&gt;VS
   SDK documentation&lt;/a&gt; ready and find your way to the &lt;a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=78&amp;amp;SiteID=1"&gt;GAT&lt;/a&gt;, &lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&amp;amp;siteid=1"&gt;DSL
   Tools&lt;/a&gt; and &lt;a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=57&amp;amp;SiteID=1"&gt;Visual
   Studio Extensibility&lt;/a&gt; forums! 
&lt;h3&gt;Distributed Application and System Designers&amp;nbsp;
&lt;/h3&gt;
&lt;p&gt;
   One means of providing a high level view of your product is to leverage the ‘&lt;a href="http://msdn2.microsoft.com/en-us/library/ms379582(VS.80).aspx"&gt;Distributed
   Application and Systems Designers&lt;/a&gt;’ that come with the ‘&lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718804.aspx"&gt;Visual
   Studio Team Edition for Software Architects’&lt;/a&gt;. These designers, although currently
   geared to deployment, provide a useful view of applications which can be composed
   into larger black box systems. If your factory targets the domain of applications
   represented on this design surface, this should be a natural choice for leveraging
   in describing your product, rather than creating DSL’s which duplicate this functionality. 
&lt;p&gt;
   Unfortunately, integrating with these designers today is very challenging, although
   it is possible to provide custom shapes using the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718757.aspx"&gt;SDM
   SDK&lt;/a&gt; (part of the VS SDK). Integrating recipes and solution templates into these
   designers is more of a commitment and currently not officially supported since this
   requires integration with a non-public API. However it is possible to a large degree,
   as demonstrated by the EFx Factory &lt;a href="http://blogs.msdn.com/photos/jezzsa/images/677127/original.aspx"&gt;here&lt;/a&gt;.
   Where you can ‘drill into’ the applications on these diagrams and expose DSL’s containing
   the inner workings of the applications. You can also ‘Implement’ these shapes by using
   custom GAT project templates. 
&lt;p&gt;
   In the future, this type of integration will become a lot easier and integration between
   these designers and GAT and other DSL’s will be a better experience for factory builders.
   This will provide many factories the capability for top-down solution design. 
&lt;h3&gt;Summary
&lt;/h3&gt;
&lt;p&gt;
   In this post we have discussed the relevant technologies that we can use to build
   automation assets for real life software factories today. We haven't talked about
   technical details, issues, missing features, etc. which&amp;nbsp;of course are there.
   The technologies are still in their early days and scenarios for software factory
   use are still maturing. The learning curve is&amp;nbsp;steep now, and that will definitely
   become easier in the coming years. However, it is absolutely possible to build some&amp;nbsp;very
   good factories with the above described technologies. So, if you are interested in
   factories you better start looking at these technologies right away!&amp;nbsp; 
&lt;p&gt;
   Now that you know what to do, and what technologies to use for that, the next post
   in this series “&lt;i&gt;&lt;u&gt;How would you build it?&lt;/u&gt;&lt;/i&gt;” addresses how to put all these
   assets together in a process of assembling your factory. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=880184af-39ca-4b13-a886-bd358b6ff600" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,880184af-39ca-4b13-a886-bd358b6ff600.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=72bf4bc3-15bb-4369-b9b3-6c98675313ea</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=72bf4bc3-15bb-4369-b9b3-6c98675313ea</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
      Previous posts in the Factories 201 series: 
   </p>
        <p>
          <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">What
      are they (concretely)?</a> (Edward) 
   </p>
        <p>
          <a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">When
      would you build one?</a> (Jezz) 
      <hr align="center" width="100%" size="2" /></p>
        <p>
      To continue the factory 201 series let's discuss a next question: <strong>What
      do I tell my manager?</strong> Or maybe, how do we explain the benefits of software
      factories to the management to justify moving to a software factories approach. 
   </p>
        <p>
      Before we ask the management to move to a software factories approach we have to explain
      what the value proposition of a software factory is, and what is to be gained from
      a software factory approach. As we all know, most managers are not interested in technical
      details so we have to focus on the topics that are important for them! However, the
      value that we can get from this approach requires a change in the way we develop software
      today, and this requires a firm commitment from management to achieve success with
      this approach. Let’s have a look. 
   </p>
        <blockquote>
          <p>
            <font size="2">
              <em>Please note that in this post I am using my own experiences from
      working for a System Integrator. These types of companies are building and using software
      factories in-house to deliver products for customers. Some of the topics I describe
      might be (slightly) different for other type of companies, for example for companies
      that build factories and sell them to their customers without using them in-house.</em>
            </font>
          </p>
        </blockquote>
        <h3>
          <strong>Value Proposition</strong>
        </h3>
        <p>
      The first step might be to tell them what a factory is, we can use the <a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx">“What
      are they (concretely)?”</a> post for that. The next step to get them really interested
      is to explain the benefits of software factories. 
   </p>
        <h4>Increase Productivity
   </h4>
        <p>
      Probably the easiest benefit to explain<strong></strong>is <strong>increase of productivity,
      decrease in cost</strong>. Factories automate parts of our development and design
      work and as a result of that the development team will be <strong>more productive</strong> during
      the development phase of the product, and that reduces development costs. But there
      is more! 
   </p>
        <h4>Predictable, Consistent Results
   </h4>
        <p>
      Factories will also <strong>standardize the product</strong> that is developed and
      therefore we need <strong>less time for design and proof of concepts</strong>.
      Another benefit is the <strong>improved and consistent quality</strong> of the product
      that is built by the factory. After all, the assets for the factory are built by domain
      experts and <b>remove the</b><strong>dependency on the very few highly skilled resources
      (sometimes referred to as ‘local heroes’)</strong> or over-resourced projects, to
      deliver the same high quality work.  A lot of companies are working on improving
      their software delivery process, reaching a certain <a href="http://en.wikipedia.org/wiki/CMMI">CMMI</a> levels and
      software factories can definitely help with that. 
   </p>
        <h4>Re-use of: Skills, Resources, Value
   </h4>
        <p>
      Factories use abstractions to simplify the development of solutions. They encapsulate
      domain specialist experiences and knowledge into the assets behind these abstractions.
      As a result of that we don’t need to constantly staff each project with very best
      domain experts, since the assets themselves contain the required experience to solve
      the problem for us in the best way. Basically, the factory provides a collection of
      domain skills and experience we can use on each project. These assets represent the
      actual captured value of our skilled resources. 
   </p>
        <p>
      Furthermore, it’s possible we can re-sell these assets to other companies who may
      also find getting skilled resources a challenge. 
   </p>
        <h4>Competitive Advantage
   </h4>
        <p>
      All of the above mentioned benefits are somewhat related to the product that is delivered
      from the factory, the resources we need for that and are mostly focused on the
      internal organization. Let’s have a look at some benefits that are recognized
      externally by investing in factories. 
   </p>
        <p>
      Software factories are hot and will probably become even hotter when they reach the
      larger community. This is obvious because the value proposition is so strong! Therefore
      companies can use the presence of software factories in <strong>marketing campaigns</strong>,
      and use them as a means to <strong>communicate their effectiveness and professionalism</strong> to
      their customers. They can <b>display their innovation</b> in this space and can use
      that in their recruitment activities to attract senior and skilled professionals. 
   </p>
        <h3>Resource Attainment
   </h3>
        <p>
      Of course, in the end, our company can also leverage the factory approach to help
      solving its own resource issues. We can use the best resources to do the most challenging
      work and actually built the software factories. In this way we continuously challenge
      these resources, instead of making them participate in ‘boring’ project work and ordinary
      tools, to make it more likely they will stick with the company. The less experienced
      resources can become the factory users and be way more productive as they were before. 
   </p>
        <h3>Commitments
   </h3>
        <p>
      Of course, after telling all of the above described benefits to our management
      they can't wait to adopt the software factories approach, but wait! There is more
      we have to tell them to make sure the adoption of software factories within our
      company has a fair chance to succeed. 
   </p>
        <h4>Dedicated Resources
   </h4>
        <p>
      We already discussed the requirement for dedicated resources in a previous post (<a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">“When
      would you build one?”</a>) but we cannot stress enough that you <b>have</b> to use
      the very best experienced, skilled architects and developers to build your factory.
      They have to be domain experts for the product the factory outputs but also have
      experience in software (tool) development in general. 
   </p>
        <p>
      However, we all know that the very best resources are the first resources to be pulled
      off a project and put on another. Since the value of factory assets (and therefore
      the factory as a whole) directly depend on these resources, it is critical they must
      not be removed from the factory development project. We all know, and so do the managers,
      that it’s our customers, market, and organizational culture who decide the allocation
      of our resources internally. To mitigate this we have to change these conditions to
      free ourselves from this powerful force to be able to keep these resources focused.
      The factory development project needs to be separated from the core business development
      projects, shipping ‘ordinary’ products, and requires a new organizational structure,
      cost structure, goals, culture and market to succeed. Management needs to support
      this. 
   </p>
        <h4>Return on Investment
   </h4>
        <p>
      Return on investment is about profit and growth and thus more important than anything
      in the world for our management. We have seen the benefits that factories can bring
      us but before the management is willing to invest in software factories
      they probably want to know how fast they get their return on investment. After all,
      why would they want to invest in something that never pays back? 
   </p>
        <p>
      As we have already seen in our "<a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx">When
      would you build one?</a>" post, we probably need to build more than ~5 products with
      a software factory before it pays back so we better make sure we invest in a factory
      that is likely to be used more than once. We will discuss <b>how and when</b> this
      investment is returned in one of our future posts <i><u>“How long will it take?”</u></i></p>
        <p>
      Of course, the expectations on the ROI will be different than the established expectations
      for existing ordinary product development. So, there again, this calls for a separate
      organizational structure with its own values on what to expect from the product the
      factory delivers. 
   </p>
        <h4>Not a Big-Bang Effort!
   </h4>
        <p>
      We have to make sure we keep the initial investment costs as low as possible. Therefore,
      trying to build a huge, fully featured factory from scratch in one attempt doesn't
      make sense, not only from a technical perspective but also from an investment perspective.
      We need to see a return on each iteration of the factory development. 
   </p>
        <p>
      To be successful, a progressive, iterative approach is preferred. The best thing you
      can do here is to start with small increments in automation of the product your factory
      creates. With each increment we identify the variable parts of the product and design
      those into the next iteration. This way, management can see an incremental return
      on every cycle. 
   </p>
        <p>
      To ensure your factory is applicable to more scenarios in its market, make sure management
      promote its use in many projects, even if the factory covers only a (relative) small part
      of the solution that is built. This way your factory can quickly identify many valuable
      scenarios of use, and support those in its evolving design. 
   </p>
        <p>
      Another option we have to minimize the initial investment costs is to re-use and customize
      an existing factory. For example, Microsoft <a href="http://msdn.microsoft.com/practices">patterns
      &amp; practices</a> released some (early examples of) software factories that are
      totally free and ready for use. It only takes us a few days to get familiar with these
      factories. After that we are ready to start using them in real life projects.
      Our project will benefit from the factory that we are using and in the meantime
      we will build experience with using software factories in our software development
      process. All of this with minimal investments but the experience we will gain
      from that will be invaluable for our future factory development activities.  
   </p>
        <h4>Measuring Success
   </h4>
        <p>
      One of the first questions we will have to answer when asking for an investment in
      factories is: "how do we measure the success of the factory?” In other words,
      we know the factory is supposed to increase our productivity, improve the quality
      and degree of standardization, but how do we notice and when will we see our first
      results? We have to make sure the management knows what to expect and therefore we
      have to specify this upfront. 
   </p>
        <p>
      For example, we can state the factory delivers a 5 % productivity increase
      during the development phase for projects larger than 2000 man hours, we can
      maybe save 80 hours during the design phase because we can use a standardized architecture
      documents and need less time for building a proof of concept. Further we have to specify
      when we can expect these results. For example, do we benefit from the factory
      in our first project or is it more likely this will happen in the second or even third
      project because the factory needs some improvements, people have to get familiar with
      it, etc. Of course, all of this depends on the state of the factory itself, the project,
      etc. but it is crucial that we use this kind of data to validate the effectiveness
      of the factory and the investment we are making in software factories. 
   </p>
        <h4>Promote Use and Feedback
   </h4>
        <p>
      Factory development isn't something we do as a "stand alone" activity. After all,
      the factory is supposed to be re-used by a lot of projects and different project teams
      within our company. To make sure we don't suffer from the "not invented here" syndrome
      we have to make sure the factory authoring team, but also the management communicates
      openly about these initiatives. We have to tell our colleagues about our initiative,
      demo an early drop or even better, let them play with it and ask them to provide feedback,
      tips hints, etc. 
   </p>
        <h4>Support Factory Adoption
   </h4>
        <p>
      Another thing we can do to increase the adoption of our factory is to help people
      use the factory on their project. Tell them a member of the factory authoring team
      is available at the start of their project to support them in using the factory. This
      will give them a head start, not only from the productivity and guidance they get
      from the factory itself but also from a domain expert that demonstrates them how to
      best use the factory in their situation. From experience we can tell this is something
      that is really appreciated by most projects. We can also ask projects that we supported
      to provide feedback to the management and tell them how the factory helped them in
      their project. This will definitely help us in marketing our factory approach within
      the company. 
   </p>
        <h3>Summary 
   </h3>
   In this post I tried to list the benefits of software factories for our company. From
   reading this list it might be tempting to move to a software factory approach as soon
   as possible in your current everyday development. However, to make this move successful
   we have to make sure we get the full support and commitment from the management within
   the organization. They need to see the value and benefits of this approach and how
   they can minimize risk. We also discussed the need for their support for an organizational
   structure that is separated from the company’s core business with its own structure,
   culture, goals and values on what to expect from move to the software factory approach.<img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=72bf4bc3-15bb-4369-b9b3-6c98675313ea" /></body>
      <title>Factories 201 - What do I tell my manager?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx</link>
      <pubDate>Thu, 01 Feb 2007 12:48:17 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   Previous posts in the Factories 201 series: 
&lt;p&gt;
   &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;What
   are they (concretely)?&lt;/a&gt; (Edward) 
&lt;p&gt;
   &lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;When
   would you build one?&lt;/a&gt; (Jezz) 
   &lt;hr align=center width="100%" size=2&gt;
&lt;p&gt;
   To continue the factory 201 series let's&amp;nbsp;discuss a next question: &lt;strong&gt;What
   do I tell my manager?&lt;/strong&gt; Or maybe, how do we explain&amp;nbsp;the benefits&amp;nbsp;of&amp;nbsp;software
   factories to the management to justify moving to a software factories approach. 
&lt;p&gt;
   Before we ask the management to move to a software factories approach we have to explain
   what the value proposition of a software factory is, and what is to be gained from
   a software factory approach. As we all know, most managers are not interested in technical
   details so we have to focus on the topics that are important for them! However, the
   value that we can get from this approach requires a change in the way we develop software
   today, and this requires a firm commitment from management to achieve success with
   this approach. Let’s have a look. &lt;blockquote&gt; 
&lt;p&gt;
   &lt;font size=2&gt;&lt;em&gt;Please note that in this post I am using my own experiences from
   working for a System Integrator. These types of companies are building and using software
   factories in-house to deliver products for customers. Some of the topics I describe
   might be (slightly) different for other type of companies, for example for companies
   that build factories and sell them to their customers without using them in-house.&lt;/em&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;h3&gt;&lt;strong&gt;Value Proposition&lt;/strong&gt;
&lt;/h3&gt;
&lt;p&gt;
   The first step might be to tell them what a factory is, we can use the &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx"&gt;“What
   are they (concretely)?”&lt;/a&gt; post for that. The next step to get them really interested
   is to explain the benefits of software factories. 
&lt;h4&gt;Increase Productivity
&lt;/h4&gt;
&lt;p&gt;
   Probably the easiest benefit to explain&lt;strong&gt; &lt;/strong&gt;is &lt;strong&gt;increase of productivity,
   decrease in cost&lt;/strong&gt;. Factories automate parts of our development and design
   work and as a result of&amp;nbsp;that the development team will be &lt;strong&gt;more productive&lt;/strong&gt; during
   the development phase of the product, and that reduces development costs. But there
   is more! 
&lt;h4&gt;Predictable, Consistent Results
&lt;/h4&gt;
&lt;p&gt;
   Factories will also &lt;strong&gt;standardize the product&lt;/strong&gt; that is developed and
   therefore we need&amp;nbsp;&lt;strong&gt;less time for design and proof of concepts&lt;/strong&gt;.
   Another benefit is the &lt;strong&gt;improved and consistent quality&lt;/strong&gt; of the product
   that is built by the factory. After all, the assets for the factory are built by domain
   experts and &lt;b&gt;remove the&lt;/b&gt; &lt;strong&gt;dependency on the very few highly skilled resources
   (sometimes referred to as ‘local heroes’)&lt;/strong&gt; or over-resourced projects, to
   deliver the same high quality work. &amp;nbsp;A lot of companies are working on improving
   their software delivery process,&amp;nbsp;reaching a certain &lt;a href="http://en.wikipedia.org/wiki/CMMI"&gt;CMMI&lt;/a&gt; levels&amp;nbsp;and
   software factories can definitely help with that. 
&lt;h4&gt;Re-use of: Skills, Resources, Value
&lt;/h4&gt;
&lt;p&gt;
   Factories use abstractions to simplify the development of solutions. They encapsulate
   domain specialist experiences and knowledge into the assets behind these abstractions.
   As a result of that we don’t need to constantly staff each project with very best
   domain experts, since the assets themselves contain the required experience to solve
   the problem for us in the best way. Basically, the factory provides a collection of
   domain skills and experience we can use on each project. These assets represent the
   actual captured value of our skilled resources. 
&lt;p&gt;
   Furthermore, it’s possible we can re-sell these assets to other companies who may
   also find getting skilled resources a challenge. 
&lt;h4&gt;Competitive Advantage
&lt;/h4&gt;
&lt;p&gt;
   All of the above mentioned benefits are somewhat related to the product that is delivered
   from the factory,&amp;nbsp;the resources we need for that and are mostly focused on the
   internal organization.&amp;nbsp;Let’s have a look at some benefits that are recognized
   externally by investing in factories. 
&lt;p&gt;
   Software factories are hot and will probably become even hotter when they reach the
   larger community. This is obvious because the value proposition is so strong! Therefore
   companies can use the presence of software factories in &lt;strong&gt;marketing campaigns&lt;/strong&gt;,
   and use them as a means to &lt;strong&gt;communicate their effectiveness and professionalism&lt;/strong&gt; to
   their customers. They can &lt;b&gt;display their innovation&lt;/b&gt; in this space and can use
   that in their&amp;nbsp;recruitment activities to attract senior and skilled professionals. 
&lt;h3&gt;Resource Attainment
&lt;/h3&gt;
&lt;p&gt;
   Of course, in the end, our company can also leverage the factory approach to help
   solving its own resource issues. We can use the best resources to do the most challenging
   work and actually built the software factories. In this way we continuously challenge
   these resources, instead of making them participate in ‘boring’ project work and ordinary
   tools, to make it more likely they will stick with the company. The less experienced
   resources can become the factory users and be way more productive as they were before. 
&lt;h3&gt;Commitments
&lt;/h3&gt;
&lt;p&gt;
   Of course, after telling all of the above described&amp;nbsp;benefits to&amp;nbsp;our management
   they can't wait to adopt the software factories approach, but wait! There is more
   we have to tell them to make sure the adoption of software factories within&amp;nbsp;our
   company has a fair chance to succeed. 
&lt;h4&gt;Dedicated Resources
&lt;/h4&gt;
&lt;p&gt;
   We already discussed the requirement for dedicated resources in a previous post (&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;“When
   would you build one?”&lt;/a&gt;) but we cannot stress enough that you &lt;b&gt;have&lt;/b&gt; to use
   the very best experienced, skilled&amp;nbsp;architects and developers to build your factory.
   They have to be domain experts for the product&amp;nbsp;the factory outputs but also have
   experience in software (tool) development in general. 
&lt;p&gt;
   However, we all know that the very best resources are the first resources to be pulled
   off a project and put on another. Since the value of factory assets (and therefore
   the factory as a whole) directly depend on these resources, it is critical they must
   not be removed from the factory development project. We all know, and so do the managers,
   that it’s our customers, market, and organizational culture who decide the allocation
   of our resources internally. To mitigate this we have to change these conditions to
   free ourselves from this powerful force to be able to keep these resources focused.
   The factory development project needs to be separated from the core business development
   projects, shipping ‘ordinary’ products, and requires a new organizational structure,
   cost structure, goals, culture and market to succeed. Management needs to support
   this. 
&lt;h4&gt;Return on Investment
&lt;/h4&gt;
&lt;p&gt;
   Return on investment is about profit and growth and thus more important than anything
   in the world for our management. We have seen the benefits that factories can bring
   us but&amp;nbsp;before the management is&amp;nbsp;willing to invest in software factories
   they probably want to know how fast they get their return on investment. After all,
   why would&amp;nbsp;they want to invest in something that never pays back? 
&lt;p&gt;
   As we have already seen in our "&lt;a href="http://blogs.msdn.com/jezzsa/archive/2007/01/27/factories-201-when-would-you-build-one.aspx"&gt;When
   would you build one?&lt;/a&gt;" post, we probably need to build more than ~5 products&amp;nbsp;with
   a software factory before it pays back so we better make sure we invest in a factory
   that is likely to be used more than once. We will discuss &lt;b&gt;how and when&lt;/b&gt; this
   investment is returned in one of our future posts &lt;i&gt;&lt;u&gt;“How long will it take?”&lt;/u&gt;&lt;/i&gt; 
&lt;p&gt;
   Of course, the expectations on the ROI will be different than the established expectations
   for existing ordinary product development. So, there again, this calls for a separate
   organizational structure with its own values on what to expect from the product the
   factory delivers. 
&lt;h4&gt;Not a Big-Bang Effort!
&lt;/h4&gt;
&lt;p&gt;
   We have to make sure we keep the initial investment costs as low as possible. Therefore,
   trying to build a huge, fully featured factory from scratch in one attempt doesn't
   make sense, not only from a technical perspective but also from an investment perspective.
   We need to see a return on each iteration of the factory development. 
&lt;p&gt;
   To be successful, a progressive, iterative approach is preferred. The best thing you
   can do here is to start with small increments in automation of the product your factory
   creates. With each increment we identify the variable parts of the product and design
   those into the next iteration. This way, management can see an incremental return
   on every cycle. 
&lt;p&gt;
   To ensure your factory is applicable to more scenarios in its market, make sure management
   promote its use in many projects, even if the factory covers only a (relative) small&amp;nbsp;part
   of the solution that is built. This way your factory can quickly identify many valuable
   scenarios of use, and support those in its evolving design. 
&lt;p&gt;
   Another option we have to minimize the initial investment costs is to re-use and customize
   an existing factory. For example, Microsoft &lt;a href="http://msdn.microsoft.com/practices"&gt;patterns
   &amp;amp; practices&lt;/a&gt; released some (early examples of) software factories that are
   totally free and ready for use. It only takes us a few days to get familiar with these
   factories. After that we are ready&amp;nbsp;to start using them in real life projects.
   Our project will&amp;nbsp;benefit from the factory that we are using and in the meantime
   we will&amp;nbsp;build experience with using software factories in our software development
   process. All of this with minimal investments but the&amp;nbsp;experience we will gain
   from that will be invaluable for our future factory development activities.&amp;nbsp; 
&lt;h4&gt;Measuring Success
&lt;/h4&gt;
&lt;p&gt;
   One of the first questions we will have to answer when asking for an investment in
   factories is: "how do we measure the success of the factory?”&amp;nbsp;In other words,
   we know the factory is supposed to increase our productivity, improve the quality
   and degree of standardization, but how do we notice and when will we see our first
   results? We have to make sure the management knows what to expect and therefore we
   have to&amp;nbsp;specify this upfront. 
&lt;p&gt;
   For example, we can state the factory delivers&amp;nbsp;a 5 % productivity&amp;nbsp;increase
   during the development phase for projects larger than 2000&amp;nbsp;man hours, we can
   maybe save 80 hours during the design phase because we can use a standardized architecture
   documents and need less time for building a proof of concept. Further we have to specify
   when we can expect these results. For example, do we&amp;nbsp;benefit from the factory
   in our first project or is it more likely this will happen in the second or even third
   project because the factory needs some improvements, people have to get familiar with
   it, etc. Of course, all of this depends on the state of the factory itself, the project,
   etc. but it is crucial that we use this kind of data to validate the effectiveness
   of the factory and the investment we are making in software factories. 
&lt;h4&gt;Promote Use and Feedback
&lt;/h4&gt;
&lt;p&gt;
   Factory development isn't something we do as a "stand alone" activity. After all,
   the factory is supposed to be re-used by a lot of projects and different project teams
   within our company. To make sure we don't suffer from the "not invented here" syndrome
   we have to make sure the factory authoring team,&amp;nbsp;but also the management communicates
   openly about these initiatives. We have to tell our colleagues about our initiative,
   demo an early drop or even better, let them play with it and ask them to provide feedback,
   tips hints, etc. 
&lt;h4&gt;Support Factory Adoption
&lt;/h4&gt;
&lt;p&gt;
   Another thing we can do to increase the adoption of our factory is to help people
   use the factory on their project. Tell them a member of the factory authoring team
   is available at the start of their project to support them in using the factory. This
   will give them a head start, not only from the productivity and guidance they get
   from the factory itself but also from a domain expert that demonstrates them how to
   best use the factory in their situation. From experience we can tell this is something
   that is really appreciated by most projects. We can also ask projects that we supported
   to provide feedback to the management and tell them how the factory helped them in
   their project. This will definitely help us in marketing our factory approach within
   the company. 
&lt;h3&gt;Summary 
&lt;/h3&gt;
In this post I tried to list the benefits of software factories for our company. From
reading this list it might be tempting to move to a software factory approach as soon
as possible in your current everyday development. However, to make this move successful
we have to make sure we get the full support and commitment from the management within
the organization. They need to see the value and benefits of this approach and how
they can minimize risk. We also discussed the need for their support for an organizational
structure that is separated from the company’s core business with its own structure,
culture, goals and values on what to expect from move to the software factory approach.&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=72bf4bc3-15bb-4369-b9b3-6c98675313ea" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,72bf4bc3-15bb-4369-b9b3-6c98675313ea.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=2c1950d4-6652-423b-8a17-c0b3f450eac5</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=2c1950d4-6652-423b-8a17-c0b3f450eac5</wfw:commentRss>
      <slash:comments>5</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
      In my previous post "<a href="http://www.edwardbakker.nl/PermaLink,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx">Software
      Factories: Where to start</a>" I tried to list some resources that
      might be interesting for new comers in the software factory space. I have been thinking
      about factories and also participating in this space for some time now and I recently
      realized that, although there is a lot of buzz around software factories it is still very
      difficult to enter the world of software factories. 
   </p>
        <p>
      It might sound simple; install <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718948.aspx">GAT</a> and
      the <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718368.aspx">DSL Tools</a> and
      build your first factory but unfortunately, from what I experienced, it isn't that
      easy (it might be me of course!). I had (and still have) a lot of questions like
      for example: "What is a software factory", "When would you build one", "How would
      you build one", "What tools would you use" and many, many more. 
   </p>
        <p>
      It's therefore that  I decided to share some of my thinking's about factories
      to hopefully provide some answers to people that are about to join the software factories
      space. I am not a very formal guy so will try to write about these topics
      from a (factory) developer or (factory) architect perspective and keep it
      practical and understandable. 
   </p>
        <p>
      To be honest I am not sure I have the answers for all questions just yet but we will
      see where this leads too. Regular readers of this blog might have noticed that I discuss
      a lot of my software factory related work with <a href="http://blogs.msdn.com/jezzsa/default.aspx">Jezz</a>.
      He did a lot of interesting posts on factories lately so hopefully he reads this post
      and will comment, or even better, add some content when he sees me struggling in my
      attempts (don't feel forced <a href="http://blogs.msdn.com/jezzsa/default.aspx">Jezz</a>,
      but know that I am counting on you to help me out! :-)). 
   </p>
        <p>
      Ok, now we know the plan, let's make sure the title of this post makes sense and start
      with the first question: 
      <hr /></p>
        <h3>What are they (concretely)?
   </h3>
        <p>
      If you were looking for a formal definition of what a software factory is, you would
      find one in the <a href="http://www.softwarefactories.com/TheBook.html">Software Factories</a>”
      book written by <a href="http://blogs.msdn.com/jackgr/">Jack Greenfield</a> and <a href="http://blogs.msdn.com/keith_short/">Keith
      Short</a>. In this book, a software factory is defined as: 
   </p>
        <blockquote>
          <p>
            <i>“<strong>A Software Factory</strong> is a software product line that configures
      extensible tools, processes and content using a software factory template based on
      a software factory schema to automate the development and maintenance of variants
      of an archetypical product by adapting, assembling and configuring framework-based
      components</i>
            <i>.”</i>
          </p>
        </blockquote>
        <p>
      Fair enough, but do we, as a developer, know what to build by just reading this definition?
      Not me. The patterns &amp; practices team came up with a more pragmatic definition,
      that is in fact more accurate for the factories being built today: 
   </p>
        <blockquote>
          <p>
            <i>“<b>A software factory</b> is a structured collection of related software assets.
      When a software factory is installed in a development environment, it helps architects
      and developers predictably and efficiently create high-quality instances of specific
      types of applications.”</i>
          </p>
        </blockquote>
        <p>
      But even this definition, does not really tell you what the factory itself <i>is</i> in
      concrete terms, at least not in enough detail to help you get started in building
      one. So we are going to use a much more simplified, and concrete definition that is
      more to the point from a developers perspective, describing what it actually <i>is</i> and
      how it physically works. Then from this, you will get a basic understanding of how
      the definitions above describe more precisely the moving parts of the factory. 
   </p>
        <p>
          <i>[Please note, that this definition is being used here for the purposes of helping
      you understand the context of this series on building factories, and is not a formal
      and general definition of what a software factory is when it is finally shipped. The
      following definition only focuses on the concrete automation part of a factory. Inside
      the box of a real factory you will find other physical guidance assets like documentation,
      samples, reference implementations, training media etc. and together these make up
      a complete software factory.]</i>
        </p>
        <h4>It’s a Tool!
   </h4>
        <p>
      First of all, a software factory is a software development tool. This tool is used
      to automate the assembly and/or configuration of a software solution that is addressing
      a well known and described, specific problem domain. It’s here where we see our first
      difference between a software factory and another development tool like for example
      Visual Studio.NET. A software factory is targeted at only a small problem domain while
      we can use Visual Studio.NET to basically build anything we want (of course within
      limits). 
   </p>
        <h4>Configures and runs within Visual Studio
   </h4>
        <p>
      Although there is a difference between software factories and Visual Studio.NET (for
      the Microsoft platform) in the size of the problem domain they target, they are also
      very much related. This is because a software factory runs within Visual Studio.NET
      and basically configures this environment to target the development of a specific
      problem domain. Things like menus, windows, editors, layout etc. 
   </p>
        <p>
      For example, think of the Microsoft p&amp;p <a href="http://msdn.com/servicefactory">Service
      Factory</a> that configures Visual Studio to develop web services. This (early generation)
      software factory adds some menus, wizards and templates to the standard Visual Studio
      environment (Solution Explorer) to help developers build services. 
   </p>
        <h4>Uses Abstraction
   </h4>
        <p>
      Another characteristic of a software factory is that it provides abstractions to simplify
      the problem domain it targets. An abstraction is something that simplifies the thing
      it describes and only focuses upon on only the important characteristics or variable
      parts of it. 
   </p>
        <p>
      In factories you can provide abstractions using several techniques like frameworks,
      specialized editors, wizards, models and diagrams. 
   </p>
        <p>
      Although providing abstractions is one of the most important requirements of a software
      factory, we haven’t seen a ‘publically available’ factory that uses all of these techniques
      - but I am sure we will see more in the future. 
   </p>
        <p>
      If you are interested in examples of abstractions that are used in factories, you
      might want to read this <a href="http://msdn2.microsoft.com/en-us/library/aa905331.aspx">MSDN
      article</a> about the EFx factory. The <a href="http://msdn2.microsoft.com/en-us/library/aa905331.efxagsftftr05l(en-us,msdn.10).gif">DSL</a> that
      is used in this factory is a perfect example of the usage of abstraction. 
   </p>
        <h4>Creates a Product
   </h4>
        <p>
      Another very important aspect of factories is its output. A software factory outputs
      a generated solution for the problem domain it targets. The product of a factory is
      what it outputs. A software factory doesn’t necessarily output source code. For example,
      it’s also possible that a factory generates some configuration files that are used
      to configure an existing framework, some documents, or whatever makes sense to the
      problem domain it targets. They can also just configure other products which solve
      a particular domain. One thing to keep in mind is, that is likely that the factory
      output needs some manual work or customization before it is ready to use. 
   </p>
        <h4>Customization
   </h4>
        <p>
      There is also another type of customization that is very applicable to software factories.
      This is, the customization of the software factory itself instead of the output it
      generates. This type of customization leads to an iterative approach where we start
      with a small factory that iteratively increases. It is this type of customization
      that we use to address a new concern in the factory or, solve a defect in the factory
      product, or customize our assets to suit your development requirements and corporate
      standards. 
   </p>
        <h4>Summary
   </h4>
        <p>
      So, here we are. I tried to explain what a software factory really is by describing
      some off its key characteristics without using common software factory terms like
      “product line”, “schema”, “variants”, etc. Because of that I might be missing some
      important stuff but I am sure I can make up for that in a way that make sense in future
      posts when I cover some other, software factory related topics. 
   </p>
        <p>
      For those of you who can’t wait for that, and like to read a little bit more about
      a software factories definition in more software factory related jargon, I can recommend <a href="http://blogs.msdn.com/jezzsa/archive/2006/11/03/q-a-what-is-a-software-factory.aspx">this
      post</a> from <a href="http://blogs.msdn.com/jezzsa/default.aspx">Jezz</a>. 
   </p>
        <p>
      If there are any software factory related questions that you might have and want me
      to answer please let me know by commenting on this post. I cannot guarantee I have
      the answers but we can at least discuss about it and try to find the answer together. 
   </p>
        <p>
      To be continued…
   </p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=2c1950d4-6652-423b-8a17-c0b3f450eac5" />
      </body>
      <title>Factories 201 - What are they (concretely)?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx</link>
      <pubDate>Thu, 25 Jan 2007 12:23:32 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   In my previous post "&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx"&gt;Software
   Factories: Where to start&lt;/a&gt;" I tried to&amp;nbsp;list&amp;nbsp;some&amp;nbsp;resources that
   might be interesting for new comers in the software factory space. I have been thinking
   about factories and also participating in this space for some time now and I recently
   realized that, although there is a lot of buzz around software factories it is still&amp;nbsp;very
   difficult to enter the world of software factories. 
&lt;p&gt;
   It might sound simple;&amp;nbsp;install &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718948.aspx"&gt;GAT&lt;/a&gt; and
   the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718368.aspx"&gt;DSL Tools&lt;/a&gt; and
   build your first factory but unfortunately, from what I experienced, it isn't that
   easy (it might be me of course!).&amp;nbsp;I had (and still have) a lot of questions like
   for example:&amp;nbsp;"What is a software factory", "When would you build one", "How would
   you build one", "What tools would you use" and many, many more. 
&lt;p&gt;
   It's therefore that&amp;nbsp; I decided to share some of my thinking's about factories
   to hopefully provide some answers to people that are about to join the software factories
   space. I am not a&amp;nbsp;very&amp;nbsp;formal guy so will try to write about these topics
   from a&amp;nbsp;(factory) developer or&amp;nbsp;(factory) architect perspective and keep it
   practical and understandable. 
&lt;p&gt;
   To be honest I am not sure I have the answers for all questions just yet but we will
   see where this leads too. Regular readers of this blog might have noticed that I discuss
   a lot of my software factory related work with &lt;a href="http://blogs.msdn.com/jezzsa/default.aspx"&gt;Jezz&lt;/a&gt;.
   He did a lot of interesting posts on factories lately so hopefully he reads this post
   and will comment, or even better, add some content when he sees me struggling in my
   attempts (don't feel forced &lt;a href="http://blogs.msdn.com/jezzsa/default.aspx"&gt;Jezz&lt;/a&gt;,
   but know that I am counting on you to help me out!&amp;nbsp;:-)). 
&lt;p&gt;
   Ok, now we know the plan, let's make sure the title of this post makes sense and&amp;nbsp;start
   with the first question: 
   &lt;hr&gt;
&lt;h3&gt;What are they (concretely)?
&lt;/h3&gt;
&lt;p&gt;
   If you were looking for a formal definition of what a software factory is, you would
   find one in the &lt;a href="http://www.softwarefactories.com/TheBook.html"&gt;Software Factories&lt;/a&gt;”
   book written by &lt;a href="http://blogs.msdn.com/jackgr/"&gt;Jack Greenfield&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/keith_short/"&gt;Keith
   Short&lt;/a&gt;. In this book, a software factory is defined as: &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;“&lt;strong&gt;A Software Factory&lt;/strong&gt; is a software product line that configures
   extensible tools, processes and content using a software factory template based on
   a software factory schema to automate the development and maintenance of variants
   of an archetypical product by adapting, assembling and configuring framework-based
   components&lt;/i&gt;&lt;i&gt;.”&lt;/i&gt; 
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   Fair enough, but do we, as a developer, know what to build by just reading this definition?
   Not me. The patterns &amp;amp; practices team came up with a more pragmatic definition,
   that is in fact more accurate for the factories being built today: &lt;blockquote&gt; 
&lt;p&gt;
   &lt;i&gt;“&lt;b&gt;A software factory&lt;/b&gt; is a structured collection of related software assets.
   When a software factory is installed in a development environment, it helps architects
   and developers predictably and efficiently create high-quality instances of specific
   types of applications.”&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   But even this definition, does not really tell you what the factory itself &lt;i&gt;is&lt;/i&gt; in
   concrete terms, at least not in enough detail to help you get started in building
   one. So we are going to use a much more simplified, and concrete definition that is
   more to the point from a developers perspective, describing what it actually &lt;i&gt;is&lt;/i&gt; and
   how it physically works. Then from this, you will get a basic understanding of how
   the definitions above describe more precisely the moving parts of the factory. 
&lt;p&gt;
   &lt;i&gt;[Please note, that this definition is being used here for the purposes of helping
   you understand the context of this series on building factories, and is not a formal
   and general definition of what a software factory is when it is finally shipped. The
   following definition only focuses on the concrete automation part of a factory. Inside
   the box of a real factory you will find other physical guidance assets like documentation,
   samples, reference implementations, training media etc. and together these make up
   a complete software factory.]&lt;/i&gt; 
&lt;/p&gt;
&lt;h4&gt;It’s a Tool!
&lt;/h4&gt;
&lt;p&gt;
   First of all, a software factory is a software development tool. This tool is used
   to automate the assembly and/or configuration of a software solution that is addressing
   a well known and described, specific problem domain. It’s here where we see our first
   difference between a software factory and another development tool like for example
   Visual Studio.NET. A software factory is targeted at only a small problem domain while
   we can use Visual Studio.NET to basically build anything we want (of course within
   limits). 
&lt;h4&gt;Configures and runs within Visual Studio
&lt;/h4&gt;
&lt;p&gt;
   Although there is a difference between software factories and Visual Studio.NET (for
   the Microsoft platform) in the size of the problem domain they target, they are also
   very much related. This is because a software factory runs within Visual Studio.NET
   and basically configures this environment to target the development of a specific
   problem domain. Things like menus, windows, editors, layout etc. 
&lt;p&gt;
   For example, think of the Microsoft p&amp;amp;p &lt;a href="http://msdn.com/servicefactory"&gt;Service
   Factory&lt;/a&gt; that configures Visual Studio to develop web services. This (early generation)
   software factory adds some menus, wizards and templates to the standard Visual Studio
   environment (Solution Explorer) to help developers build services. 
&lt;h4&gt;Uses Abstraction
&lt;/h4&gt;
&lt;p&gt;
   Another characteristic of a software factory is that it provides abstractions to simplify
   the problem domain it targets. An abstraction is something that simplifies the thing
   it describes and only focuses upon on only the important characteristics or variable
   parts of it. 
&lt;p&gt;
   In factories you can provide abstractions using several techniques like frameworks,
   specialized editors, wizards, models and diagrams. 
&lt;p&gt;
   Although providing abstractions is one of the most important requirements of a software
   factory, we haven’t seen a ‘publically available’ factory that uses all of these techniques
   - but I am sure we will see more in the future. 
&lt;p&gt;
   If you are interested in examples of abstractions that are used in factories, you
   might want to read this &lt;a href="http://msdn2.microsoft.com/en-us/library/aa905331.aspx"&gt;MSDN
   article&lt;/a&gt; about the EFx factory. The &lt;a href="http://msdn2.microsoft.com/en-us/library/aa905331.efxagsftftr05l(en-us,msdn.10).gif"&gt;DSL&lt;/a&gt; that
   is used in this factory is a perfect example of the usage of abstraction. 
&lt;h4&gt;Creates a Product
&lt;/h4&gt;
&lt;p&gt;
   Another very important aspect of factories is its output. A software factory outputs
   a generated solution for the problem domain it targets. The product of a factory is
   what it outputs. A software factory doesn’t necessarily output source code. For example,
   it’s also possible that a factory generates some configuration files that are used
   to configure an existing framework, some documents, or whatever makes sense to the
   problem domain it targets. They can also just configure other products which solve
   a particular domain. One thing to keep in mind is, that is likely that the factory
   output needs some manual work or customization before it is ready to use. 
&lt;h4&gt;Customization
&lt;/h4&gt;
&lt;p&gt;
   There is also another type of customization that is very applicable to software factories.
   This is, the customization of the software factory itself instead of the output it
   generates. This type of customization leads to an iterative approach where we start
   with a small factory that iteratively increases. It is this type of customization
   that we use to address a new concern in the factory or, solve a defect in the factory
   product, or customize our assets to suit your development requirements and corporate
   standards. 
&lt;h4&gt;Summary
&lt;/h4&gt;
&lt;p&gt;
   So, here we are. I tried to explain what a software factory really is by describing
   some off its key characteristics without using common software factory terms like
   “product line”, “schema”, “variants”, etc. Because of that I might be missing some
   important stuff but I am sure I can make up for that in a way that make sense in future
   posts when I cover some other, software factory related topics. 
&lt;p&gt;
   For those of you who can’t wait for that, and like to read a little bit more about
   a software factories definition in more software factory related jargon, I can recommend &lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/11/03/q-a-what-is-a-software-factory.aspx"&gt;this
   post&lt;/a&gt; from &lt;a href="http://blogs.msdn.com/jezzsa/default.aspx"&gt;Jezz&lt;/a&gt;. 
&lt;p&gt;
   If there are any software factory related questions that you might have and want me
   to answer please let me know by commenting on this post. I cannot guarantee I have
   the answers but we can at least discuss about it and try to find the answer together. 
&lt;p&gt;
   To be continued…
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=2c1950d4-6652-423b-8a17-c0b3f450eac5" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,2c1950d4-6652-423b-8a17-c0b3f450eac5.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
          <font face="Verdana" size="2">As it looks like now, 2007 will be the year where software
      factories get a lot of exposure and attention. We have seen quite a lot of activity
      in this space in the second half of 2006 but there is definitely more to come! This
      also means that there will be a lot of new people entering the software factory space
      in the next coming months. For those of you who are not that experienced yet with
      software factories I decided to create a short list with some interesting links to
      existing software factories, forums, blogs, etc. Hopefully, this overview gives you
      a head start in entering the exiting world of software factories. </font>  
   </p>
        <p>
          <font face="Verdana" size="2">
            <strong>Available software factories</strong>
          </font>
        </p>
        <p>
          <font face="Verdana" size="2">If you are a practical guy (or girl) and like to get
      your hands dirty as soon as possible you might want to get yourself an existing software
      factory and start experimenting with it right away. In that case, check out the following
      offerings from Microsoft P&amp;P. Clicking the links below will bring you to the MSDN
      landing page for each of the factories were you will find detailed information,
      links to the community and links to the download pages.</font>
        </p>
        <ol>
          <li>
            <a href="http://msdn2.microsoft.com/en-us/library/aa480534.aspx">
              <font face="Verdana" size="2">Web
         Service Software Factory</font>
            </a>
          </li>
          <li>
            <a href="http://msdn2.microsoft.com/en-us/library/bb264518.aspx">
              <font face="Verdana" size="2">Web
         Client Software Factory</font>
            </a>
          </li>
          <li>
            <a href="http://msdn2.microsoft.com/en-us/library/aa480482.aspx">
              <font face="Verdana" size="2">Smart
         Client Software Factory</font>
            </a>
          </li>
          <li>
            <a href="http://msdn2.microsoft.com/en-us/library/aa480471.aspx">
              <font face="Verdana" size="2">Mobile
         Client Software Factory</font>
            </a>
          </li>
        </ol>
        <p>
          <font face="Verdana" size="2">You may also want to subscribe to the blogs of some
      of the P&amp;P Product Managers: <a href="http://blogs.msdn.com/donsmith/">Don Smith</a>, <a href="http://blogs.msdn.com/tomholl/">Tom
      Hollander</a> and <a href="http://blogs.msdn.com/eugeniop/">Eugenio Pace</a> to
      keep you up to date with the latest news and future directives of the P&amp;P factories.
      If you are interested in an indication of the "release dates" of the (future)
      P&amp;P deliverables, check out their brand new <a href="http://msdn.microsoft.com/practices/UpcomingRel/default.aspx">"Upcoming
      Releases"</a> page. </font>
        </p>
        <p>
          <font face="Verdana" size="2">
            <strong>Software Factories Tools</strong>
          </font>
        </p>
        <p>
          <font face="Verdana" size="2">After experimenting with these existing factories for
      some time you might want to modify them (to make them better suite your requirements),
      extend them with some Domain Specific Languages or completely build your own factories
      from scratch. In that case you have to check out the technologies that drive the current
      wave of software factories.</font>
        </p>
        <p>
          <font face="Verdana" size="2">First of all, we have the <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718948.aspx">Guidance
      Automation Toolkit</a> which you can use to create “packages” that can be installed
      in Visual Studio.NET and basically represents software factories as we see them today.
      You can download it from <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718949.aspx">here</a> and
      you can ask your questions about it (which you will definitely have ;)) <a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=78&amp;SiteID=1">here</a>. </font>
        </p>
        <p>
          <font face="Verdana" size="2">Second, we have the <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718368.aspx">DSL
      Tools</a> that you can use to create Domain Specific Languages that you can include
      in your software factories. You can download the DSL Tools from <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7E0FDD66-698A-4E6A-B373-BD0642847AB7&amp;displaylang=en">here</a> and
      ask your questions about it <a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&amp;siteid=1">here</a>. </font>
        </p>
        <p>
          <font face="Verdana" size="2">If you are interested in the combination of the
      Guidance Automation Toolkit and the DSL Tools you might want to read <a href="http://msdn2.microsoft.com/en-us/library/aa905334.aspx">this
      article</a> that describes some of the possible integration scenarios. (the library
      that is used in this article isn’t available yet, but will be soon!). </font>
        </p>
        <p>
          <font face="Verdana" size="2">If you plan to start building your own factories, based
      on the above mentioned technologies, you also might be interested in the Clarius </font>
          <a href="http://softwarefactoriestoolkit.net/">
            <font face="Verdana" size="2">Software
      Factories Toolkit</font>
          </a>
          <font face="Verdana" size="2">. This toolkit adds some
      extra features to the existing technologies to make it easier to develop your own
      factories. </font>
        </p>
        <p>
          <font face="Verdana" size="2">
            <strong>Background information, theory and concepts</strong>
          </font>
        </p>
        <p>
          <font face="Verdana" size="2">Of course, there are also people who are really interested
      in the theory and the concepts behind the software factories strategy. If that’s you,
      go get yourself the </font>
          <a href="http://www.softwarefactories.com/TheBook.html">
            <font face="Verdana" size="2">Software
      Factories</font>
          </a>
          <font face="Verdana" size="2"> book written by </font>
          <a href="http://blogs.msdn.com/jackgr/">
            <font face="Verdana" size="2">Jack
      Greenfield</font>
          </a>
          <font face="Verdana" size="2"> and </font>
          <a href="http://blogs.msdn.com/keith_short/">
            <font face="Verdana" size="2">Keith
      Short</font>
          </a>
          <font face="Verdana" size="2">. Once you have read this book you realize
      that we are still at the very early beginning with software factories and there is
      a lot of improvement to be made in the coming years. Some time ago I have written </font>
          <a href="http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx">
            <font face="Verdana" size="2">a
      post</font>
          </a>
          <font face="Verdana" size="2"> myself about some of the limitations
      in the first wave of software factories. As you can read there today’s software factories
      lack a model, schema and a lots of other stuff. </font>
        </p>
        <p>
          <font face="Verdana" size="2">If you are interested in the jargon that is often used
      in the software factories space, check out this </font>
          <a href="http://blogs.msdn.com/jezzsa/archive/2006/08/09/sfxjargon.aspx">
            <font face="Verdana" size="2">“Software
      Factories ABC”</font>
          </a>
          <font face="Verdana" size="2"> that I co-authored with </font>
          <a href="http://blogs.msdn.com/jezzsa">
            <font face="Verdana" size="2">Jezz</font>
          </a>
          <font face="Verdana" size="2">.
      You better subscribe to </font>
          <a href="http://blogs.msdn.com/jezzsa">
            <font face="Verdana" size="2">his
      blog</font>
          </a>
          <font face="Verdana" size="2"> if you are interested in software factories
      because Jezz is an active factory blogger and has some really interesting posts
      about models, schema and tools. If you are still hungry for more information you
      can also check the <a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718951.aspx">software
      factories landing page</a> on MSDN for more information. </font>
        </p>
        <p>
          <font face="Verdana" size="2">So, we are done with the list. Of course there is a
      lot more interesting information about software factories but I am sure you will find
      them when you start your journey by experimenting with the currently available factories
      and reading the information I linked too in this post. Hopefully this list can be
      off any help to "software factories newbies" to get familiar with this very
      interesting technology as soon as possible.</font>
        </p>
        <p>
          <font face="Verdana" size="2">Happy factories!</font>
        </p>
        <p>
          <strong>Update:</strong> also check out the <a href="http://software-factories-swicki.eurekster.com">Software
      Factories Swicki</a> as the online search enigne for all factory related stuff!
   </p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3" />
      </body>
      <title>Software Factories: Where to start?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx</link>
      <pubDate>Mon, 22 Jan 2007 08:17:49 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;As it looks like now, 2007 will be the year where software
   factories get a lot of exposure and attention. We have seen quite a lot of activity
   in this space in the second half of 2006 but there is definitely more to come! This
   also means that there will be a lot of new people entering the software factory space
   in the next coming months. For those of you who are not that experienced yet with
   software factories I decided to create a short list with some interesting links to
   existing software factories, forums, blogs, etc. Hopefully, this overview gives you
   a head start in entering the exiting world of software factories.&amp;nbsp;&lt;/font&gt;&amp;nbsp; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;&lt;strong&gt;Available software factories&lt;/strong&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;If you are a practical guy (or girl) and like to get your
   hands dirty as soon as possible you might want to get yourself an existing software
   factory and start experimenting with it right away. In that case, check out the following
   offerings from Microsoft P&amp;amp;P. Clicking the links below will bring you to the MSDN
   landing page for each of the factories were you will find&amp;nbsp;detailed information,
   links to the community and links to the download pages.&lt;/font&gt; 
&lt;ol&gt;
   &lt;li&gt;
      &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480534.aspx"&gt;&lt;font face=Verdana size=2&gt;Web
      Service Software Factory&lt;/font&gt;&lt;/a&gt; 
   &lt;li&gt;
      &lt;a href="http://msdn2.microsoft.com/en-us/library/bb264518.aspx"&gt;&lt;font face=Verdana size=2&gt;Web
      Client Software Factory&lt;/font&gt;&lt;/a&gt; 
   &lt;li&gt;
      &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480482.aspx"&gt;&lt;font face=Verdana size=2&gt;Smart
      Client Software Factory&lt;/font&gt;&lt;/a&gt; 
   &lt;li&gt;
      &lt;a href="http://msdn2.microsoft.com/en-us/library/aa480471.aspx"&gt;&lt;font face=Verdana size=2&gt;Mobile
      Client Software Factory&lt;/font&gt;&lt;/a&gt;
   &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;You may also want to subscribe to the blogs of some of the
   P&amp;amp;P Product Managers: &lt;a href="http://blogs.msdn.com/donsmith/"&gt;Don Smith&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/tomholl/"&gt;Tom
   Hollander&lt;/a&gt;&amp;nbsp;and &lt;a href="http://blogs.msdn.com/eugeniop/"&gt;Eugenio Pace&lt;/a&gt; to
   keep you up to date with the latest news and future directives of the P&amp;amp;P factories.
   If you are interested in&amp;nbsp;an indication of the "release dates" of the (future)
   P&amp;amp;P deliverables, check out their brand new &lt;a href="http://msdn.microsoft.com/practices/UpcomingRel/default.aspx"&gt;"Upcoming
   Releases"&lt;/a&gt; page.&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;&lt;strong&gt;Software Factories Tools&lt;/strong&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;After experimenting with these existing factories for some
   time you might want to modify them (to make them better suite your requirements),
   extend them with some Domain Specific Languages or completely build your own factories
   from scratch. In that case you have to check out the technologies that drive the current
   wave of software factories.&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;First of all, we have the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718948.aspx"&gt;Guidance
   Automation Toolkit&lt;/a&gt; which you can use to create “packages” that can be installed
   in Visual Studio.NET and basically represents software factories as we see them today.
   You can download it from &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718949.aspx"&gt;here&lt;/a&gt; and
   you can ask your questions about it (which you will definitely have ;)) &lt;a href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=78&amp;amp;SiteID=1"&gt;here&lt;/a&gt;. &lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;Second, we have the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718368.aspx"&gt;DSL
   Tools&lt;/a&gt; that you can use to create Domain Specific Languages that you can include
   in your software factories. You can download the DSL Tools from &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=7E0FDD66-698A-4E6A-B373-BD0642847AB7&amp;amp;displaylang=en"&gt;here&lt;/a&gt; and
   ask your questions about it &lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&amp;amp;siteid=1"&gt;here&lt;/a&gt;. &lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;If you are&amp;nbsp;interested in the combination of the Guidance
   Automation Toolkit and the DSL Tools you might want to read &lt;a href="http://msdn2.microsoft.com/en-us/library/aa905334.aspx"&gt;this
   article&lt;/a&gt; that describes some of the possible integration scenarios. (the library
   that is used in this article isn’t available yet, but will be soon!). &lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;If you plan to start building your own factories, based
   on the above mentioned technologies, you also might be interested in the Clarius &lt;/font&gt;&lt;a href="http://softwarefactoriestoolkit.net/"&gt;&lt;font face=Verdana size=2&gt;Software
   Factories Toolkit&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt;. This toolkit adds some extra
   features to the existing technologies to make it easier to develop your own factories.&amp;nbsp;&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;&lt;strong&gt;Background information, theory and concepts&lt;/strong&gt;&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;Of course, there are also people who are really interested
   in the theory and the concepts behind the software factories strategy. If that’s you,
   go get yourself the &lt;/font&gt;&lt;a href="http://www.softwarefactories.com/TheBook.html"&gt;&lt;font face=Verdana size=2&gt;Software
   Factories&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt; book written by &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jackgr/"&gt;&lt;font face=Verdana size=2&gt;Jack
   Greenfield&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt; and &lt;/font&gt;&lt;a href="http://blogs.msdn.com/keith_short/"&gt;&lt;font face=Verdana size=2&gt;Keith
   Short&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt;. Once you have read this book you realize
   that we are still at the very early beginning with software factories and there is
   a lot of improvement to be made in the coming years. Some time ago I have written &lt;/font&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx"&gt;&lt;font face=Verdana size=2&gt;a
   post&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt; myself about some of the limitations in
   the first wave of software factories. As you can read there today’s software factories
   lack a model, schema and a lots of other stuff. &lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;If you are interested in the jargon that is often used in
   the software factories space, check out this &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/08/09/sfxjargon.aspx"&gt;&lt;font face=Verdana size=2&gt;“Software
   Factories ABC”&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt; that I co-authored with &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa"&gt;&lt;font face=Verdana size=2&gt;Jezz&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt;.
   You better subscribe to &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa"&gt;&lt;font face=Verdana size=2&gt;his
   blog&lt;/font&gt;&lt;/a&gt;&lt;font face=Verdana size=2&gt; if you are interested in software factories
   because&amp;nbsp;Jezz is an active factory blogger and has some really interesting posts
   about models, schema and tools. If you are still hungry for more information&amp;nbsp;you
   can also check the &lt;a href="http://msdn2.microsoft.com/en-us/teamsystem/aa718951.aspx"&gt;software
   factories landing page&lt;/a&gt;&amp;nbsp;on MSDN for more information. &lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;So, we are done with the list. Of course there is a lot
   more interesting information about software factories but I am sure you will find
   them when you start your journey by experimenting with the currently available factories
   and reading the information I linked too in this post. Hopefully this list can be
   off any help to "software factories newbies"&amp;nbsp;to get familiar with this&amp;nbsp;very
   interesting&amp;nbsp;technology as soon as possible.&lt;/font&gt; 
&lt;p&gt;
   &lt;font face=Verdana size=2&gt;Happy factories!&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;strong&gt;Update:&lt;/strong&gt; also check out the &lt;a href="http://software-factories-swicki.eurekster.com"&gt;Software
   Factories Swicki&lt;/a&gt; as the online search enigne for all factory related stuff!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,9bfc17c4-802c-4c46-9a3e-2f1c0a1025e3.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=be50a8a0-4ba0-49db-8906-7e9f42979e19</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,be50a8a0-4ba0-49db-8906-7e9f42979e19.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,be50a8a0-4ba0-49db-8906-7e9f42979e19.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=be50a8a0-4ba0-49db-8906-7e9f42979e19</wfw:commentRss>
      <title>DSL Tools: Customizing shapes</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,be50a8a0-4ba0-49db-8906-7e9f42979e19.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,be50a8a0-4ba0-49db-8906-7e9f42979e19.aspx</link>
      <pubDate>Tue, 26 Dec 2006 01:05:13 GMT</pubDate>
      <description>&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-language: NL; mso-bidi-language: AR-SA; mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt; 
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;One
   of the things that always&amp;nbsp;"bothered" me is the default look of the shapes in
   a new DSL created with the DSL Tools. Have a look at the first&amp;nbsp;screenshot which
   I took from a shape in&amp;nbsp;a DSL&amp;nbsp;that is&amp;nbsp;based on the "minimal language
   template" and compare that to the second screenshot of a shape in the DSL designer
   of the DSL Tools itself.&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;
   &lt;o:p&gt;
      &lt;img src="http://www.edwardbakker.nl/content/binary/example.PNG" border=0&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&amp;nbsp;&lt;img src="http://www.edwardbakker.nl/content/binary/DSLTools.PNG" border=0&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;I
   really don't like the first shape but DO like the way the shape in the second screenshot
   looks. As you can see in the screenshot below (from another DSL!) it is possible,
   just by changing a few of the shapes properties,&amp;nbsp;to make the shape&amp;nbsp;look
   like the shapes in the DSL designer.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;
   &lt;o:p&gt;
      &lt;img src="http://www.edwardbakker.nl/content/binary/withoutimage.PNG" border=0&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;Still
   there is one thing missing! It isn't possible to display icons for the compartment
   items by just setting some properties for the shape. Luckily, we can do this by writing
   some custom code&amp;nbsp;in the "GetCompartmentMappings" method that is&amp;nbsp;available
   in the "shapes.cs" file (GeneratedCode folder in the DSL project).&amp;nbsp; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;In
   the "GetCompartmentMappings"&amp;nbsp;method for your compartmentshape you will find a
   piece of code that looks like this (of course&amp;nbsp;with on your own language&amp;nbsp;and
   shape name!). 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;mappings[localCompartmentMappingsOffset+0]
   = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DslDiagrams::&lt;span style="COLOR: teal"&gt;ElementListCompartmentMapping&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"DataMembers"&lt;/span&gt;,&lt;span style="mso-tab-count: 6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;global&lt;/span&gt;::MyCompany.DataContractLanguage.&lt;span style="COLOR: teal"&gt;DataMember&lt;/span&gt;.NameDomainPropertyId, 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;global&lt;/span&gt;::MyCompany.DataContractLanguage.&lt;span style="COLOR: teal"&gt;DataMember&lt;/span&gt;.DomainClassId, 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;GetElementsFromDataContractForDataMembers,&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, &lt;span style="BACKGROUND: yellow; COLOR: blue; mso-highlight: yellow"&gt;null&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;We
   can replace the last "null" value with a reference to a &lt;font color=#0000ff size=2&gt;"&lt;/font&gt;&lt;/span&gt;&lt;span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.visualstudio.modeling.diagrams.displayimagegetter(VS.80).aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;&lt;font color=#0000ff size=2&gt;DisplayImageGetter
   Delegate&lt;/font&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#0000ff size=2&gt;"&lt;/font&gt;.
   This might look something like this.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;Microsoft.VisualStudio.Modeling.Diagrams.&lt;span style="COLOR: teal"&gt;DisplayImageGetter&lt;/span&gt; displayImageGetter
   = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; Microsoft.VisualStudio.Modeling.Diagrams.&lt;span style="COLOR: teal"&gt;DisplayImageGetter&lt;/span&gt;(CompartmentImageProvider);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 5"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: green"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;mappings[localCompartmentMappingsOffset+0]
   = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; DslDiagrams::&lt;span style="COLOR: teal"&gt;ElementListCompartmentMapping&lt;/span&gt;(&lt;span style="COLOR: maroon"&gt;"DataMembers"&lt;/span&gt;,&lt;span style="mso-tab-count: 6"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;global&lt;/span&gt;::MyCompany.DataContractLanguage.&lt;span style="COLOR: teal"&gt;DataMember&lt;/span&gt;.NameDomainPropertyId, 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;global&lt;/span&gt;::MyCompany.DataContractLanguage.&lt;span style="COLOR: teal"&gt;DataMember&lt;/span&gt;.DomainClassId, 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;GetElementsFromDataContractForDataMembers,&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;, &lt;span style="BACKGROUND: yellow; mso-highlight: yellow"&gt;displayImageGetter&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;Finally
   we can implement the "CompartmentImageProvider" method that is used in the delegate
   to get the image we need for our compartment item. In this demo implementation we
   stored the images in a resource file called "CompartmentImages" and assumed this resource
   file holds an image with the name “[shape name]Image”. Of course all of this can be
   changed; this is just for demoing purposes.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt; System.Drawing.&lt;span style="COLOR: teal"&gt;Image&lt;/span&gt; CompartmentImageProvider(Microsoft.VisualStudio.Modeling.&lt;span style="COLOR: teal"&gt;ModelElement&lt;/span&gt; element)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;return&lt;/span&gt; (System.Drawing.&lt;span style="COLOR: teal"&gt;Image&lt;/span&gt;)&lt;span style="COLOR: teal"&gt;CompartmentImages&lt;/span&gt;.ResourceManager.GetObject(&lt;span style="COLOR: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR: maroon"&gt;"{0}{1}"&lt;/span&gt;,
   element.GetType().Name, &lt;span style="COLOR: maroon"&gt;"Image"&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal; mso-layout-grid-align: none" align=left&gt;
   &lt;span style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-fareast-language: EN-US; mso-no-proof: yes"&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;Another
   thing to remember is that all manual changes in the "shapes.cs" will be lost after
   a "Transform all Templates" action so we either have to implement these changes in
   the&amp;nbsp;shapes.tt template or use partial classes. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;img src="http://www.edwardbakker.nl/content/binary/shape.PNG" border=0&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Trebuchet MS','sans-serif'; mso-ansi-language: EN-US"&gt;As
   you can see in the above screenshot, the end result of the above changes is a shape
   with icons on the left side of the compartment items, a shape that looks just like
   the shapes in the DSL designer, just the way I like it!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p align=left&gt;
&lt;/font&gt;&lt;/span&gt;&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=be50a8a0-4ba0-49db-8906-7e9f42979e19" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,be50a8a0-4ba0-49db-8906-7e9f42979e19.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=dcf75b70-c4a0-4572-b2ac-4185d77815bf</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,dcf75b70-c4a0-4572-b2ac-4185d77815bf.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,dcf75b70-c4a0-4572-b2ac-4185d77815bf.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=dcf75b70-c4a0-4572-b2ac-4185d77815bf</wfw:commentRss>
      <title>Factory authoring: What comes first?</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,dcf75b70-c4a0-4572-b2ac-4185d77815bf.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,dcf75b70-c4a0-4572-b2ac-4185d77815bf.aspx</link>
      <pubDate>Thu, 19 Oct 2006 18:26:06 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;For
   my current assignment, which is related to integrating existing and developing new
   Software Factories in our software development process, I decided to have a look at
   project &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://projectglidepath.net/glidepath/default.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;GlidePath&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;.
   According to the GlidePath website this project will deliver guidance on how to build
   software for Vista. &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;It delivers a web
   based repository of software factories that can loaded into the Visual Studio environment.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;One
   of the very interesting features of GlidePath is the possibility to update the Software
   Factories over an RSS feed. It’s actually this feature that made me investigate GlidePath
   to see if we can use this or a similar approach in our own development process. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Calibri; mso-fareast-language: NL; mso-bidi-language: AR-SA; mso-fareast-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi"&gt;&lt;font color=#000000&gt;Once
   installed, you can use the Glidepath guidance package to create a Visual Studio solution
   structure. Instead of generating a full blown solution structure, like for example
   Service Factory does, Glidepath provides you with a rather empty solution. &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;At
   that moment the solution doesn’t reflect the actual product at all but rather provides
   you with the possibility to decide what factory to use in this solution structure
   (and thus what product to build?). &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;In
   this release of Glidepath you can only select one factory (MicrosISV factory) but
   I assume this will change in the future. Once I had added the MicroISV factory to
   my Glidepath solution I was surprised to see a lot of viewpoints popup in my solution
   structure (at this moment represented as .txt files).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;From
   what I understood from Glidepath the idea behind these viewpoints is that you can
   select and configure them to specify how to build your product in the factory. &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;Glidepath
   will create new projects or enable packages (factories) in your current solution based
   on the viewpoints you configure for your product. Currently, Glidepath populates the
   MicroISV factory with viewpoints like “DataAccess”, “Deployment “, “Blogging”, “Legal”,
   etc.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Glidepath.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;Figure
   1. Glidepath solution structure&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;After
   playing with Glidepath for a while I suddenly realized that I didn’t had a clue what
   kind of product I was actually building in my factory. I could see that my solution
   was populated with a project for “blogging” and project for “CSharp-WinForms-UX” because
   I selected these viewpoints for this solution.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;However,
   from looking at the solution structure I wasn’t able to tell whether I was building
   a “blogging service”, a “blogging site” a “windows client for my blogging service”
   or whatever. Of course I understand this is related to this very early release of
   Glidepath and therefore lack of implemented packages, but I realized this was caused
   by the fact that the Glidepath factory doesn’t &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;have
   any notice (yet) about the product itself and therefore couldn’t tell me either what
   product I was building.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;I
   was interested by this and tried to understand what this would mean for me if I had
   to implement (build a guidance package) one of the viewpoints for MicroISV. How would
   I know about the underlying product my viewpoint will be used on? Is it even necessary
   to have knowledge about that or can we generalize viewpoint implementations so they
   can be used on all products we are building? To be honest, I don’t have the answers
   for that at this moment.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;My current thinking
   is that it would be helpful to have a formal description of the product I am implementing
   my viewpoint for but as said, I don’t have the answers yet. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;A
   related question that interests me is: “what comes first?” Let’s say I was asked to
   build a factory for product X. Would I start with defining the viewpoints for my factory
   (security, deployment, etc.) or would I start by describing the basics of product
   X first? Or would I do this simultaneously? 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;Logically
   I would say, I first need a full picture of the product (product X) I am building
   the factory for.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;Ideally, I would describe
   this product at a conceptual level (product model) in a way that makes this knowledge
   easily accessible and understandable for other people. &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;Once
   I know what I am talking about, and thus have understanding of the problem domain,
   I can decide what viewpoints are important, how to provide automated guidance for
   that, etc. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;If
   we have captured the knowledge about the product we cannot only use this to author
   the factory but also to guide the factory user through the product at runtime. The
   factory can use the product model to communicate with the factory user in terms that
   make sense to the factory user and are related to the problem domain he is developing
   software for. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;Currently &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://blogs.msdn.com/jezzsa/default.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;Jezz&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt; and
   I are working on an experimental software factory authoring approach using a tool
   called the Factory Product Model (FPM).&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;I
   will not explain this approach or tool in detail in this post but if you are interested
   in more details you can read &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/07/31/684404.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;this&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/08/01/688197.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;this&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;, &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;this&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt; and &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'"&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx"&gt;&lt;span lang=EN-US style="mso-ansi-language: EN-US"&gt;this&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt; post. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;In
   this experiment, we are trying to validate whether a formal description (model) of
   the product the factory is building is a valid starting point for defining the factory
   and what it builds. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;As
   far as I understand now, viewpoints will definitely play an important part in factory
   authoring and usage but what I am trying to find out is what impact they have and
   how they possibly relate to something like FPM. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;I
   think specifying viewpoints is all about (some of) the requirements of the product
   we are building in the factory and therefore impact the type of guidance that is needed
   in the factory. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;After
   all a viewpoint is what you get when you associate a work product, to an assets and
   a set of activities. Therefore viewpoints and work products are tightly related. It
   is just a question of which one do you define first?&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;I
   would be very interested in any ideas about this topic. What do you think? Do we need
   a product first approach (an FPM)? How does this relate to the Glidepath viewpoints
   approach I described? Do we need both? Do we need them in a specific order?&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 10pt"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Verdana','sans-serif'; mso-ansi-language: EN-US"&gt;&lt;font color=#000000&gt;Let
   me know!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=dcf75b70-c4a0-4572-b2ac-4185d77815bf" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,dcf75b70-c4a0-4572-b2ac-4185d77815bf.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=43c698f2-332e-4a2f-a8c9-e3c5662bb441</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=43c698f2-332e-4a2f-a8c9-e3c5662bb441</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Factory Product Model, Case Study - The Service Factory Part 2</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx</link>
      <pubDate>Tue, 22 Aug 2006 08:20:40 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In a &lt;/font&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx"&gt;&lt;span style="mso-bidi-font-size: 10.0pt"&gt;previous
   post&lt;/span&gt;&lt;/a&gt;&lt;font color=#000000&gt; I explained that &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/default.aspx"&gt;&lt;span style="mso-bidi-font-size: 10.0pt"&gt;Jezz&lt;/span&gt;&lt;/a&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; and
   I are working together to prototype a different “approach” for authoring software
   factories. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In this experiment
   we are trying to validate this new approach based upon design ideas refined in the
   implementation of the &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/articles/677177.aspx"&gt;&lt;span style="mso-bidi-font-size: 10.0pt"&gt;EFX
   factory&lt;/span&gt;&lt;/a&gt;&lt;font color=#000000&gt;, and verifying that against the publicly available
   release of p&amp;amp;p Service Factory. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Basically, we
   think that we need to be able to let the factory author describe the ‘Product’ that
   is built by their factory at a higher abstraction level than we do now. We suspect
   that this approach will greatly help in improving the factory authoring experience
   and the factory user experience, which therefore simplifies software development as
   a whole. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Part of this
   experimental approach is describing the important concepts of the factory product
   in a so called “&lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/08/01/688197.aspx"&gt;Factory
   Product Model (FPM)”.&lt;/a&gt;&lt;font color=#000000&gt; Below you can see a first attempt to
   model the Service Factory ‘Product’ in an experimental version of the FPM designer. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To make the
   example a little more realistic we introduced a few new concepts and made some assumptions. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For example
   we assumed it is possible to develop different type of services (entity services and
   process services) in Service Factory (there could well be others too). We did this
   to illustrate the concept of ‘Product Variants’. Which are basically one type of product
   the factory creates. Since a factory can create several variants of the product in
   its product line. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;[Think of a
   ‘Product Variant’ as a very similar product but different in architectural definition,
   rather than something different in instance values of the concepts.]&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Another
   assumption we made was that the difference between these services only reflects in
   the “service implementation” part. This is probably not completely true but we are
   only using these assumptions to simulate the situation where the factory enables us
   to build different family members of the service product line.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;a href="http://www.edwardbakker.nl/content/binary/ServiceFactory-FPM-Large.PNG" target=_new atomicselection="true"&gt;&lt;img style="BORDER-RIGHT: 0px; BORDER-TOP: 0px; BORDER-LEFT: 0px; WIDTH: 862px; BORDER-BOTTOM: 0px; HEIGHT: 535px" src="http://www.edwardbakker.nl/content/binary/ServiceFactory-FPM-Large.PNG" border=0&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=1&gt;&lt;strong&gt;Figure 1.&amp;nbsp;Factory Product Model for Service Factory&lt;/strong&gt;&lt;/font&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The picture
   of the FPM for Service Factory shows us that we identified a “Product Variant” for
   each service type that is supported in (our imaginary) Service Factory. Also we identified
   the “System” product variant that makes it possible to group together any number of
   these services. We could have gone with one product variant for all types of services,
   but we wanted to define some that are different to validate the approach. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;You can imagine
   then, that each product variant would be represented to the factory user as a separate
   solution template offered to them when they create a new solution using this factory.
   (In this case we would have 3 solution templates: ‘Entity Service’, ‘Process Service’
   and ‘System’.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Looking at the
   concepts in the model, one interesting thing is the “Service Contract” concept; the
   (green) concept we are using, reflects that we will be using a custom Domain Specific
   Language for modelling Service Contracts in our factory. This custom DSL for modelling
   service contracts is responsible for modelling all the concepts that are defined within
   the “Service Contract” shape in the Service Factory FPM. This kind of model is called
   a Work Product Model (WPM), since it defines work products of the FPM. The child concepts
   of the ‘Service Contract’ concept will be refined in this WPM, and are represented
   here for logical structure.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;The
   other concepts in the Service Factory FPM reflect common terms used in the Service
   domain that are therefore part of Service Factory. The concepts in this FPM will be
   represented to the factory user as a mechanism to “drive’” the factory. This view
   provides the user with a higher level abstraction than the current “Solution Explorer”
   view that is used in today’s factories. So instead of being confronted with all the
   technical details he can develop his services by using concepts that make sense to
   the service domain.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/ServiceFactoryProductExplorer2.png" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font size=1&gt;&lt;strong&gt;Figure 2. Example of the Service Factory Product Explorer&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 6pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To make all
   of this happen, the next step would be mapping each concept in the FPM to physical
   solution structure, projects, and project items of Service Factory. &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Once
   that is complete, we define the assets (recipes, templates, designers, etc.) that
   will be used to create and configure these physical artefacts. &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Once
   configured correctly, the FPM is then used as a starting point for populating the
   factory schema for this factory. It already contains the definitions of all the work
   products, their assets.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Another&lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&amp;nbsp;idea
   we would like to validate in this experiment is the speculation that we can use the
   concepts modelled in the FPM to use as reusable parts in other factories. It would
   be great if we could find a way to just “query” this FPM (and/or factory schema) of
   a factory, and select the available concepts that we want to use to compose other
   factories from. You could imagine in this case that the ‘ServiceContract’ concept
   is self-contained enough to be reused in another factory (complete with DSL model
   and definitions).&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=43c698f2-332e-4a2f-a8c9-e3c5662bb441" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,43c698f2-332e-4a2f-a8c9-e3c5662bb441.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=e7c42baa-210a-48a0-993e-1c52798898cc</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,e7c42baa-210a-48a0-993e-1c52798898cc.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,e7c42baa-210a-48a0-993e-1c52798898cc.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=e7c42baa-210a-48a0-993e-1c52798898cc</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Building a Domain Specific Language (23)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,e7c42baa-210a-48a0-993e-1c52798898cc.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,e7c42baa-210a-48a0-993e-1c52798898cc.aspx</link>
      <pubDate>Thu, 10 Aug 2006 19:51:38 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;In
   an earlier post I promised to share some more details about integrating DSL Tools
   with GAT. I am using some of the “techniques” in this post to experiment with integrating
   our Service Description Language with Service Factory.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;As
   far as I know there are two possible approaches for integrating DSL Tools with GAT.
   In the first approach we simply execute GAT recipes from with the DSL Tools and pass
   the necessary arguments (we collect from the DSL model) to the recipe in the “execute
   call”. In the second approach we create “value providers” that are able to read the
   DSL model (selected shape, model root, etc.) and can be used directly in the recipe
   definition (“ValueProvider” tag) in GAT. It’s obvious that the second approach offers
   a more solid solution. For my experiment I tried both approaches. To be honest I don’t
   expect that I need my “experimental code” for too long. I can’t believe that Microsoft
   isn’t going to make something available to support this “out of the box”. &lt;a href="http://blogs.msdn.com/mauroregio/archive/2006/06/07/GAT_DSL_Integration.aspx"&gt;This
   post&lt;/a&gt; of Mauro indicates that I might be right&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-ansi-language: EN-GB; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Let’s
   have a look at the first approach and execute the “GenerateASMXDataContractFromSchemas”
   recipe from the “ASMXGuidancePackage” from the DSL message shape to generate the datatypes
   for all DataContracts modelled in the message shape of the DSL. The screenshot from
   this example can be found in &lt;/font&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx"&gt;this
   post&lt;/a&gt;&lt;font color=#000000&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;Experimental
   hive&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Before
   we start we have to make sure that the DSL isn’t using the “Exp hive”. GAT is registered
   in the “main hive” so we have to use the same hive both the DSL Tools and GAT for
   our integration experiment. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   did this by changing the .csproj files for the “DSL” project and the “DSLPackage”
   project. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   the “&lt;b style="mso-bidi-font-weight: normal"&gt;Dsl.csproj&lt;/b&gt;” file I deleted the “&lt;b style="mso-bidi-font-weight: normal"&gt;/rootsuffix
   Exp&lt;/b&gt;” from the &lt;b style="mso-bidi-font-weight: normal"&gt;&amp;lt;StartArguments&amp;gt;&lt;/b&gt; tag&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;br&gt;
   &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt -27pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;StartArguments&amp;gt;&lt;b style="mso-bidi-font-weight: normal"&gt;/rootsuffix
   Exp&lt;/b&gt; /DesignTimeRun "..\..\..\Debugging\Debugging.sln"&amp;lt;/StartArguments&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt -27pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   the “&lt;b style="mso-bidi-font-weight: normal"&gt;DslPackage.csproj&lt;/b&gt;” I did the same
   action and also deleted “&lt;b style="mso-bidi-font-weight: normal"&gt;Exp&lt;/b&gt;” from the
   “&amp;lt;TargetRegistryRoot&amp;gt;”&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TargetRegistryRoot&amp;gt;Software\Microsoft\VisualStudio\8.0&lt;b style="mso-bidi-font-weight: normal"&gt;Exp&lt;/b&gt;&amp;lt;/TargetRegistryRoot&amp;gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;Service
   Factory Guidance Packages&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Of
   course we need to debug the new code for calling recipes in our DSL. To make sure
   the GAT packages are enabled for the “DSL debugging solution” I created a new solution
   based on the “ASMX Service” template of the “Web Service Software Factory” package.
   After that I changed the “debugging solution” for the DSL by replacing “&lt;b style="mso-bidi-font-weight: normal"&gt;Debugging\Debugging.sln&lt;/b&gt;”
   in the “&lt;b style="mso-bidi-font-weight: normal"&gt;&amp;lt;StartArguments&amp;gt;&lt;/b&gt;” tag in
   both project files with the correct path and name of the new solution based on the
   “ASMX Service” template. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;After
   making the above described changes, the newly created Service Factory solution opens
   up as the debugging solution (in a new VS2005 instance) for our DSL. So, now we are
   ready to write some code to actually call the GAT recipes from the DSL. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;Reference
   RecipeFramework dll’s&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm -32.4pt 0pt 0cm"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make the code compile we need to reference the “&lt;b style="mso-bidi-font-weight: normal"&gt;Microsoft.Practices.RecipeFramework.dll&lt;/b&gt;”
   and the “&lt;b style="mso-bidi-font-weight: normal"&gt;Microsoft.Practices.RecipeFramework.Extension.dll&lt;/b&gt;”
   from the DslPackage project. The “Extension” dll is part of Service Factory and doesn’t
   have a strong name. To solve this issue we can open the “ASMX Guidance Package.sln”
   located in “C:\Program Files\Microsoft Service Factory” (default location), sign the
   extension project and compile it. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;font size=3&gt;Code&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make the code work we need the following using statements:&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;font size=2&gt;&lt;font face=Verdana&gt;&lt;font face=Verdana&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; Microsoft.Practices.RecipeFramework.Services;&lt;br&gt;
      &lt;br&gt;
      &lt;/font&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; Microsoft.Practices.RecipeFramework.Extensions.CommonHelpers;&lt;br&gt;
      &lt;/font&gt;&lt;/font&gt;

&lt;/p&gt;
&lt;/blockquote&gt;&gt; 
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &amp;nbsp;&gt;&gt;
   &gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   assume the code stated below is coded in the “OnMenu…” method for a custom command
   for one of the shapes in the DSL. Please not that the code example is just demo code! &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt; &lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;EnvDTE.&lt;span style="COLOR: teal"&gt;Project&lt;/span&gt; dataTypeProject
   = &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;Hashtable&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; arguments
   = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; &lt;span style="COLOR: teal"&gt;Hashtable&lt;/span&gt;();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;EnvDTE.&lt;span style="COLOR: teal"&gt;DTE&lt;/span&gt; dte
   = &lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.CurrentDocData.Store.GetService(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(EnvDTE.&lt;span style="COLOR: teal"&gt;_DTE&lt;/span&gt;)) &lt;span style="COLOR: blue"&gt;as&lt;/span&gt; EnvDTE.&lt;span style="COLOR: teal"&gt;DTE&lt;/span&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;IRecipeManagerService&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; recipeManager
   = (&lt;span style="COLOR: teal"&gt;IRecipeManagerService&lt;/span&gt;)&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;.ServiceProvider.GetService(&lt;span style="COLOR: blue"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR: teal"&gt;IRecipeManagerService&lt;/span&gt;));&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;GuidancePackage&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; serviceFactory
   = recipeManager.GetPackage(&lt;span style="COLOR: maroon"&gt;"CustomASMXGuidancePackage"&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;EnvDTE.&lt;span style="COLOR: teal"&gt;Project&lt;/span&gt; serviceProject
   = &lt;span style="COLOR: teal"&gt;DteHelperEx&lt;/span&gt;.FindProjectByName(dte, &lt;span style="COLOR: maroon"&gt;"Service"&lt;/span&gt;, &lt;span style="COLOR: blue"&gt;false&lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;foreach&lt;/span&gt;&lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt; (&lt;span style="COLOR: teal"&gt;ProjectItem&lt;/span&gt; project &lt;span style="COLOR: blue"&gt;in&lt;/span&gt; serviceProject.ProjectItems)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (project.Name.Contains(&lt;span style="COLOR: maroon"&gt;"DataTypes"&lt;/span&gt;))&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dataTypeProject
   = (EnvDTE.&lt;span style="COLOR: teal"&gt;Project&lt;/span&gt;)project.SubProject;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   this first code snippet we can see that get a reference to the Visual Studio infrastructure.
   After that we get a reference to the “RecipeManager”. We will use this reference to
   instantiate the Service Factory Guidance Package. On my machine this is called “CustomASMXGuidancePackage”.
   This is because I already made some other modifications in the package. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   recipe that I am using in this example needs a reference to the Service Factory “DataType”
   project to execute correctly. We can use the “DteHelperEx” class located in “&lt;b style="mso-bidi-font-weight: normal"&gt;Microsoft.Practices.RecipeFramework.Extension.dll&lt;/b&gt;”
   to help with that. Unfortunately I wasn’t able to get a reference to this “DataType”
   project directly. This is probably because the project is located under the “Service”
   solution folder in the Service Factory solution structure. I didn’t take the time
   to investigate this any further so I took another approach for this demo code. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;First
   I get a reference to the “Service” Solution folder which of type EnvDTE.Project. After
   that, I iterate over the ProjectItems in the “Service” solution folder to get a reference
   to the “DataTypes” project. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="COLOR: green"&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;blockquote dir=ltr style="MARGIN-RIGHT: 0px"&gt; 
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="COLOR: green"&gt;//
   Add DSL DataContract's to Service Factory DataType Project 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="COLOR: teal"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt; message
   = ((&lt;/font&gt;&lt;span style="COLOR: teal"&gt;MessageShape&lt;/span&gt;&lt;font color=#000000&gt;)&lt;/font&gt;&lt;span style="COLOR: blue"&gt;this&lt;/span&gt;&lt;font color=#000000&gt;.SingleSelection).ModelElement &lt;/font&gt;&lt;span style="COLOR: blue"&gt;as&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Message&lt;/span&gt;&lt;font color=#000000&gt;;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (message
   != &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;foreach&lt;/span&gt;&lt;font color=#000000&gt; (&lt;/font&gt;&lt;span style="COLOR: teal"&gt;DataContract&lt;/span&gt;&lt;font color=#000000&gt; dataContract &lt;/font&gt;&lt;span style="COLOR: blue"&gt;in&lt;/span&gt;&lt;font color=#000000&gt; message.DataContracts)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;span style="mso-spacerun: yes"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;if&lt;/span&gt;&lt;font color=#000000&gt; (&lt;/font&gt;&lt;span style="COLOR: teal"&gt;DteHelperEx&lt;/span&gt;&lt;font color=#000000&gt;.FindItemByName(dataTypeProject.ProjectItems, &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Path&lt;/span&gt;&lt;font color=#000000&gt;.GetFileName(dataContract.SchemaLocation), &lt;/font&gt;&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;&lt;font color=#000000&gt;)
   == &lt;/font&gt;&lt;span style="COLOR: blue"&gt;null&lt;/span&gt;&lt;font color=#000000&gt;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;dataTypeProject.ProjectItems.AddFromFileCopy(dataContract.SchemaLocation);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;arguments.Add(&lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"DataContractsProject"&lt;/span&gt;&lt;font color=#000000&gt;,
   dataTypeProject);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;serviceFactory.Execute(&lt;/font&gt;&lt;span style="COLOR: maroon"&gt;"GenerateASMXDataContractFromSchemas"&lt;/span&gt;&lt;font color=#000000&gt;,
   arguments);&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   the second code snippet we can see&amp;nbsp;that we get a reference to the selected message
   shape in the model, iterate over all the data contracts in the message to add the
   XSD files that describe the datacontract to the “DataType” project (if not already
   added). The XSD files are referenced in a “SchemaLocation” property for the DataContract
   in the DSL. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;After
   that we add the reference to the “DataType” project, needed as an argument for the
   recipe, to the Hashtable named “arguments”. You can find the necessary arguments for
   the recipe in the xml file that the recipe is defined in. In this case “&lt;b style="mso-bidi-font-weight: normal"&gt;GenerateASMXDataContractFromSchemas.xml&lt;/b&gt;”
   (located in “C:\Program Files\Microsoft Service Factory\Guidance Packages\ASMX Guidance
   Package\ASMX Guidance Package\Recipes\ASMX”). The last line&amp;nbsp;of the code snippet
   finally executes the recipes on the instance of the guidance package. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Of
   course in this very simple example we are only sending one argument to a recipe that
   doesn’t have a “wizard form” attached to collect the values for the arguments. But
   the same approach can be used for recipes that do include wizard forms. However in
   that case it might not make sense to just display the values that are passed from
   the DSL to the recipe wizard form and ask the user to press the “Next” button on the
   wizard form. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;For
   that situation it might be better to modify the recipe and/or write a value provider
   that can be used to read the DSL model values directly from the recipe. In a next
   post we will have a look how we can change a Service Factory recipe to make use of
   a custom build value provider that reads the DSL model.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;strong&gt;[Update:
   added missing link]&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=e7c42baa-210a-48a0-993e-1c52798898cc" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,e7c42baa-210a-48a0-993e-1c52798898cc.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=600e7c14-5f24-45d6-b940-d787f030074a</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=600e7c14-5f24-45d6-b940-d787f030074a</wfw:commentRss>
      <title>Factory Product Model, Case Study - The Service Factory Part 1</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx</link>
      <pubDate>Tue, 08 Aug 2006 07:05:39 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   a &lt;/font&gt;&lt;a href="http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx"&gt;previous
   post&lt;/a&gt;&lt;font color=#000000&gt; about “the next generation software factories” I wrote
   about the factory meta model and it’s role in providing a better user experience for
   the factory user. A more &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/07/31/684404.aspx"&gt;detailed
   explanation&lt;/a&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /&gt; of
   the factory 
   &lt;st1:place w:st="on"&gt;Meta&lt;/st1:place&gt;
   model, or better, Factory Product Model (FPM) can be found in this post on Jezz’s
   blog. We can even see an experimental version of an authoring tool for the FPM in &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/08/01/688197.aspx"&gt;this
   post&lt;/a&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;All
   of the above mentioned posts are using screenshots of the &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/articles/677177.aspx"&gt;EFx
   Factory&lt;/a&gt;&lt;font color=#000000&gt; as an attempt to explain the Factory Product Model
   concept and it’s potential. However, because EFx isn’t publicly available at this
   moment we reckon that missing knowledge of EFx and its underlying domain might be
   debit to understanding the ideas behind the FPM. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;So,
   to solve this issue we decided to take the first official drop of &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/servicefactory.asp"&gt;Service
   Factory&lt;/a&gt;&lt;font color=#000000&gt; from p&amp;amp;p and use that as a test case for discussing
   the Factory Product Model and possible future authoring tooling. Most people interested
   in software factories should at least be familiar with Service Factory as an early
   example so we think we can use this factory and the problem domain it is solving as
   a good example. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   the next couple of posts we will define the FPM for Service Factory by first using
   an experimental version of an FPM authoring tool. Along the way we will describe the
   important concepts of the FPM and demonstrate what Service Factory could have looked
   like if it leveraged a FPM. We will also describe the relationship of the Service
   Factory FPM to its underlying physical solution structure and how all of this related
   to a fictional Factory Schema for this factory. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;We
   will not only use this series of posts to share information to help peoples understanding
   of these concepts, but also to validate and refine our current thinking in this space
   so any feedback is highly appreciated!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Let’s
   start. The first thing to do when authoring a factory is to make sure we fully understand
   the problem domain the factory is supposed to solve. For the Service Factory, this
   domain is already well defined and is reflected in the Service Factory solution structure.
   We will use the following concepts from Service Factory in our discussions:&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;ul style="MARGIN-TOP: 0cm" type=disc&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Service
      Contract&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Service
      Interface&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Service
      Operation&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Message
      Type&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Data
      Type 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Service
      Implementation 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Business
      Entities&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Business
      Logic 
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
   &lt;li class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"&gt;
      &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Data
      Access Logic&lt;o:p&gt;&lt;/o:p&gt;
      &lt;/font&gt;&lt;/span&gt;
   &lt;/li&gt;
&lt;/ul&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Some
   of the above Service Factory concepts are directly realised in the Visual Studio solution
   structure. Others, for example Service Operations, are “hidden” somewhere in a C#
   code file and can only be viewed by opening the physical file. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;We
   will use the above list of concepts together with their physical representation (projects,
   source files) in Service Factory to model a FPM for Service Factory. We will then
   use this higher level abstraction of the Service Factory to see if we can further
   improve the factory user experience by driving Service Factory from this abstraction. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Stay
   tuned…&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=600e7c14-5f24-45d6-b940-d787f030074a" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,600e7c14-5f24-45d6-b940-d787f030074a.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=90d9ba7a-d72c-4174-a464-17a8ef7cc8e0</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=90d9ba7a-d72c-4174-a464-17a8ef7cc8e0</wfw:commentRss>
      <title>Building a Domain Specific Language (22)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx</link>
      <pubDate>Fri, 04 Aug 2006 22:28:20 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font size=3&gt;&lt;strong&gt;Service Description Language meets Service Factory&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;I
   have been working for quite some time now with the DSL Tools and spend the last couple
   of months on Service Factory and related to that a little bit on the Guidance Automation
   Toolkit. Now, I decided to integrate the two and see how easy it is to make customizations
   in Service Factory and call GAT recipes from the DSL Tools.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Both
   our DSL (Service Description Language) and Service Factory cover the same problem
   domain of “designing services” so this seems to be a perfect fit ;) 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;I
   decide to start simple and added two new custom commands to the message shape in our
   DSL. As you can see below we now have the opportunity to call the “Generate DataTypes”
   and “Generate MessageType” recipe from the message shape.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/GenerateDataType.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;My
   first concern was to just make it work so I didn’t spend any time yet on optimizing
   the Service Factory recipes to make them match better the DSL. I reckon this is necessary
   to make the user experience of the DSL integrated in Service Factory better. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;If
   we have a look at (some of) the properties of the DataContract (picture below) that
   is modelled in the message, we can see that the DataContract is defined in the “RestaurantData.Xsd”.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/DataContract.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;After
   selecting the “Service Factory: Generate DataType” command on the message shape we
   can see that the XSD that describes the DataContract is added to the Service Factory
   “datatypes” project and that a datatype class is generated out of the XSD file.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Solution.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Another
   thing we can do now is generate a Message Type for the message that is modelled. In
   the picture below we can see that we can execute the “Service Factory: Generate Message
   Type” command and that we can send the necessary data from the message in the model
   to the recipe in the Service Factory package.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/MessageType.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;As
   said, the Service Factory recipes and wizard need some changes to make them fit better
   with the DSL. For example in this case we don’t need the “Response Class Name” textbox
   on the wizard because we are starting the recipe from one message in the model. To
   solve this we can of course execute this recipe from the Service Operation in our
   DSL or customize the Service Factory recipes. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   a future post I will share some more technical details on how to call GAT recipes
   from a DSL, how share data between the DSL and GAT, etc. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;For
   me it was good to see that it is possible to combine DSL Tools and GAT and that is
   relatively easy to make changes in the Service Factory package (not shown yet). &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   To be continued...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=90d9ba7a-d72c-4174-a464-17a8ef7cc8e0" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,90d9ba7a-d72c-4174-a464-17a8ef7cc8e0.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Software Factories, the next generation</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx</link>
      <pubDate>Tue, 01 Aug 2006 20:33:27 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="mso-ansi-language: EN-GB; mso-bidi-font-family: Arial; mso-fareast-font-family: Tahoma"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Now
the first official release of &lt;/font&gt;&lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag2/html/ServiceFactory.asp?frame=true"&gt;Service
Factory&lt;/a&gt;&lt;font color=#000000&gt; has hit the streets, its time to sit back and start
thinking about what’s next. The last couple of months I have discussed this, first
wave of Software Factories with my good friend &lt;a href="http://blogs.msdn.com/jezzsa"&gt;Jezz&lt;/a&gt;.
He recently published an excellent &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/articles/677177.aspx"&gt;article
about the EFx factory&lt;/a&gt;&lt;font color=#000000&gt;. This factory features some of the concepts
that will play a major role in the foundation under the next generation of Software
Factories. 
&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;In
   the last couple of months I have seen the enormous power of these first examples of
   software factories but also saw some of pain points exhibited by them. I decided to
   write some them down also describe some of the (possible) features of the next generation
   software factories. At some points I am using the EFx factory and my discussions with
   Jezz as a reference for this post. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/h1&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Where
   are we today&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;After
   the introduction of the Software Factories initiative and the publication of the “Software
   Factories” book it took quite some time before the first examples of Software Factories
   became available. Apparently the Software Factories concept was so totally new that
   people needed this time to get familiar to the concept and possible advantages. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Even
   now, when looking at the first examples of Software Factories, we can see that most
   of these examples are in their infancy. One of the reasons for this is the fact that
   not all Software Factories concepts, like for example Software Factory Schema and
   Software Factory Template, are not as well defined and understood as we would like
   them to be. As a result, there is very limited tool support for authoring factories. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Tools
   like the Guidance Automation Toolkit (GAT) and Domain Specific Languages Toolkit (DSL)
   have proven to be successful in these early examples of factories but their learning
   curve is steep and these assets only offer authoring of some of the work products
   which make up a factory, they offer not support of the factory overall as a cohesive
   development environment.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Early
   examples&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;When
   we have a close look at some of the characteristics of the first wave of factories
   from the patterns &amp;amp; practices team, for example ‘The Service Factory’, we can
   see that they are primarily based upon GAT recipes only. These ‘super’ guidance packages
   make extensive use of related recipes to create source artefacts in a solution. The
   factories are technically driven to automate the common tasks of architects and developers
   that would normally have to be hand crafted. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Whilst
   the recipes of these factories encapsulate valuable knowledge and experience of the
   solution domain, they act only as a means to write source code which has to then be
   subsequently tailored towards a specific solution. These factories make little or
   no use of modelling to describe the problem domain and offer little abstraction. Hence
   these factories still require expert knowledge of the solution domain in order to
   exercise them effectively. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;As
   a result, the factory addresses a problem domain from a technical, Visual Studio related
   point of view instead of a more conceptual perspective that simplifies the problem
   domain itself. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Because
   of this tight coupling of these factories with the physical artefacts of a solution
   we cannot easily differentiate in views between the various types of factory users.
   This means all users experience the Factory in exactly the same way. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Another
   issue in the current wave of Software Factories is a missing, formalized way of describing
   software factories. An often heard concept in this space is ‘Software Factory Schema’
   but till now nobody seems to know exactly how this is implemented. As a consequence
   the Software Factory Schema isn’t supported or integrated in any form of tooling in
   these early factories, and consequently we are still faced with a solution structure
   based approach in the early examples of these factories.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Software
   Factory User Experience&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;As
   stated previously, the user experience of today’s software factories is governed by
   the view of a solution in terms of its physical artefacts and therefore has a rather
   technical solution based focus. Let’s have a look at the two views that currently
   represent the factory in today’s examples. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Solution
   Structure view&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;The
   first view that can be identified is the “Solution Structure” view. This is a view
   we are all familiar with and has been around for a long time (as seen in the Solution
   Explorer tool window). It provides an overview of the Visual Studio solution structure
   and shows us all the different artefacts, like projects and source files that our
   software solution is composed of. Developers and architects familiar with Visual Studio
   know how to use this view and nobody really complains about it. Simply because it
   just represents the way we are developing software today. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Besides
   an overview of the solution file, project files, assembly references and code files
   it also reflects the architectural layering of the software component. It even provides
   us with build information, the naming of the individual components and the way the
   software will most likely be deployed. Basically, this view tells us a lot more about
   the physical infrastructure of the solution, the .NET framework and the build engine
   than it tells us about the purpose and concepts of the software we are developing. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;In
   actual fact, the solution structure is often tailored by developers to describe the
   physical deployment view of a solution and the logical structure view of it at the
   same time. Often the result is a compromise of both these views, neither fully satisfying
   either, and hence every development team has opposing opinions on a best representation
   of these views.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;This
   view is always the same for all project members. We have no way to filter the content
   of this view. The architect, the developer and the tester are all faced with the same
   view of all artefacts to represent their different concerns. Most of the time this
   isn’t necessary at all and it even makes software development more complex than needed. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Guidance
   Navigator view&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;The
   second, so called, “Guidance Navigator” view, is a new view driven by necessity by
   the Software Factory initiative. A first example of this view is available in the
   factory examples from the Microsoft patterns &amp;amp; practises team. This “Navigator”
   view provides us with a clear overview of all the activities (recipes) that can be
   executed in the solution. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Although
   we can also start these activities from the context menus on the individual items
   in the solution view it’s the “Guidance Navigator view” that summarises all the recipes
   and makes them easier to discover in one place. Another benefit of the “Guidance Navigator”
   view is that actions are tagged with additional help and background information to
   improve first time factory users understanding and improve the user experience. This
   is one example of the support for the “guidance in context” pillar of software factories. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;However,
   an important aspect that is missing in this current implementation of the “Guidance
   Navigator view” is the lack of support for pre- and post conditions for activities.
   We need these conditions to control when activities become valid next steps for the
   factory user who is navigating the factory. Without this capability the user is still
   required to know which recipes to run in which order and with no way of telling the
   state of a completed activity as a whole. This view also currently lacks the capability
   to filter activities based upon the role of the factory user. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;What
   we can learn from this “Guidance Navigator view” is that we can dramatically improve
   the usability of our software factory by just representing the same information in
   a different way. The “Navigator view” is a good start and it does provide us with
   a much better view on the factory activities but, we are not there yet! It still doesn’t
   provide us with a conceptual view on the underlying problem domain of the factory
   and thus the software we are developing.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Software
   Factory Schema&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;One
   of the things we are currently missing a way to describe our software factory in an
   understandable and predictable way. The suggested means for this is the ‘Factory Schema’.
   This schema is often referred to as the “recipe” for the software component we are
   developing in the factory. It lists all the ingredients like, source files, models,
   frameworks and describes how to combine them to build the software component. It also
   describes the different views we have of the individual parts and the factory as a
   whole. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Although
   this description is quite clear it isn’t so clear what pieces of information should
   actually be part of the software factory schema. Even if we are able to identify all
   individual parts of the software factory schema most of us don’t know in what form
   we have to describe this to make it usable. Till now there is no formal, publicly
   available specification of the software factory schema that we can use to write our
   own schema. One of the things we do know is that a well described and implemented
   software factory schema might be the key to success for future software factory development
   and usage. The Software Factory Schema offers very important benefits for the software
   factory user.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Let’s
   have a closer look at the software factory schema and try to describe the most important
   parts of it. The first concept in the schema is the “viewpoint”. Basically a viewpoint
   is a related set of activities, artefacts (work products), etc. that have a relationship.
   We can use the viewpoint to specify what elements of the software factory will be
   valuable and thus visible for a specific type of software factory user (stakeholder).
   It’s the viewpoint concept that gives us the opportunity to specify how different
   types of factory users will experience the factory. This might be based on the role
   of the factory user which makes role another concept in the software factory schema.
   Viewpoints can be related to each other by creating mappings between viewpoints. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Now
   we know viewpoints contain a set of activities we also know that activity is another
   important concept within the software factory schema.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;An
   activity can be defined as a set of actions that we have execute in order to produce
   a work product or artefacts. Activities can be grouped together in a set of related
   activities. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;A
   third concept in the Software Factory Schema is the workproduct. A workproduct can
   be best described as “anything” the software factory produces. It can be anything
   from one single xml file to a combination of code files or models of part thereof.
   Workproducts can be hierarchical grouped together. By grouping together workproducts
   we can define additional abstraction levels on top of the low level workproducts like
   for example source files. We will later see how we can use these abstractions to boost
   the usability of software factories. Activities use assets on their turn to produce
   workproducts. Think of assets as code generators, frameworks, domain specific languages,
   etc. that are used to create the workproducts. Workproducts have state that will change
   over time from, for example, created, partially ready to finished, by executing one
   or more activities. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;(Have
   a look at &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/05/27/608873.aspx"&gt;this
   post&lt;/a&gt;&lt;font color=#000000&gt; from Jezz for more detailed information about the Software
   Factory Schema.)&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h1 style="MARGIN: 12pt 0cm 3pt"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 12pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Software
   Factory MetaModel&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/h1&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Another
   important concept in the Software Factories area is the Software Factory MetaModel.
   The Software Factory meta model helps us describe the software factory at a higher
   abstraction level. As we have seen earlier, today’s factories are mostly described
   and exposed by using the capabilities and terms available in the Visual Studio.NET
   infrastructure (Solutions, projects and files). Important concepts in our factory
   currently are reflected only in project names, names of source files, and layout of
   the projects and solutions etc. A concept that the factory defines which may include
   several source files cannot be easily represented in physical solution structure,
   and also many of the physical source artefacts created by Visual Studio tools have
   little meaning in the schema of the factory.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Therefore
   we need a Software Factory meta model – a model of the concepts of the factory that
   the user understands in terms of the problem domain. We can use this meta model to
   define abstractions that exist in the problem domain that the software factory deals
   with. In other words the meta model provides us with a mechanism we can use to describe
   our factory at a more conceptual level. We can define the so called software factory
   concepts in this meta model and relate them to each other. To make this concept a
   little more clear let’s have a look at the following example.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Think
   about a software factory for developing services. Thinking about the “service domain”
   we might identify concepts like “Service Interface”, “Service Operation” and “Message
   Contract”. When building a software factory for this domain by using the current tooling
   we will see that these concepts only reflect in documentation, project names and files
   names. The factory is driven by executing recipes that eventually add source files
   to solutions structures. There is no way to navigate through the factory by, for example,
   iterate through all the “Service Operations” that are available in the solution that
   is built with the factory. Simply because for the factory itself and Visual Studio.NET
   this concept doesn’t exist. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;All
   that the first wave of factories have knowledge about at this moment is a set of files
   grouped together in a Visual Studio solution together with a set of recipes. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Tahoma; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Figure
   1 shows us how a service, built the Microsoft Service Factory, is represented to the
   factory user. Later on, we will see how we can change this representation by leveraging
   the factory meta model.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/CustomerService.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;&lt;font size=1&gt;Figure
   1. Representation of a service built in Service Factory.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;The
   presence of a Software Factory meta model would enable us to describe the concepts
   that exist within the problem domain and thus are valid for the software factory.
   A populated meta model for the above described factory would provide us with a capability
   to navigate through the factory by using concepts like “Service Interface” and “Service
   Operations” instead of navigating through the projects and underlying files in the
   Visual Studio solution.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;To
   demonstrate the power of the software factory meta model we will use &lt;a href="http://blogs.msdn.com/jezzsa/articles/677177.aspx"&gt;EFx
   factory&lt;/a&gt; which is the first factory that leverages a factory meta model. EFx is
   an architectural guidance factory that is an offering of Microsoft Services. We will
   use EFx factory to introduce the “software factory view” that is built on top of the
   factory meta model. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;
   &lt;br&gt;
   &lt;/span&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="mso-ansi-language: EN-GB; mso-bidi-font-family: Arial; mso-fareast-font-family: Tahoma"&gt;&lt;font size=3&gt;&lt;font color=#000000&gt;Software
   factory view&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: Tahoma; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;The
   software factory view is the third view we can identify in the software factory area.
   In this view, we are displaying the factory concepts, defined in the factory meta
   model, to the factory user. The factory user isn’t confronted with physical artefacts
   like solution, projects and source files. The result is a view that allows the user
   to construct the products of the factory in terms of the problem domain. As we can
   see in figure 2 which represents the software factory view for EFx factory we are
   now dealing with concepts like Applications, Subsystems, Business Entities, etc. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/FactoryProductExplorer.png" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;&lt;font size=1&gt;Figure
   2. Software factory view in on top of the EFx factory meta model.&lt;/font&gt; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;The
   hierarchy in this view doesn’t reflect the underlying file system or solution explorer
   structure at all. Instead, we are looking at the conceptual structure of the software
   we are writing. We can execute our recipes on these concepts, and have them relate
   to one or more physical artefacts in the solution such as source files, diagrams and
   other models that extend the factory schema. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;The
   advantages of this view are numerous. First of all, this view simplifies the problem
   we are dealing with during our development activities. Developers don’t need knowledge
   of all the underlying details like project structures, files, deployment scenarios
   anymore. All they are faced with are the conceptual pieces of the software they are
   developing together with the activities, implemented as recipes that are related to
   the concepts. They can execute activities to produce the associated workproducts without
   worrying where to put it in the Visual Studio solution structure or store it on the
   file system. With this software factory view in place we can even change the complete
   underlying Visual Studio solution structure, to for example meet specific architectural
   requirements and deployment scenarios, without developers even knowing about it. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Another
   advantage of this view is that we can leverage the viewpoints we defined in our software
   factory schema to hide specific concepts from different types of software factory
   users. This means we can target the factory user experience based on their role to
   better meet the requirements of the different types of users. We can even define a
   viewpoint that only displays the concepts that make sense to business analysts or
   end users so we can discuss the software development process with them. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;A
   view like this requires that the factory maintain the state of the Meta Model, rather
   than creating physical artefacts using recipes. Instead recipes are used to configure
   the meta model, and physical artefacts are then generated at a later stage from the
   meta model.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;&lt;font color=#000000&gt;Summarized
   we can say that we can use the software factory view to represent the factory concepts
   described in the meta model to improve the user experience of the factory. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB; mso-fareast-font-family: Tahoma"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 9pt 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   some future posts I will elaborate a little more about some of the above described
   concepts. In the meantime check out &lt;/font&gt;&lt;a href="http://blogs.msdn.com/jezzsa"&gt;Jezz
   blog&lt;/a&gt;&lt;font color=#000000&gt; for a lot more interesting information on software factories
   and EFx factories in particular. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,f672ac1b-3cb1-4853-8dfe-6c6a9fcf673f.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=fc566788-2540-4f3b-b396-f51d982a5510</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,fc566788-2540-4f3b-b396-f51d982a5510.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,fc566788-2540-4f3b-b396-f51d982a5510.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=fc566788-2540-4f3b-b396-f51d982a5510</wfw:commentRss>
      <title>Building a Domain Specific Language (21)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,fc566788-2540-4f3b-b396-f51d982a5510.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,fc566788-2540-4f3b-b396-f51d982a5510.aspx</link>
      <pubDate>Fri, 14 Jul 2006 11:24:07 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;It’s
   been a long time since I wrote about the never ending story of the small demo Domain
   Specific Language we are building. In the meantime I received a few mails asking me
   for the status and &lt;a href="http://www.metacase.com/blogs/stevek/blogView"&gt;Steven
   Kelly&lt;/a&gt; even mentions in &lt;a href="http://www.metacase.com/blogs/stevek/blogView?showComments=true&amp;amp;entry=3325772088"&gt;this
   post&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; that
   I probably gave up on the DSL Tools.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Well…,
   as we wrote in our &lt;a href="http://www.code-magazine.com/Article.aspx?quickid=0607051"&gt;recently
   published article&lt;/a&gt; (still only available for subscribers) we have plans to make
   it downloadable as soon as the V1 of the Microsoft DSL Tools hits the streets. To
   prepare a little for that I decided it was about time to install the latest &lt;a href="http://msdn.microsoft.com/vstudio/DSLTools/"&gt;June
   CTP of the DSL Tools&lt;/a&gt; and try if I was able to get this DSL working in the new
   DSL Tools. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   used the migration tool that comes with the June CTP to migrate my old domain model
   and designer definitions into the completely new format. Although this migration went
   quite smooth, I decided to start from scratch again, just to get familiar with this
   new release of the DSL Tools.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   be honest, that took some time. I considered myself an “experienced” DSL Tools user
   so decided it wasn’t necessary to read the (limited) documentation. I was wrong! Because
   of that I noticed far too late that there is a “DSL Details” window that helps you
   set some (important) properties for the domain model and designer. This was one of
   the reasons I didn’t get things working. Once I found the DSL Details window (View/Other
   Windows from the menu) things became much easier. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/DSLDetails.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Another
   issue that took some time was that during debugging my DSL the shapes didn’t appear
   after dropping them on the design surface. They were added to the underlying model
   and did appear in the “Explorer” window. After some time I found out that I had to
   add my domain classes as “Element Merge Directives” of the root (in my DSL “Service”).&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   good thing about the new DSL Tools is that you (almost) don’t need to manually edit
   the underlying XML anymore. I only needed that to make my compartment shapes work.
   Once you understand the concepts, the “DSL Explorer” makes it relatively easy to build
   a domain model and designer and it looks *nice*! &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Explorer.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;As
   far as I am concerned, the new June CTP is a very nice upgrade of the DSL Tools. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;Now
   I only have to migrate all my custom code (if still needed), add some validations
   and include the WSDL generation code and I am done &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-ansi-language: EN-GB; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Hopefully
   there will be no breaking changes for V1!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=fc566788-2540-4f3b-b396-f51d982a5510" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,fc566788-2540-4f3b-b396-f51d982a5510.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=5124c660-23f9-46e6-b752-d4c4fafc1f06</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,5124c660-23f9-46e6-b752-d4c4fafc1f06.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,5124c660-23f9-46e6-b752-d4c4fafc1f06.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=5124c660-23f9-46e6-b752-d4c4fafc1f06</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <span lang="EN-GB" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA">
            <font color="#000000">The
      article about Domain Specific Languages I wrote together with <a href="http://blogs.thinktecture.com/cweyer/">Christian
      Weyer</a> for <a href="http://www.code-magazine.com/Index.aspx">CoDe magazine</a> is
      now online. It’s called <a href="http://www.code-magazine.com/Article.aspx?quickid=0607051">“Introducing
      Domain Specific Languages”</a> and briefly describes the Software Factories initiatives
      before it focuses on Domain Specific Languages in general and <a href="http://www.edwardbakker.nl/PermaLink,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx">our
      DSL</a> for the remainder of the article.</font>
          </span>
        </p>
        <p>
          <span lang="EN-GB" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA">
            <font color="#000000">At
      this moment only a piece of the full article is available for non-subscribers. This
      means you either have to subscribe to CoDe magazine or save the link and get back
      in 2 months when the full article is available for all site visitors of the CoDe magazine.</font>
          </span>
        </p>
        <p>
          <span lang="EN-GB" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA">
            <font color="#000000"> Hope
      you like it!</font>
          </span>
        </p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=5124c660-23f9-46e6-b752-d4c4fafc1f06" />
      </body>
      <title>Article online - Introducing Domain Specifc Languages</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,5124c660-23f9-46e6-b752-d4c4fafc1f06.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,5124c660-23f9-46e6-b752-d4c4fafc1f06.aspx</link>
      <pubDate>Wed, 21 Jun 2006 20:44:47 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;The
   article about Domain Specific Languages I wrote together with &lt;a href="http://blogs.thinktecture.com/cweyer/"&gt;Christian
   Weyer&lt;/a&gt; for &lt;a href="http://www.code-magazine.com/Index.aspx"&gt;CoDe magazine&lt;/a&gt; is
   now online. It’s called &lt;a href="http://www.code-magazine.com/Article.aspx?quickid=0607051"&gt;“Introducing
   Domain Specific Languages”&lt;/a&gt; and briefly describes the Software Factories initiatives
   before it focuses on Domain Specific Languages in general and &lt;a href="http://www.edwardbakker.nl/PermaLink,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx"&gt;our
   DSL&lt;/a&gt; for the remainder of the article.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;At
   this moment only a piece of the full article is available for non-subscribers. This
   means you either have to subscribe to CoDe magazine or save the link and get back
   in 2 months when the full article is available for all site visitors of the CoDe magazine.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&amp;nbsp;Hope
   you like it!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=5124c660-23f9-46e6-b752-d4c4fafc1f06" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,5124c660-23f9-46e6-b752-d4c4fafc1f06.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=d6a0d390-614a-45c1-beb1-78e15562e037</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,d6a0d390-614a-45c1-beb1-78e15562e037.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,d6a0d390-614a-45c1-beb1-78e15562e037.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=d6a0d390-614a-45c1-beb1-78e15562e037</wfw:commentRss>
      <title>Building a Domain Specific Language (20)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,d6a0d390-614a-45c1-beb1-78e15562e037.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,d6a0d390-614a-45c1-beb1-78e15562e037.aspx</link>
      <pubDate>Wed, 15 Mar 2006 11:41:57 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   was playing a little bit further with the DSL Tools and tried to add some icons to
   the custom commands (menus) I created. With the help of &lt;a href="http://blogs.msdn.com/jezzsa/"&gt;Jezz&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; I
   managed to get this working.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;First
   of all we tried to use custom bmp images in the commands. Unfortunately there appears
   to be a bug somewhere in the VS shell that prevented us from using custom bmp images.
   One option to work around this is use Guidance Automation Toolkit for adding the custom
   commands, we decided to follow another approach and use one of the icons from the
   office resources. If you can live with this limitation (approx. 7000 icons), you might
   be interested in the information below. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;First
   you need to decide which icon you want to use in the menu. Therefore, you need the
   so called FaceID of the icon that you want to use. There are several tools or Office
   add-ins that can be downloaded from the internet to help you determine the FaceID
   of an icon (I used &lt;a href="http://skp.mvps.org/faceid.htm"&gt;this&lt;/a&gt; one). &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For
   this example we will use FaceID &lt;b style="mso-bidi-font-weight: normal"&gt;2497&lt;/b&gt;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Now
   we know the FaceID of the icon we want to use, we can open the “&lt;b style="mso-bidi-font-weight: normal"&gt;C:\Program
   Files\Visual Studio 2005 SDK\2005.10\VisualStudioIntegration\Common\Inc\office10\msobtnid.h&lt;/b&gt;”
   file in VS.NET. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;This
   file contains all ID’s for the Office icons. For this example, we search the file
   for FaceID &lt;b style="mso-bidi-font-weight: normal"&gt;2497&lt;/b&gt;. We will find a line that
   looks like:&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;#define
   msotcidExploreWebPage&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;2497&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//(43,25)
   Label: 'E&amp;amp;xplore Web Page'&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;From
   this line we get the declaration of the FaceID. In this case this is “&lt;b style="mso-bidi-font-weight: normal"&gt;msotcidExploreWebPage”&lt;/b&gt; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   VS.NET we now open our DSL solution and open the “&lt;b style="mso-bidi-font-weight: normal"&gt;Designer\CtcComponents\GeneratedCmd.dslddt&lt;/b&gt;”
   file. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Somewhere
   after the include of the “GeneratedCmd.dslddi” file we can add the following line. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;#define
   OI_GENERATEDIAGRAM guidOfficeIcon:msotcidExploreWebPage&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Of
   course you can change the “OI_GENERATEDIAGRAM” in whatever you want. Change the declaration
   (“&lt;b style="mso-bidi-font-weight: normal"&gt;msotcidExploreWebPage”&lt;/b&gt;) to the appropriate
   value for your icon, leave the “&lt;b style="mso-bidi-font-weight: normal"&gt;guidOfficeIcon”&lt;/b&gt; in! 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Next,
   we open the “&lt;b style="mso-bidi-font-weight: normal"&gt;Designer\CtcComponents\CustomCmd.ctc&lt;/b&gt;”
   file and find our customer command. This line should look something like this (in
   your case, of course with other name and text)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;guidCmdSet:cmdIdGenerateModel,
   guidMenu:grpidContextMain, 0x0200, OI_NOID,&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp; &lt;/span&gt;BUTTON,&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;DIS_DEF,&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;"Generate
   Model from WSDL";&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;We
   can change the “&lt;b style="mso-bidi-font-weight: normal"&gt;OI_NOID&lt;/b&gt;” into “&lt;b style="mso-bidi-font-weight: normal"&gt;OI_GENERATEDIAGRAM&lt;/b&gt;”
   (your value here)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Last,
   we have to open the “&lt;b style="mso-bidi-font-weight: normal"&gt;Designer\Shell\Package.dslddt&lt;/b&gt;”
   file. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make sure VS.NET resets its menu cache after the first build we need to increment
   the second integer in this line:&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; BACKGROUND: white; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'; mso-no-proof: yes"&gt;[&lt;span style="COLOR: teal"&gt;ProvideMenuResource&lt;/span&gt;(1000, &lt;b style="mso-bidi-font-weight: normal"&gt;15&lt;/b&gt;)]&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
      &lt;o:p&gt;&lt;/o:p&gt;
      &lt;/span&gt;

&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &amp;nbsp;&gt;&gt;
   &gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Build
   and run the solution and the icon will appear in your command.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Icon.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Doesn’t
   this look pretty?&lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=d6a0d390-614a-45c1-beb1-78e15562e037" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,d6a0d390-614a-45c1-beb1-78e15562e037.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=62d65832-1141-4fc1-8509-7b5cb0dd7180</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,62d65832-1141-4fc1-8509-7b5cb0dd7180.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,62d65832-1141-4fc1-8509-7b5cb0dd7180.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=62d65832-1141-4fc1-8509-7b5cb0dd7180</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
          <span lang="EN-GB" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB">
            <font color="#000000">My
      friend <a href="http://blogs.msdn.com/jezzsa/">Jezz</a> started a new <a href="http://blogs.msdn.com/jezzsa/archive/2006/03/06/544740.aspx">series</a> about
      the work he is doing on building a Toolkit for <strong>developing enterprise distributed
      applications and services</strong>. I know some off the details of his work and this
      is quite interesting. Jezz is just like my pasionate abouth DSL, GAT, and all related
      stuff. Let’s see what he has to say in his coming posts...</font>
          </span>
        </p>
        <img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=62d65832-1141-4fc1-8509-7b5cb0dd7180" />
      </body>
      <title>Automation Toolkit</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,62d65832-1141-4fc1-8509-7b5cb0dd7180.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,62d65832-1141-4fc1-8509-7b5cb0dd7180.aspx</link>
      <pubDate>Sat, 11 Mar 2006 13:54:10 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;My
   friend &lt;a href="http://blogs.msdn.com/jezzsa/"&gt;Jezz&lt;/a&gt; started a new &lt;a href="http://blogs.msdn.com/jezzsa/archive/2006/03/06/544740.aspx"&gt;series&lt;/a&gt; about
   the work he is doing on building a Toolkit for &lt;strong&gt;developing enterprise distributed
   applications and services&lt;/strong&gt;. I know some off the details of his work and this
   is quite interesting. Jezz is just like my pasionate abouth DSL, GAT, and all related
   stuff. Let’s see what he has to say in his coming posts...&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=62d65832-1141-4fc1-8509-7b5cb0dd7180" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,62d65832-1141-4fc1-8509-7b5cb0dd7180.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=5d1f06a4-ad68-4d2b-a841-dc23878a6bef</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,5d1f06a4-ad68-4d2b-a841-dc23878a6bef.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,5d1f06a4-ad68-4d2b-a841-dc23878a6bef.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=5d1f06a4-ad68-4d2b-a841-dc23878a6bef</wfw:commentRss>
      <title>Building a Domain Specific Language (19)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,5d1f06a4-ad68-4d2b-a841-dc23878a6bef.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,5d1f06a4-ad68-4d2b-a841-dc23878a6bef.aspx</link>
      <pubDate>Thu, 09 Feb 2006 11:03:09 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Finally!
   A little more information is available of the DSL Tools modelling API! In &lt;a href="http://blogs.msdn.com/georgem/archive/2006/02/08/Part1ModelingAPI.aspx"&gt;this&lt;/a&gt; post &lt;a href="http://blogs.msdn.com/georgem/"&gt;George
   Mathew&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; provide
   us with (some) details on the improvements the DSL Tools team made in the modelling
   API.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;As
   you might have noticed from my previous posts, we have a quite a lot of custom code
   in our Domain Specific Language that uses this modelling API. Therefore changes in
   the modelling API will reflect in some additional work for us also. Hopefully not
   to much!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;According
   to George, creating new &lt;i style="mso-bidi-font-style: normal"&gt;Domain Classes &lt;/i&gt;can
   now be done by using the &amp;#8216;new&amp;#8217; keyword. Isn&amp;#8217;t that great? (and obvious &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-ansi-language: EN-GB; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;).
   The good new is that also the &amp;#8220;old&amp;#8221; mechanism is supported in the new
   API. Hmmm, I think I will definitely upgrade my code to use the &amp;#8216;new&amp;#8217;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Great
   work, waiting for more news George!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=5d1f06a4-ad68-4d2b-a841-dc23878a6bef" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,5d1f06a4-ad68-4d2b-a841-dc23878a6bef.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Building a Domain Specific Language (18)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx</link>
      <pubDate>Fri, 03 Feb 2006 14:43:09 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;It&amp;#8217;s
   been a long time since my last post. I have been busy lately working on a few pretty
   cool things. Unfortunately cannot talk about most of the things yet. But, there&amp;#8217;s
   one thing I can talk about and that is the &amp;#8220;ever lasting story&amp;#8221; of our
   Domain Specific Language for designing service contracts. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;We
   still plan to make it available for download as soon as the RTM of the DSL Tools is
   available. In the meantime we are adding some nice features that hopefully improve
   the usability of the Domain Specific Language. Of course, we have to make some (hopefully
   not to many) changes to make our custom code work against the changes API of the RTM
   of the DSL Tools. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For
   now, let me show you some images of some of the features and/or improvements we have
   been working on. Just to show you this language isn&amp;#8217;t dead yet!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;First
   of all, as you can see in the image below, we included some nice images in the ToolBox.
   Not that difficult but I like the Toolbox a little better now. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Toolbox.PNG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Further
   we added some custom menus. One of them to fire the &amp;#8220;WSDL generation&amp;#8221;
   another one to fire the &amp;#8220;generating model out of WSDL file&amp;#8221; option. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Below
   you can see an example of two custom menus that are available when right clicking
   a MessageShape in our model. When pressing the &amp;#8220;Select Message XSD location&amp;#8221;
   (description will probably change!) you get a FileDialog box to select an XSD file
   that describes the Message. After you selected the XSD, the &amp;#8220;schemalocation&amp;#8221;
   property of the MessageShape in the model gets populated with the reference to the
   XSD.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Message.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/SelectXSD.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;A
   next thing you can do is right click the MessageShape again and this time you can
   select the &amp;#8220;Select Message from XSD&amp;#8221; option. As you can see in the image
   below, this action results in a new window that pops up and that is populated with
   all the message definitions in the XSD that you selected in the previous action. You
   can also click on the messages to see the DataContracts that are referenced in the
   message.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/SelectMessage.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;After
   selecting a message the MessageShape in the model gets populated with the name of
   the selected message and the DataContracts belonging to the message are also added
   to the MessageShape. Maybe no rocket science, but it hopefully makes the Language
   a little easier to use.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/CompletedMessage.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   To be continued...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,0f4e80f7-2ebd-4ab4-a8b4-954cadfc622b.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=8792a7f4-3981-4a3c-a810-5c05e7cbacc5</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,8792a7f4-3981-4a3c-a810-5c05e7cbacc5.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,8792a7f4-3981-4a3c-a810-5c05e7cbacc5.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=8792a7f4-3981-4a3c-a810-5c05e7cbacc5</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Building a Domain Specific Language (17)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,8792a7f4-3981-4a3c-a810-5c05e7cbacc5.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,8792a7f4-3981-4a3c-a810-5c05e7cbacc5.aspx</link>
      <pubDate>Sun, 11 Dec 2005 20:07:33 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   new &lt;a href="http://msdn.microsoft.com/vstudio/teamsystem/workshop/DSLTools/default.aspx"&gt;November
   DSL Tools CTP&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; comes
   with a totally new Validation Framework. This framework can be used to write constraints
   for domain classes in your domain model. After trying it out I must admit that the
   framework makes writing constraints very easy! All validation errors popup in the
   &amp;#8220;Error List&amp;#8221; windows in VS.NET, all of this is very cool!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;However,
   I was a bit confused. I assumed that whenever a constraint was violated on a domain
   class in my model this was reflected in the &amp;#8220;IsValid&amp;#8221; property of the
   ModelElement and the &amp;#8220;Store&amp;#8221; that represents my model. None of this is
   true! While the Error List window shows some constraints violations the &amp;#8220;IsValid&amp;#8221;
   of the &amp;#8220;Store&amp;#8221; (and the ModelElement) returns &amp;#8220;true&amp;#8221;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Because
   I need this information in a piece of custom code in the DSL I had to look a little
   further. I noticed that it is possible execute the validation myself from within the
   custom code. Have a look at the following code snippet where I am using the &amp;#8220;ValidationControler&amp;#8221;
   class to execute the validations. (don&amp;#8217;t forget: &lt;/font&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;using&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; Microsoft.VisualStudio.Modeling.Validation;)&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;ValidationController
   controller &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;new&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; ValidationController();&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;bool&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; isValid &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; controller.Validate(&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;this&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;.Store,ValidationCategory.Save);&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;This
   code lives in the &amp;#8220;ServiceDescriptionDiagram&amp;#8221; class in the DSL. From there
   I have a reference to the &amp;#8220;Store&amp;#8221; that I can use in the &amp;#8220;Validate&amp;#8221;
   method. The methode has some other overloads that makes it, for example, possible
   to validate an ModelElement. The good thing is that this piece of code actually returns
   the right value (based on the violated constraints in my model). In the code above
   the value of &amp;#8220;isValid&amp;#8221; is false whenever a constraint is violated. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   am not sure (yet) why the IsValid property on the &amp;#8220;Store&amp;#8221;, &amp;#8220;ModelElement&amp;#8221;
   and &amp;#8220;ShapeElement&amp;#8221; doesn&amp;#8217;t reflect the current state of any violated
   validation. It might have something to do with the &amp;#8220;ValidationCategory&amp;#8221;
   that is part of the validation process. This category can be specified on a constraint
   to tell the validation framework when&amp;nbsp;a constraint should be validated. Current
   options are &amp;#8220;Menu&amp;#8221;, &amp;#8220;Save&amp;#8221;, &amp;#8220;Open&amp;#8221; and &amp;#8220;Custom&amp;#8221;.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;It
   looks like no information about a model or class being valid is stored in the underlying
   datastore of the model. I assume there is a very &amp;#8220;valid&amp;#8221; reason for this!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For
   continuing our DSL, this isn&amp;#8217;t a problem at all. We can use the &amp;#8220;ValidationController&amp;#8221;
   at any place in our DSL to decide if the model is valid enough to start generating
   artifacts. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;To be continued...&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=8792a7f4-3981-4a3c-a810-5c05e7cbacc5" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,8792a7f4-3981-4a3c-a810-5c05e7cbacc5.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1</wfw:commentRss>
      <title>Building a Domain Specific Language (16)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1.aspx</link>
      <pubDate>Tue, 06 Dec 2005 21:48:53 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Some
   days ago I received an email of somebody asking me if I am (still) using T4 templates
   within the DSL we are building. After reading some of my &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=c076d630-c22b-4fe3-9f9c-8549d1e4c208"&gt;latest
   post&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; he
   got the idea that a lot of the features we are building aren&amp;#8217;t implemented in
   Text templates (T4). He asked me if there is a special reason for that and if I think
   the T4 templates are useful enough for writing (parts of) your DSL. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Actually
   it is true that a lot of the things I am currently working on is implemented in pure
   C# code and is hooked into the diagram itself by using techniques described in &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=fdef0b63-8f59-4093-959e-8acd0812060e"&gt;earlier
   posts&lt;/a&gt;. For me this works just great.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   thing I like about integrating as many features as possible directly in the diagram
   itself is that it requires no user actions (selecting menu items) to &amp;#8220;execute
   the feature&amp;#8221;. For example, in our DSL you don&amp;#8217;t have to select a menu
   item to translate a Service that is modelled in our Designer into WSDL. This is done
   on the fly whenever a change is made in the designer and the diagram is still a valid
   representation of a Service. All of this is done by events that get triggered &amp;#8220;automatically&amp;#8221;
   through the designer. Another option was to implement the WSDL generation into T4
   templates and let the user trigger the execution of the T4 template through a menu
   item.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;It&amp;#8217;s
   not that I don&amp;#8217;t like writing T4 templates! Actually I do like the templates.
   I have to admit that there are some improvements possible in the &amp;#8220;writing experiences&amp;#8221;
   of these templates but I am sure this will improve in future builds of the DSL Tools.
   I can imagine that we will use the T4 templates for some other artifacts that get
   generated out of our domain model. To be honest, the WSDL generation for our DSL is
   besides the &amp;#8220;pure C#&amp;#8221; version also available in a T4 template. Translating
   the &amp;#8220;pure C#&amp;#8221; version into a T4 template (and vice versa) was done in
   a few minutes.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;So,
   to answer the question in the email that starts me writing this post. A lot of the
   functionality in our DSL is built in &amp;#8220;pure C#&amp;#8221; directly hooked into the
   diagram, but that doesn&amp;#8217;t mean that I don&amp;#8217;t like T4 templates or think
   they are not useful! In fact, they will be part of our DSL. I think you have to find
   out for yourself what features and/or customizations you need in your DSL and what
   can be best implemented in pure C# and what can be best implemented in T4 templates. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   noticed that &lt;a href="http://blogs.msdn.com/georgem/default.aspx"&gt;George Mathew&lt;/a&gt; (team
   member DSL Tools) wrote one of his first posts on his blog about &lt;a href="http://blogs.msdn.com/georgem/archive/2005/12/05/New_T4_Features.aspx"&gt;new
   features&lt;/a&gt; in the Text Templates (T4) of the DSL Tools. Maybe he (or other team
   members) has some thoughts or better explanation on when to use the T4 templates and
   when to implement things directly into the designer or diagram?&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,d9506c97-4fc9-4b79-8b8f-135e0b1bbeb1.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=c076d630-c22b-4fe3-9f9c-8549d1e4c208</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,c076d630-c22b-4fe3-9f9c-8549d1e4c208.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,c076d630-c22b-4fe3-9f9c-8549d1e4c208.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=c076d630-c22b-4fe3-9f9c-8549d1e4c208</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>Building a Domain Specific Language (15)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,c076d630-c22b-4fe3-9f9c-8549d1e4c208.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,c076d630-c22b-4fe3-9f9c-8549d1e4c208.aspx</link>
      <pubDate>Mon, 05 Dec 2005 19:14:04 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   an &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=fdef0b63-8f59-4093-959e-8acd0812060e"&gt;earlier
   post&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; I
   mentioned I am using the &amp;#8220;OnTransactionCommiting&amp;#8221; on the Diagram class
   to implement some logic (generating WSDL) for the DSL we are writing. My remark at
   that point was that the event is triggered a lot and therefore might not be the best
   place to implement time consuming logic. At that point I didn&amp;#8217;t pay a lot of
   attention to the &amp;#8220;TransactionCommitEventArgs&amp;#8221; parameter of the event.
   After some further investigation I found out that the &amp;#8220;Transaction&amp;#8221; (that
   can be reached through the TransactionCommitedEventArgs) has a logical name that &amp;#8220;indicates&amp;#8221;
   what is happening in the diagram and what (user) action triggered this event.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For
   example, when changing the value of a property named &amp;#8220;WSDLDescription&amp;#8221;
   in the diagram, the name of the Transaction is &amp;#8220;Set WSDLDescription&amp;#8221;,
   when first loading a diagram the name of the Transaction is &amp;#8220;LoadDocData&amp;#8221;,
   etc. The code snippet below gives you an idea how to limit unnecessary (custom) code
   executions that you might implement in the &amp;#8220;OnTransactionCommiting&amp;#8221;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; OnTransactionCommitting(TransactionCommitEventArgs
   e)&lt;br&gt;
   {&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;base&lt;/span&gt;.OnTransactionCommitting(e);&lt;br&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/span&gt; (
   e.Transaction.Name.ToUpper() == &lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"SET
   WSDLDESCRIPTION"&lt;/span&gt;)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//only
   execute in case of a change in the WSDLDescription property&lt;/span&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoStuff();&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   }&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;This
   actually means that I have much more control than I initially thought and therefore
   makes the &amp;#8220;OnTransactionCommiting&amp;#8221; a usefull event&amp;nbsp;to implement some
   other logic too. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   be continued&amp;#8230; 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=c076d630-c22b-4fe3-9f9c-8549d1e4c208" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,c076d630-c22b-4fe3-9f9c-8549d1e4c208.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=fdef0b63-8f59-4093-959e-8acd0812060e</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,fdef0b63-8f59-4093-959e-8acd0812060e.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,fdef0b63-8f59-4093-959e-8acd0812060e.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=fdef0b63-8f59-4093-959e-8acd0812060e</wfw:commentRss>
      <title>Building a Domain Specific Language (14)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,fdef0b63-8f59-4093-959e-8acd0812060e.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,fdef0b63-8f59-4093-959e-8acd0812060e.aspx</link>
      <pubDate>Tue, 22 Nov 2005 20:24:24 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;One
   of the things I *really* want to implement for our DSL is &amp;#8220;round tripping&amp;#8221;.
   This means in my case, (at least) generate a &amp;#8220;Service Description diagram&amp;#8221;
   out of a valid WSDL file and visa versa. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Some
   weeks ago I already did an attempt in this direction but eventually I ran into problems
   with the serializer. As you can read in &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=113253&amp;amp;SiteID=1"&gt;this
   post&lt;/a&gt; on the DSL forum the relations between concept got lost when trying to serialize
   (save to disk) the in-memory representation of the generated diagram. Probably this
   is caused by either a mistake on my side or a bug in the DSL Tools. Some days ago
   while playing with the propagation rules I found a way to make &amp;#8220;round tripping&amp;#8221;
   work in our DSL. Let me explain a little further. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;I
   added a new property to the &amp;#8220;Service&amp;#8221; concept in the DSL, called &amp;#8220;WsdlDescription&amp;#8221;.
   This property represents a reference to a WSDL file describing the service. I added
   a new propagation rule that fires whenever the &amp;#8220;WsdlDescription&amp;#8221; property
   of the Service concept changes. This propagation rule, on its turn, fires a piece
   of code that parses the WSDL file (referenced by the &amp;#8220;WsdlDescription&amp;#8221;
   property) and generates a diagram out of this. With this code in place I can generate
   a diagram out of a WSDL file by simply creating a new empty diagram. To be more precise,
   adding a new item to the Visual Studio solution based on the &amp;#8220;ServiceDescription&amp;#8221;
   (name of the DSL) template. This results in an (valid) empty diagram. I can set the
   &amp;#8220;WsdlDescription&amp;#8221; property (service concept) in the empty diagram to reference
   a valid WSDL file and the magic happens, the diagram is generated! The advantage of
   this approach, compared to creating an empty diagram from scratch by using custom
   code, is that we can rely on the DSL Tools infra structure to properly initialize
   the diagram. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Of
   course you can find another &amp;#8220;hook&amp;#8221; to implement your round tripping code.
   This depends on the DSL you are building. For this moment, in our DSL, the propagation
   rule on this property does the trick. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Let&amp;#8217;s
   have a look at some code. Below you see the code for the propagation rule that is
   defined for the &amp;#8220;Service&amp;#8221; concept in the model. First we try to cast the
   input parameter of the &amp;#8220;ElementAttributeChanged&amp;#8221; method to a &amp;#8220;Service&amp;#8221;.
   If that succeeds and the rule is fired because of a change in the &amp;#8220;WsdlDescription&amp;#8221;
   property we can continue. To create any new concepts in the diagram we need the &amp;#8220;Store&amp;#8221;.
   This can be seen as the in- &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;memory representation
   of the diagram. We can get this by using the &amp;#8220;Store&amp;#8221; property on the &amp;#8220;Service&amp;#8221;.
   Then we create a &amp;#8220;ServiceInterface and ServiceOperation and register both elements
   under the Service by using the &amp;#8220;ServiceArtifacts&amp;#8221; relation. (To better
   understand the model of this DSL, have a look at the, slightly outdated, &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa"&gt;image
   of the domain model&lt;/a&gt; of the DSL). Finally we add the &amp;#8220;ServiceOperation&amp;#8221;
   as an &amp;#8220;Operation&amp;#8221; under the &amp;#8220;ServiceInterface&amp;#8221; and we are
   done. We now created two model elements and a relation between them in code. All displayed
   perfectly in the diagram. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;img src="http://www.edwardbakker.nl/content/binary/gen.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;[RuleOn(&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;typeof&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;(OurCompany.Design.ServiceDescription.DomainModel.Service),&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   FireTime &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; TimeToFire.TopLevelCommit)]&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;public&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;sealed&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;class&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; DomainModelServicePropertiesChangesRule
   : ChangeRule&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;public&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;override&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;void&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; ElementAttributeChanged(ElementAttributeChangedEventArgs
   e)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   cast input parameter to Service element&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OurCompany.Design.ServiceDescription.DomainModel.Service
   service &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
   e.ModelElement &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;as&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; OurCompany.Design.ServiceDescription.DomainModel.Service;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;if&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; (service
   !&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;null&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   only execute it when the rules is fired because of a change in the WsdlDescription
   property.&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;if&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; (e.MetaAttribute.Id
   ==&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OurCompany.Design.ServiceDescription.DomainModel.Service.WsdlDescriptionMetaAttributeGuid)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   create new ServiceInterface. Use the store of the service &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServiceInterface
   serviceInterface &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;ServiceInterface.CreateServiceInterface(service.Store);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceInterface.Name &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; BACKGROUND: #e4e4e4; COLOR: #666666; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;"GeneratedInterface"&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   add ServiceInterface as an ServiceArtifact of the service&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service.ServiceArtifacts.Add(serviceInterface);&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   create new ServiceOperation. Use the store of the service &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServiceOperation
   serviceOperation &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; ServiceOperation.CreateServiceOperation(service.Store);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceOperation.Name &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; BACKGROUND: #e4e4e4; COLOR: #666666; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;"GeneratedServiceOperation"&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;;&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   add ServiceOperation as an ServiceArtifact of the service&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service.ServiceArtifacts.Add(serviceOperation);&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   add the relation from serviceInterface to serviceOperation&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;serviceInterface.ServiceOperation.Add(serviceOperation);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;br style="mso-special-character: line-break"&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;In
   the above code snippet all of the diagram generating is hard coded, this is, of course,
   just for this example. In my situation the hard coded stuff is replaced by some calls
   to helper functions that parse the WSDL and translate this back in a diagram. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make sure the rules gets executed on changes in the Service concept we need to facilitate
   that it can be &amp;#8220;picked up&amp;#8221; by the &amp;#8220;rule engine&amp;#8221;. This is done
   by reflection; therefore we need the following code.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   This class is reflected on to load rules dynamically. &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: green; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;//
   Add a variable for each custom rule.&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;internal&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;static&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; partial &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;class&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; GeneratedMetaModelTypes&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;internal&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;static&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; Type
   DomainModelServicePropertiesChangesRule &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;typeof&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;(DomainModelServicePropertiesChangesRule);&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Now
   the diagram is generated out of the WSDL, we have to make sure the WSDL stays in synch
   with any changes that might be made in the diagram. It&amp;#8217;s my intention to let
   this synchronisation magic happen automatically, so without any user actions (pressing
   menu options, etc.). To experiment with this I added the &amp;#8220;synchronization logic&amp;#8221;
   to the &amp;#8220;OnTransactionCommiting&amp;#8221; event of the diagram. As you can see in
   the code snippet below this is just a matter of overriding the &amp;#8220;OnTransactionCommiting&amp;#8221;
   method in a partial &amp;#8220;ServiceDescriptionDiagram&amp;#8221; class. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; partial &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; ServiceDescriptionDiagram&lt;br&gt;
   {&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; OnTransactionCommitting(TransactionCommitEventArgs
   e)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base&lt;/span&gt;.OnTransactionCommitting(e);&lt;br&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//validate
   the diagram and execute synch code&lt;/span&gt;
   &lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   }&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Although
   this works perfect I am not absolutely sure if this is the right place to implement
   this kind of logic. I noticed that the code gets fired a lot. Within this method I
   first validate the diagram to make sure there is enough information in the diagram
   to generate a valid WSDL file. If so, the generation (synchronisation) starts. I haven&amp;#8217;t
   experienced any performance issues with this approach but maybe it is better to only
   synch when the diagram gets saved. I have to do some more investigation on this area. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   be continued&amp;#8230;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=fdef0b63-8f59-4093-959e-8acd0812060e" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,fdef0b63-8f59-4093-959e-8acd0812060e.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=19f0377f-98e1-47cf-9489-b35c9a6e8e6b</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,19f0377f-98e1-47cf-9489-b35c9a6e8e6b.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,19f0377f-98e1-47cf-9489-b35c9a6e8e6b.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=19f0377f-98e1-47cf-9489-b35c9a6e8e6b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Building a Domain Specific Language (13)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,19f0377f-98e1-47cf-9489-b35c9a6e8e6b.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,19f0377f-98e1-47cf-9489-b35c9a6e8e6b.aspx</link>
      <pubDate>Sun, 20 Nov 2005 20:12:43 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;The
   MessageHeader concept in our DSL has an attribute &amp;#8220;SchemaLocation&amp;#8221; (the
   same is true for Message and DataContract). This property is a reference to the XSD
   description of the MessageHeader. Another property of the Message concept is the &amp;#8220;Namespace&amp;#8221;
   property. The value of this property is used in the WSDL that is generated out of
   the Domain model of our DSL. In an attempt to make our DSL as user friendly as possible
   I decided to set the &amp;#8220;Namespace&amp;#8221; property automatically as soon as the
   &amp;#8220;SchemaLocation&amp;#8221; is populated. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make this possible I wrote a propagation rule (one of the &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=112186&amp;amp;SiteID=1"&gt;customization
   features&lt;/a&gt; of the DSL Tools) to make this happen. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Below
   you can see the code that is needed for a propagation rule. I stored this code in
   a separate .cs file in a folder called &amp;#8220;custom&amp;#8221; that I created in the
   designer project. The rule inherits from &amp;#8220;ChangeRule&amp;#8221;. The implementation
   isn&amp;#8217;t that difficult (note: just demo code)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; 
&lt;p&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;[RuleOn(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;typeof&lt;/span&gt;(OurCompany.Design.ServiceDescription.DomainModel.MessageHeader),&lt;br&gt;
   FireTime &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; TimeToFire.TopLevelCommit)]&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;sealed&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; DomainModelMessageHeaderPropertiesChangesRule
   : ChangeRule&lt;br&gt;
   {&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;override&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; ElementAttributeChanged(ElementAttributeChangedEventArgs
   e)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
   store the Namespace in&lt;/span&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&lt;/span&gt; messageHeaderNamespace;&lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OurCompany.Design.ServiceDescription.DomainModel.MessageHeader
   messageHeader &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.ModelElement &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;as&lt;/span&gt; OurCompany.Design.ServiceDescription.DomainModel.MessageHeader;&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/span&gt; (messageHeader
   !&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;null&lt;/span&gt;)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/span&gt; (e.MetaAttribute.Id
   ==&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OurCompany.Design.ServiceDescription.DomainModel.MessageHeader.SchemaLocationMetaAttributeGuid)&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&lt;/span&gt; (!String.IsNullOrEmpty(messageHeader.SchemaLocation))&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &lt;br&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
   helper code to retrieve the Namespace from the XSD&amp;nbsp;&lt;/span&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServiceDescriptionEngine.GetSchemasFromXsd(messageHeader.SchemaLocation, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;out&lt;/span&gt; messageHeaderNamespace);&lt;br&gt;
   &lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//
   set the value of the Namespace property&amp;nbsp;&lt;/span&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;messageHeader.Namespace &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; messageHeaderNamespace;&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   }&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;}&lt;/span&gt;
&lt;/p&gt;
&lt;/span&gt; 
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Because
   the code that actually retrieves the &amp;#8220;Namespace&amp;#8221; out of the XSD file is
   stored in another assembly that isn&amp;#8217;t part of the DSL assemblies, I had to add
   the assembly to the GAC to make it work. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   make sure the rule gets fired we need to add a variable to the &amp;#8220;GeneratedMetaModelTypes&amp;#8221;
   class. This class is reflected on to dynamically load rules. The variable is the reference
   to the new propagation rule described above. The following code snippet will do the
   trick.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;Internal&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;static&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; partial &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;class&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; GeneratedMetaModelTypes&lt;br&gt;
   {&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;internal&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;static&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; Type
   DomainModelMessageHeaderPropertiesChangesRule &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: red; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;=&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;typeof&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;(DomainModelMessageHeaderPropertiesChangesRule);&lt;br&gt;
   }&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;As
   you can see in the image below (I know this image doesn&amp;#8217;t prove a lot!) the
   &amp;#8220;Namespace&amp;#8221; property gets set after we populate the &amp;#8220;SchemaLocation&amp;#8221;
   property of the MessageHeader with a valid value. &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/rules.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   To be continued...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=19f0377f-98e1-47cf-9489-b35c9a6e8e6b" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,19f0377f-98e1-47cf-9489-b35c9a6e8e6b.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=549ba8ac-a175-4798-b96a-12acfe9d0e4b</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,549ba8ac-a175-4798-b96a-12acfe9d0e4b.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,549ba8ac-a175-4798-b96a-12acfe9d0e4b.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=549ba8ac-a175-4798-b96a-12acfe9d0e4b</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Building a Domain Specific Langauge (12)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,549ba8ac-a175-4798-b96a-12acfe9d0e4b.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,549ba8ac-a175-4798-b96a-12acfe9d0e4b.aspx</link>
      <pubDate>Fri, 18 Nov 2005 22:14:57 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'"&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;Because
   we made some good progress with building the core functionality of our DSL I decided
   to spend some time on the customization options of the DSL Toolkit.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'"&gt;I
   tried some of the customizations described in &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=112186&amp;amp;SiteID=1"&gt;this
   document&lt;/a&gt; that can be found on the &lt;a href="http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&amp;amp;siteid=1"&gt;DSL
   Tools forum&lt;/a&gt; and also implemented the &amp;#8220;ToolTipText&amp;#8221; for all of the
   shapes and connectors by using the code that is described in &lt;a href="http://blogs.msdn.com/pedrosilva/archive/2005/11/16/493701.aspx"&gt;this
   post&lt;/a&gt; of &lt;a href="http://blogs.msdn.com/pedrosilva"&gt;Pedro Silva&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'"&gt;Another
   thing that I found was necessary was changing the color scheme of the Shapes. I decided
   to use some RGB colors and found out that using an &amp;#8220;RGB color code&amp;#8221; in
   the designer.dlsdd file isn't an option. It wasn't too hard to found out how this
   can be achieved by writing some lines of custom code. As you can see in the code snippet
   below it is just a matter of overriding the FillColor property in a partial class
   for the Shape.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;public&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;partial&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;ServiceOperationShape&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;
   &lt;br&gt;
   {&lt;br&gt;
   &lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;public&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;override&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; Color
   FillColor&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt;return&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB"&gt; Color.FromArgb(132,
   150, 172);&amp;nbsp;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
   &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
   &lt;br&gt;
   }&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: #003300; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Courier New'"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   Message concept in our DSL is holding an embedding relation for the DataContract and
   MessageHeader concept. Therefore our MessageShape is a compartment shape this means
   for these two compartments there isn&amp;#8217;t a possibility to override the FillColor
   property in a partial class.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;We
   had to find another way to changes the color. It turns out that compartments can be
   reached in custom code by using the &amp;#8220;compartmentDescriptions&amp;#8221; collection
   on the parent shape. As you can see in the code snippet below I used the &amp;#8220;OnInitialized&amp;#8221;
   of the MessageShape (parent) to set the &amp;#8220;TitleFillColor&amp;#8221; property of the
   two compartments in the MessageShape to an RGB color code. (Maybe there is a better
   place to set the color but this does work. Another option would be the &amp;#8220; OnShapeInserted&amp;#8220;)&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;public&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;partial&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;class&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: teal"&gt;MessageShape&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;{&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;span style="mso-tab-count: 1"&gt;&lt;font color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;span style="COLOR: blue"&gt;public&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;override&lt;/span&gt;&lt;font color=#000000&gt; &lt;/font&gt;&lt;span style="COLOR: blue"&gt;void&lt;/span&gt;&lt;font color=#000000&gt; OnInitialized()&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 70.8pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;MessageShape&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;.compartmentDescriptions[0].TitleFillColor
   = &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Color&lt;/span&gt;&lt;font color=#000000&gt;.FromArgb(132,150,173);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 106.5pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 70.8pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;MessageShape&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;.compartmentDescriptions[1].TitleFillColor
   = &lt;/font&gt;&lt;span style="COLOR: teal"&gt;Color&lt;/span&gt;&lt;font color=#000000&gt;.FromArgb(189,162,123);&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;&lt;span style="mso-tab-count: 1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'; mso-ansi-language: EN-GB; mso-no-proof: yes"&gt;&lt;font color=#000000&gt;}&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;As
   you can see in the image below the color of the compartments are changed (compared
   to the colors in some &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=65ca5ff0-3fcb-48df-a596-69c276560f69"&gt;previous
   posts&lt;/a&gt;). Also a &amp;#8220;TooltipText&amp;#8221; is displayed when moving the mouse over
   the connector shape. The tooltipText is composed out of the information of the two
   shapes that are connected by the connector. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/color.PNG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   To be continued...
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=549ba8ac-a175-4798-b96a-12acfe9d0e4b" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,549ba8ac-a175-4798-b96a-12acfe9d0e4b.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=e9496230-d1fd-4c85-b903-b871c1d8ee80</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,e9496230-d1fd-4c85-b903-b871c1d8ee80.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,e9496230-d1fd-4c85-b903-b871c1d8ee80.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=e9496230-d1fd-4c85-b903-b871c1d8ee80</wfw:commentRss>
      <title>Building a Domain Specific Language (11)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,e9496230-d1fd-4c85-b903-b871c1d8ee80.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,e9496230-d1fd-4c85-b903-b871c1d8ee80.aspx</link>
      <pubDate>Wed, 19 Oct 2005 16:19:22 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;Great
   news! The DSL Team just released a guide that describes how to customize the features
   and capabilities of the DSL Toolkit (September CTP). Thanks guys!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;This
   guide describes for example how to use custom code to create: &amp;#8220;transparent text
   decorators&amp;#8221;, straight lines, shadow and gradients, container object, etc. All
   techniques that can dramatically improve the modelling experience of your DSL.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;A
   lot of other interesting features are covered in this document including the explaining
   code samples. Of course al of this is subject to change in the next releases of the
   Toolkit. But if you don&amp;#8217;t like that, don&amp;#8217;t use CTP products and wait for
   the V1 release!&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Anyone
   interested in this guide, go get it following &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=112186"&gt;this
   link to the DSL Toolkit forum&lt;/a&gt;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Have
   fun and expect a lot of the features described in this guide in the DSL we are building.&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=e9496230-d1fd-4c85-b903-b871c1d8ee80" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,e9496230-d1fd-4c85-b903-b871c1d8ee80.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4</wfw:commentRss>
      <title>Building a Domain Specific Language (10)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4.aspx</link>
      <pubDate>Mon, 10 Oct 2005 18:56:07 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;It&amp;#8217;s
   been some time since I wrote about the progress of the DSL we are working on. Not
   because there is no progress anymore but mostly because I am very busy with my regular
   work so I simply have no time left to write a post. It&amp;#8217;s still my intention
   to have the DSL fully operational by the time V1 of the DSL Toolkit is available and
   so far I don&amp;#8217;t see any reasons why this wouldn&amp;#8217;t be possible. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;I
   am now using the September CTP of the DSL Toolkit. Unfortunately the migration of
   the whole project took some more time than expected. I followed all steps of the (perfect)
   migration guide but still I got an error when trying to use the designer of my Language
   in the debug instance of Visual Studio.NET. It took me some time and a little help
   of the DSL Team to find out that my designer definition file contained some &amp;#8220;shape
   definitions&amp;#8221; that I wasn&amp;#8217;t actually using anymore. These shapes were now
   part of a compartment shape in my language but I had forgotten to delete the definitions
   from the file. The May CTP build didn&amp;#8217;t have any problems with this. The very
   cryptic error message (&amp;#8220;package &amp;#8230;. Has failed to load properly&amp;#8221;)
   wasn&amp;#8217;t very helpful for finding the problem. So solving this issue took some
   time. The good thing of course is to see that more and more validations are built
   in the Toolkit. I have good faith that the final release will provide more descriptive
   (helpful) error messages for these new validations&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-ansi-language: EN-GB; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;What
   are we working on now? Currently we are working on the &amp;#8220;generating WSDL part&amp;#8221;.
   This WSDL will be based on the service description that is modelled by using the DSL.
   For me this basically this comes down to writing some T4 templates to mix the &amp;#8220;service
   description&amp;#8221; (modelled in the language) with some pure C# code that &lt;a href="http://blogs.thinktecture.com/cweyer"&gt;Christian&lt;/a&gt; wrote
   to generate the WSDL. This work is almost done. From there we can do basically everything
   we want with code generation. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;There
   isn&amp;#8217;t much information available about writing T4 templates. Anybody interesting
   in writing these templates might find some help in &lt;a href="http://blogs.msdn.com/garethj/archive/2005/06/01/T4Syntax.aspx"&gt;this&lt;/a&gt; blog
   post of &lt;span style="COLOR: black"&gt;&lt;a href="http://blogs.msdn.com/garethj/"&gt;Gareth
   Jones&lt;/a&gt; (DSL Team) about the T4 syntax. A little information about how to navigate
   over your DSL model can be found &lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=17201"&gt;here&lt;/a&gt; on
   the &lt;a href="http://forums.microsoft.com/msdn/ShowForum.aspx?ForumID=61"&gt;Domain Specific
   Language Tools forum&lt;/a&gt;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;Some
   directives that I needed within the templates: 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;To
   include files (create some sort of a function library):&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&amp;lt;#@
   include file="filename.extension" #&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;To
   reference an assembly:&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&amp;lt;#@
   Assembly Name="System.Web.Services.dll" #&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;To
   import a namespace:&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&amp;lt;#@
   import namespace="System.Web.Services.Description" #&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;&lt;/b&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;A
   lot more information about writing templates will be made available in the V1 release
   of the Toolkit. By then all the API that can be used for writing templates will be
   stable and no longer subject to change. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;To
   be continued&amp;#8230;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,9a0fb7ad-0ac1-4589-ac3d-7cfddfd52ee4.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=65ca5ff0-3fcb-48df-a596-69c276560f69</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,65ca5ff0-3fcb-48df-a596-69c276560f69.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,65ca5ff0-3fcb-48df-a596-69c276560f69.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=65ca5ff0-3fcb-48df-a596-69c276560f69</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>Building a Domain Specific Language (9)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,65ca5ff0-3fcb-48df-a596-69c276560f69.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,65ca5ff0-3fcb-48df-a596-69c276560f69.aspx</link>
      <pubDate>Mon, 12 Sep 2005 20:15:21 GMT</pubDate>
      <description>&lt;p&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;Currently
   I am working on code generation for the DSL we are building. The DSL Toolkit comes
   with some sort of a framework that can be used to build templates for generating artifacts
   (based on the model). In this release of the toolkit however, writing templates is
   a poor experience (just my opinion &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Wingdings; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;&lt;span style="mso-char-type: symbol; mso-symbol-font-family: Wingdings"&gt;J&lt;/span&gt;&lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;).
   The templates are displayed as &amp;#8220;text files&amp;#8221; within the Visual Studio.NET
   2005 IDE without any syntax coloring. This makes large templates very hard to read.
   As you can see in the image (small part of the template) below it is very hard to
   make a distinction between the C# code that is needed for generation the artifact
   and the C# snippets that are part of the artifact and thus part of the template. The
   image below is only a simple and small part of the templates so imagine a large template.&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;font color=#000000&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;img src="http://www.edwardbakker.nl/content/binary/template12.JPG" border=0&gt;&lt;/span&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   good news is that the DSL team is working on (or at least thinking of) providing a
   richer template writing experience. Hopefully this will make it in the next CTP release
   of the DSL Toolkit! I definitely I can&amp;#8217;t wait for a better coding experience!&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Enough
   complaining. As you can see in the two images below, it is possible to generate some
   code based on a model. The template above also shows that navigation the model isn't
   too hard either &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;(foreach
   ServiceArtifact in this.Service.ServiceArtifacts)&lt;/span&gt;. The&amp;nbsp;image shows the
   C# code that is generated based on the definition of the &amp;#8220;service interface&amp;#8221;
   in the DSL designer. No rocket science but it works. Of course, more code can be generated
   but this is just an example. &lt;/font&gt;&lt;/span&gt;&lt;img src="http://www.edwardbakker.nl/content/binary/model.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;img src="http://www.edwardbakker.nl/content/binary/code2.JPG" border=0&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;One
   of the artifacts that I will generate (based on the model) will be an xml representation
   of the modelled concepts and their relations. I think that might become handy if I
   want to use another code generator engine that isn&amp;#8217;t based on the DSL Toolkit
   Templates and thus might not integrated very well with the DSL model. Hopefully this
   gives me some more flexibility when it comes to generating the artifacts in the future.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;To
   be continued&amp;#8230;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.edwardbakker.nl/aggbug.ashx?id=65ca5ff0-3fcb-48df-a596-69c276560f69" /&gt;</description>
      <comments>http://www.edwardbakker.nl/CommentView,guid,65ca5ff0-3fcb-48df-a596-69c276560f69.aspx</comments>
      <category>Software Factory/DSL</category>
    </item>
    <item>
      <trackback:ping>http://www.edwardbakker.nl/Trackback.aspx?guid=0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa</trackback:ping>
      <pingback:server>http://www.edwardbakker.nl/pingback.aspx</pingback:server>
      <pingback:target>http://www.edwardbakker.nl/PermaLink,guid,0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa.aspx</pingback:target>
      <dc:creator>Edward Bakker (Edward Bakker)</dc:creator>
      <wfw:comment>http://www.edwardbakker.nl/CommentView,guid,0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa.aspx</wfw:comment>
      <wfw:commentRss>http://www.edwardbakker.nl/SyndicationService.asmx/GetEntryCommentsRss?guid=0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Building a Domain Specific Language (8)</title>
      <guid>http://www.edwardbakker.nl/PermaLink,guid,0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa.aspx</guid>
      <link>http://www.edwardbakker.nl/PermaLink,guid,0fd0c013-0bb7-4d87-aeb1-3bc1c2be8aaa.aspx</link>
      <pubDate>Mon, 29 Aug 2005 20:42:59 GMT</pubDate>
      <description>&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;It&amp;#8217;s
   time for another update on the progress of our DSL. &lt;a href="http://weblogs.asp.net/cweyer"&gt;Christian&lt;/a&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt; and
   I have been working on the underlying model of our Domain Specific Language we are
   building. We made some changes to make the model better reflect the &amp;#8220;service
   design&amp;#8221; domain. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;For
   anyone interested in some background information on this topic (service design), go
   read &lt;a href="http://www.code-magazine.com/article.aspx?quickid=0507061&amp;amp;page=1"&gt;this
   article of Christian&lt;/a&gt;. It explains some fundamental concepts that might help you
   understand the domain model a little better. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Please
   note that the model below is still work in progress. It is very likely that it will
   change in the near future. Some of the concepts and relations are based on restrictions
   in the current release of the DSL Toolkit and might not reflect the perfect &amp;#8220;designing
   services&amp;#8221; world. Also getting the code generation to work properly might force
   some changes in the underlying model. For now let&amp;#8217;s have a quick look at the
   model and briefly discuss a few concepts. (I am sure in the end a more detailed explanation
   of the complete model will follow) &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/completeview.JPG" border=0&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;If
   you have seen the &lt;a href="http://www.edwardbakker.nl/PermaLink.aspx?guid=d08cda79-7a9e-422c-8a31-c77a13c3cd9d"&gt;previous
   version&lt;/a&gt; of the model you notice the new &amp;#8220;DataContract&amp;#8221; concept in
   this version of the model. The &amp;#8220;DataContract&amp;#8221; describes the data that
   we need to exchange. In our language the &amp;#8220;DataContract&amp;#8221; is a reference
   to an XSD description of the data, therefore the &amp;#8220;DataContract&amp;#8221; concept
   has a name, &amp;#8220;schemalocation&amp;#8221; and a &amp;#8220;namespace property&amp;#8221;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   &amp;#8220;Message&amp;#8221; concept (previous &amp;#8220;RequestMessage&amp;#8221; and &amp;#8220;ResponseMessage&amp;#8221;)
   has an embedding relation (solid line in the model) to &amp;#8220;DataContract&amp;#8221;.
   The &amp;#8220;Message&amp;#8221; concept reflects the messages we need to exchange the data
   that we defined in the &amp;#8220;DataContract&amp;#8221;. A message can hold one or more
   &amp;#8220;DataContracts&amp;#8221;. Messages can be of the type &amp;#8220;Inbound&amp;#8221; or
   &amp;#8220;Outbound&amp;#8221;.&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;The
   &amp;#8220;ServiceOperation&amp;#8221; concept in the model reflects the definition of a &lt;span style="mso-spacerun: yes"&gt;&amp;nbsp;&lt;/span&gt;serviceoperation
   of the service. The &amp;#8220;ServiceOperation&amp;#8221; has a &amp;#8220;MessageExchange&amp;#8221;
   property that can be set to either &amp;#8220;OneWay&amp;#8221; or &amp;#8220;RequestResponse&amp;#8221;.
   Based on this property the serviceoperation will have a reference (dotted line in
   the model) to one or two &amp;#8220;Messages&amp;#8221;. 
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font&gt;
   &lt;/o:p&gt;
   &lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;&lt;/o:p&gt;
   &lt;/span&gt;&lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB; mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 'Times New Roman'; mso-fareast-language: NL; mso-bidi-language: AR-SA"&gt;&lt;font color=#000000&gt;Another
   interesting (?) design decision in the model is the embedding relation from the &amp;#8220;Service&amp;#8221;
   concept to the &amp;#8220;Message&amp;#8221; concept. We want to explicitly display the &amp;#8220;Message&amp;#8221;
   and &amp;#8220;DataContract&amp;#8221; concepts on another level than the other &amp;#8220;ServiceArtifact&amp;#8221;
   concepts. As you can see in the picture below of the &amp;#8220;ServiceDescription Explorer&amp;#8221;
   (part of the designer of this language), there are two child notes below the &amp;#8220;Service&amp;#8221;
   (CustomerService) concept. The &amp;#8220;Messages&amp;#8221; node as the root for the messages
   and datacontracts and the &amp;#8220;ServiceArtifacts&amp;#8221; node acting as the root for
   all other items. &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
   &lt;img src="http://www.edwardbakker.nl/content/binary/Demo1.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
   &amp;nbsp;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;&lt;font color=#000000&gt;Ideally
   we would have displayed the messages and datacontracts under the appropriate serviceoperation
   in the &amp;#8220;ServiceDescription Explorer&amp;#8221;, but to get that to work we needed
   some changes in the relations between the concepts. In our case this would result
   in concepts participating in more than one embedding relation which is not allowed
   in the current release of the DSL Toolkit. This will probably change in the next upcoming
   CTP build!?&lt;o:p&gt;&lt;/o:p&gt;
   &lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"&gt;
   &lt;span lang=EN-GB style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-ansi-language: EN-GB"&gt;
   &lt;o:p&gt;
      &lt;font color=#000000&gt;&amp;nbsp;&lt;/font